diff --git a/docs/docs/use_cases/question_answering/chat_history.ipynb b/docs/docs/use_cases/question_answering/chat_history.ipynb index 17b46504f27..93e9a1af1b3 100644 --- a/docs/docs/use_cases/question_answering/chat_history.ipynb +++ b/docs/docs/use_cases/question_answering/chat_history.ipynb @@ -403,16 +403,13 @@ "outputs": [], "source": [ "import bs4\n", - "from langchain import hub\n", "from langchain.chains import create_history_aware_retriever, create_retrieval_chain\n", "from langchain.chains.combine_documents import create_stuff_documents_chain\n", "from langchain_chroma import Chroma\n", "from langchain_community.chat_message_histories import ChatMessageHistory\n", "from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_core.chat_history import BaseChatMessageHistory\n", - "from langchain_core.output_parsers import StrOutputParser\n", "from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder\n", - "from langchain_core.runnables import RunnablePassthrough\n", "from langchain_core.runnables.history import RunnableWithMessageHistory\n", "from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n", diff --git a/libs/langchain/langchain/chains/conversational_retrieval/base.py b/libs/langchain/langchain/chains/conversational_retrieval/base.py index d033c3e099f..bead6f6d898 100644 --- a/libs/langchain/langchain/chains/conversational_retrieval/base.py +++ b/libs/langchain/langchain/chains/conversational_retrieval/base.py @@ -7,6 +7,7 @@ from abc import abstractmethod from pathlib import Path from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union +from langchain_core._api import deprecated from langchain_core.callbacks import ( AsyncCallbackManagerForChainRun, CallbackManagerForChainRun, @@ -233,9 +234,84 @@ class BaseConversationalRetrievalChain(Chain): super().save(file_path) +@deprecated( + since="0.1.17", + alternative=( + "create_history_aware_retriever together with create_retrieval_chain " + "(see example in docstring)" + ), + removal="0.3.0", +) class ConversationalRetrievalChain(BaseConversationalRetrievalChain): """Chain for having a conversation based on retrieved documents. + This class is deprecated. See below for an example implementation using + `create_retrieval_chain`. Additional walkthroughs can be found at + https://python.langchain.com/docs/use_cases/question_answering/chat_history + + .. code-block:: python + + from langchain.chains import ( + create_history_aware_retriever, + create_retrieval_chain, + ) + from langchain.chains.combine_documents import create_stuff_documents_chain + from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder + from langchain_openai import ChatOpenAI + + + retriever = ... # Your retriever + + llm = ChatOpenAI() + + # Contextualize question + contextualize_q_system_prompt = ( + "Given a chat history and the latest user question " + "which might reference context in the chat history, " + "formulate a standalone question which can be understood " + "without the chat history. Do NOT answer the question, just " + "reformulate it if needed and otherwise return it as is." + ) + contextualize_q_prompt = ChatPromptTemplate.from_messages( + [ + ("system", contextualize_q_system_prompt), + MessagesPlaceholder("chat_history"), + ("human", "{input}"), + ] + ) + history_aware_retriever = create_history_aware_retriever( + llm, retriever, contextualize_q_prompt + ) + + # Answer question + qa_system_prompt = ( + "You are an assistant for question-answering tasks. Use " + "the following pieces of retrieved context to answer the " + "question. If you don't know the answer, just say that you " + "don't know. Use three sentences maximum and keep the answer " + "concise." + "\n\n" + "{context}" + ) + qa_prompt = ChatPromptTemplate.from_messages( + [ + ("system", qa_system_prompt), + MessagesPlaceholder("chat_history"), + ("human", "{input}"), + ] + ) + # Below we use create_stuff_documents_chain to feed all retrieved context + # into the LLM. Note that we can also use StuffDocumentsChain and other + # instances of BaseCombineDocumentsChain. + question_answer_chain = create_stuff_documents_chain(llm, qa_prompt) + rag_chain = create_retrieval_chain( + history_aware_retriever, question_answer_chain + ) + + # Usage: + chat_history = [] # Collect chat history here (a sequence of messages) + rag_chain.invoke({"input": query, "chat_history": chat_history}) + This chain takes in chat history (a list of messages) and new questions, and then returns an answer to that question. The algorithm for this chain consists of three parts: diff --git a/libs/langchain/langchain/chains/llm.py b/libs/langchain/langchain/chains/llm.py index f1429028405..874cfa96fad 100644 --- a/libs/langchain/langchain/chains/llm.py +++ b/libs/langchain/langchain/chains/llm.py @@ -4,6 +4,7 @@ from __future__ import annotations import warnings from typing import Any, Dict, List, Optional, Sequence, Tuple, Union, cast +from langchain_core._api import deprecated from langchain_core.callbacks import ( AsyncCallbackManager, AsyncCallbackManagerForChainRun, @@ -34,9 +35,31 @@ from langchain_core.utils.input import get_colored_text from langchain.chains.base import Chain +@deprecated( + since="0.1.17", + alternative="RunnableSequence, e.g., `prompt | llm`", + removal="0.3.0", +) class LLMChain(Chain): """Chain to run queries against LLMs. + This class is deprecated. See below for an example implementation using + LangChain runnables: + + .. code-block:: python + + from langchain_core.prompts import PromptTemplate + from langchain_openai import OpenAI + + prompt_template = "Tell me a {adjective} joke" + prompt = PromptTemplate( + input_variables=["adjective"], template=prompt_template + ) + llm = OpenAI() + chain = prompt | llm + + chain.invoke("your adjective here") + Example: .. code-block:: python diff --git a/libs/langchain/langchain/chains/retrieval_qa/base.py b/libs/langchain/langchain/chains/retrieval_qa/base.py index 0a9eaafd6f1..6d030d6f11c 100644 --- a/libs/langchain/langchain/chains/retrieval_qa/base.py +++ b/libs/langchain/langchain/chains/retrieval_qa/base.py @@ -6,6 +6,7 @@ import warnings from abc import abstractmethod from typing import Any, Dict, List, Optional +from langchain_core._api import deprecated from langchain_core.callbacks import ( AsyncCallbackManagerForChainRun, CallbackManagerForChainRun, @@ -194,9 +195,41 @@ class BaseRetrievalQA(Chain): return {self.output_key: answer} +@deprecated(since="0.1.17", alternative="create_retrieval_chain", removal="0.3.0") class RetrievalQA(BaseRetrievalQA): """Chain for question-answering against an index. + This class is deprecated. See below for an example implementation using + `create_retrieval_chain`: + + .. code-block:: python + + from langchain.chains import create_retrieval_chain + from langchain.chains.combine_documents import create_stuff_documents_chain + from langchain_core.prompts import ChatPromptTemplate + from langchain_openai import ChatOpenAI + + + retriever = ... # Your retriever + llm = ChatOpenAI() + + system_prompt = ( + "Use the given context to answer the question. " + "If you don't know the answer, say you don't know. " + "Use three sentence maximum and keep the answer concise." + "\n\n{context}" + ) + prompt = ChatPromptTemplate.from_messages( + [ + ("system", system_prompt), + ("human", "{input}"), + ] + ) + question_answer_chain = create_stuff_documents_chain(llm, prompt) + chain = create_retrieval_chain(retriever, question_answer_chain) + + chain.invoke({"input": query}) + Example: .. code-block:: python