近年来,随着自然语言处理技术的发展,Retrieval-Augmented Generation(RAG)已成为在大规模文本语料库中进行问答的流行方式。传统的 RetrievalQA
链是处理这些任务的一种方式。然而,随着需求的变化,许多开发者开始转向 LCEL 实现。一些切换到 LCEL 的优势包括更容易的自定义能力、更灵活的返回源文档的方法,以及对流式和异步操作的支持。
技术背景介绍
RetrievalQA 是一种结合了检索和生成的问答方法。通过从文档中检索相关信息,并利用生成模型来回答用户的问题,该方法在准确性与效率之间取得了良好的平衡。LCEL(LangChain Expression Language)是 LangChain 库中的一种更灵活的实现方式,可以更容易地处理复杂的文档处理任务。
核心原理解析
Switching to LCEL 提供了以下几个方面的改进:
- 自定义性: LCEL 允许开发者更细粒度地控制提示和文档格式化,而不必拘泥于预设参数。
- 返回源文档: LCEL 能够更便捷地处理和返回原始文档,满足需要证据支持的场景。
- 流处理和异步支持: LCEL 提供了可以运行的方法,例如流式处理和异步操作,更加适合现代应用程序的需求。
代码实现演示
以下代码演示了如何使用 LCEL 实现问答,并与传统的 RetrievalQA 进行对比。
准备工作
首先,我们需要安装必要的库:
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu
准备数据:
import os
from getpass import getpass
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
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 = ChatOpenAI()
使用传统的 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)
使用 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)
应用场景分析
LCEL 实现适用于需要高度定制化过程控制的场景,如要求响应速度快的交互式问答系统,以及需要异步处理大量数据的应用程序。
实践建议
- 评估需求: 在迁移到 LCEL 之前,确保您的项目确实需要其提供的灵活性。
- 代码封装: 利用 LCEL 的灵活性,将您的业务逻辑封装在函数中以便于复用。
- 性能优化: 在大规模应用中,请考虑异步实现以提高系统的响应速度。
如果遇到问题欢迎在评论区交流。
—END—