轻松迁移:升级至LCEL实现的详细指南
在过去几年中,RetrievalQA链被广泛用于自然语言问答系统,在一个数据源之上执行检索增强生成(RAG)。然而,随着技术的进步,LCEL(LangChain Execution Layer)实现已经成为一个更为强大的选择。本文将详细讨论迁移至LCEL的优势及实现方法,提供实用指导和代码示例,帮助开发者快速上手。
迁移至LCEL的优势
- 更容易的定制化:LCEL提供了更灵活的定制选项,可以通过简单的参数调节配置提示词及文档格式。
- 更好地返回源文档:相比于传统的RetrievalQA链,LCEL更方便地返回用于回答问题的源文档。
- 支持可运行方法:LCEL支持流式处理和异步操作,这对于处理大规模或实时数据尤为重要。
LCEL与RetrievalQA的基本实现比较
在接下来的部分中,我们将使用相同的文档导入代码,将Lilain 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()
使用RetrievalQA链
在使用传统的RetrievalQA链时,我们通常这样设置:
from langchain import hub
from langchain.chains import RetrievalQA
# 提示词配置
prompt = hub.pull("rlm/rag-prompt")
# 构建QA链
qa_chain = RetrievalQA.from_llm(
llm, retriever=vectorstore.as_retriever(), prompt=prompt
)
response = qa_chain("What are autonomous agents?")
使用LCEL
LCEL实现允许我们更清晰地查看检索、格式化文档以及通过LLM进行处理的内部流程:
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?")
常见问题与解决方案
-
访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。
-
自定义复杂度:虽然LCEL实现提供了更高级的定制选项,但这可能导致更高的复杂度。建议使用封装函数来简化常用的组合逻辑。
总结与进一步学习资源
LCEL为开发者提供了更多的灵活性和功能,通过提供更细粒度的控制和可扩展性,使其成为RetrievalQA链的优秀替代品。建议阅读LangChain官方文档以获得更深入的了解。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—
70

被折叠的 条评论
为什么被折叠?



