langchain: deprecate LLMChain, RetrievalQA, and ConversationalRetrievalChain (#20751)

This commit is contained in:
ccurme
2024-04-23 15:55:34 -04:00
committed by GitHub
parent 30c7951505
commit 42de5168b1
4 changed files with 132 additions and 3 deletions

View File

@@ -403,16 +403,13 @@
"outputs": [], "outputs": [],
"source": [ "source": [
"import bs4\n", "import bs4\n",
"from langchain import hub\n",
"from langchain.chains import create_history_aware_retriever, create_retrieval_chain\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.chains.combine_documents import create_stuff_documents_chain\n",
"from langchain_chroma import Chroma\n", "from langchain_chroma import Chroma\n",
"from langchain_community.chat_message_histories import ChatMessageHistory\n", "from langchain_community.chat_message_histories import ChatMessageHistory\n",
"from langchain_community.document_loaders import WebBaseLoader\n", "from langchain_community.document_loaders import WebBaseLoader\n",
"from langchain_core.chat_history import BaseChatMessageHistory\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.prompts import ChatPromptTemplate, MessagesPlaceholder\n",
"from langchain_core.runnables import RunnablePassthrough\n",
"from langchain_core.runnables.history import RunnableWithMessageHistory\n", "from langchain_core.runnables.history import RunnableWithMessageHistory\n",
"from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n", "from langchain_openai import ChatOpenAI, OpenAIEmbeddings\n",
"from langchain_text_splitters import RecursiveCharacterTextSplitter\n", "from langchain_text_splitters import RecursiveCharacterTextSplitter\n",

View File

@@ -7,6 +7,7 @@ from abc import abstractmethod
from pathlib import Path from pathlib import Path
from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union from typing import Any, Callable, Dict, List, Optional, Tuple, Type, Union
from langchain_core._api import deprecated
from langchain_core.callbacks import ( from langchain_core.callbacks import (
AsyncCallbackManagerForChainRun, AsyncCallbackManagerForChainRun,
CallbackManagerForChainRun, CallbackManagerForChainRun,
@@ -233,9 +234,84 @@ class BaseConversationalRetrievalChain(Chain):
super().save(file_path) 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): class ConversationalRetrievalChain(BaseConversationalRetrievalChain):
"""Chain for having a conversation based on retrieved documents. """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, This chain takes in chat history (a list of messages) and new questions,
and then returns an answer to that question. and then returns an answer to that question.
The algorithm for this chain consists of three parts: The algorithm for this chain consists of three parts:

View File

@@ -4,6 +4,7 @@ from __future__ import annotations
import warnings import warnings
from typing import Any, Dict, List, Optional, Sequence, Tuple, Union, cast from typing import Any, Dict, List, Optional, Sequence, Tuple, Union, cast
from langchain_core._api import deprecated
from langchain_core.callbacks import ( from langchain_core.callbacks import (
AsyncCallbackManager, AsyncCallbackManager,
AsyncCallbackManagerForChainRun, AsyncCallbackManagerForChainRun,
@@ -34,9 +35,31 @@ from langchain_core.utils.input import get_colored_text
from langchain.chains.base import Chain from langchain.chains.base import Chain
@deprecated(
since="0.1.17",
alternative="RunnableSequence, e.g., `prompt | llm`",
removal="0.3.0",
)
class LLMChain(Chain): class LLMChain(Chain):
"""Chain to run queries against LLMs. """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: Example:
.. code-block:: python .. code-block:: python

View File

@@ -6,6 +6,7 @@ import warnings
from abc import abstractmethod from abc import abstractmethod
from typing import Any, Dict, List, Optional from typing import Any, Dict, List, Optional
from langchain_core._api import deprecated
from langchain_core.callbacks import ( from langchain_core.callbacks import (
AsyncCallbackManagerForChainRun, AsyncCallbackManagerForChainRun,
CallbackManagerForChainRun, CallbackManagerForChainRun,
@@ -194,9 +195,41 @@ class BaseRetrievalQA(Chain):
return {self.output_key: answer} return {self.output_key: answer}
@deprecated(since="0.1.17", alternative="create_retrieval_chain", removal="0.3.0")
class RetrievalQA(BaseRetrievalQA): class RetrievalQA(BaseRetrievalQA):
"""Chain for question-answering against an index. """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: Example:
.. code-block:: python .. code-block:: python