从RetrievalQA迁移到LCEL:提升问答系统的灵活性和性能
引言
随着自然语言处理技术的发展,RetrievalQA链在增强型生成问答中发挥了重要作用。然而,新的LCEL实现提供了更多的灵活性和可定制性。这篇文章将探讨从RetrievalQA到LCEL的迁移过程,并展示如何利用LCEL的优势实现更高效的问答系统。
主要内容
LCEL的优势
- 更易定制:LCEL提供了更灵活的参数配置来定制提示和文档格式。
- 更直接的源文档返回:LCEL允许更轻松地访问和返回源文档。
- 支持流和异步操作:LCEL的可运行方法支持流处理和异步操作,提升了系统的实时性。
RetrivalQA vs LCEL
让我们通过加载Lilian Weng关于自主代理的博客文章进行对比。
# 安装所需库
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu
import os
from getpass import getpass
# 设置OpenAI API密钥
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
# 使用API代理服务提高访问稳定性
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()
代码示例
以下是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)
# LCEL实现
qa_chain = (
{
"context": vectorstore.as_retriever() | format_docs,
"question": RunnablePassthrough(),
}
| prompt
| llm
| StrOutputParser()
)
# 执行查询
result = qa_chain.invoke("What are autonomous agents?")
print(result)
常见问题和解决方案
-
文档加载失败:尝试使用API代理服务以提高访问稳定性。
-
异步操作出错:确保所有相关库版本兼容,并阅读文档了解异步用法。
总结和进一步学习资源
迁移到LCEL可以提升问答系统的灵活性和性能。建议查看以下资源以更深入理解LCEL的工作原理:
参考资料
- LangChain 官方文档
- Lilian Weng 博客
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—