# 从RetrievalQA迁移到LCEL:提升自然语言问答能力的选择
## 引言
在自然语言处理领域,RetrievalQA是处理数据源问答的常用方法。然而,随着需求的变化和技术的进步,开发者可能考虑迁移到LCEL实现。本文将探讨这一迁移的好处,并提供详细的代码示例,帮助开发者更好地理解和使用LCEL实施问答系统。
## 主要内容
### 1. 为什么选择LCEL?
LCEL(LangChain Execution Language)提供了一些RetrievalQA无法媲美的特性:
- **更容易自定义**:LCEL中,提示和文档格式可以通过参数轻松配置。
- **灵活的文档返回**:能够轻松返回源文档。
- **支持可运行方法**:如流处理和异步操作。
### 2. 使用相同的文档加载代码
在开始之前,确保安装必要的库:
```bash
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu
加载Lilian Weng关于自主代理的博客文章到本地向量存储:
import os
from getpass import getpass
os.environ["OPENAI_API_KEY"] = getpass()
# Load docs
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()
# Split
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)
# Store splits
vectorstore = FAISS.from_documents(documents=all_splits, embedding=OpenAIEmbeddings())
# LLM
llm = ChatOpenAI()
3. 使用RetrievalQA与LCEL的对比
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
)
result = qa_chain("What are autonomous agents?")
print(result['result'])
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()
)
result = qa_chain.invoke("What are autonomous agents?")
print(result)
4. 挑战和解决方案
- 过于详细的输出:LCEL可能产生详细的输出,可以通过自定义输出解析器来简化。
- 复杂的组合逻辑:使用LCEL时,可能需要定义复杂的逻辑链,这可以通过封装功能模块化来简化。
总结和进一步学习资源
通过迁移到LCEL,开发者可以更灵活地定制问答系统,同时获得更佳的性能。建议阅读LCEL概念文档获取更多背景信息。
参考资料
- LangChain文档
- Lilian Weng's Blog
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---