Skip to main content

从 RetrievalQA 迁移

RetrievalQA 链通过检索增强生成在数据源上执行自然语言问答。

切换到 LCEL 实现的一些优势包括:

  • 更容易自定义。诸如提示和文档格式化等细节仅通过 RetrievalQA 链中的特定参数进行配置。
  • 更容易返回源文档。
  • 支持可运行的方法,如流式和异步操作。

现在让我们并排查看它们。我们将使用相同的摄取代码将 Lilian Weng 的博客文章 关于自主代理加载到本地向量存储中:

%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu
import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()
# 加载文档
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores import FAISS
from langchain_openai.chat_models import ChatOpenAI
from langchain_openai.embeddings import OpenAIEmbeddings

loader = WebBaseLoader("https://lilianweng.github.io/posts/2023-06-23-agent/")
data = loader.load()

# 切分
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

# 存储切分
vectorstore = FAISS.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())

# LLM
llm = ChatOpenAI()

传统版

from langchain import hub
from langchain.chains import RetrievalQA

# 查看完整提示 https://smith.langchain.com/hub/rlm/rag-prompt
prompt = hub.pull("rlm/rag-prompt")

qa_chain = RetrievalQA.from_llm(
llm, retriever=vectorstore.as_retriever(), prompt=prompt
)

qa_chain("什么是自主代理?")
{'query': '什么是自主代理?',
'result': '自主代理是由大型语言模型(LLM)赋能的代理,能够处理复杂科学实验的自主设计、规划和执行。这些代理可以浏览互联网,阅读文档,执行代码,调用机器人实验 API,并利用其他 LLM。它们可以生成推理步骤,例如根据请求的任务开发新型抗癌药物。'}

LCEL

from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough

# 查看完整提示 https://smith.langchain.com/hub/rlm/rag-prompt
prompt = hub.pull("rlm/rag-prompt")


def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)


qa_chain = (
{
"context": vectorstore.as_retriever() | format_docs,
"question": RunnablePassthrough(),
}
| prompt
| llm
| StrOutputParser()
)

qa_chain.invoke("什么是自主代理?")
'自主代理是由大型语言模型(LLMs)赋能的代理,能够处理自主设计、规划和执行复杂任务,例如科学实验。这些代理可以使用工具浏览互联网,阅读文档,执行代码,调用机器人实验 API,并利用其他 LLM 来完成任务。当给定特定任务时,模型可以提出推理步骤,例如开发新型抗癌药物。'

LCEL 实现揭示了检索、格式化文档和将其传递给 LLM 的内部过程,但它更冗长。您可以在辅助函数中自定义和包装此组合逻辑,或使用更高级的 create_retrieval_chaincreate_stuff_documents_chain 辅助方法:

from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

# 查看完整提示 https://smith.langchain.com/hub/langchain-ai/retrieval-qa-chat
retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")

combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
rag_chain = create_retrieval_chain(vectorstore.as_retriever(), combine_docs_chain)

rag_chain.invoke({"input": "什么是自主代理?"})

下一步

查看 LCEL 概念文档 以获取更多背景信息。


此页面是否有帮助?


您还可以留下详细的反馈 在 GitHub 上