如何从 RetrievalQA 迁移到 LCEL 实现

近年来,随着自然语言处理技术的发展,Retrieval-Augmented Generation(RAG)已成为在大规模文本语料库中进行问答的流行方式。传统的 RetrievalQA 链是处理这些任务的一种方式。然而,随着需求的变化,许多开发者开始转向 LCEL 实现。一些切换到 LCEL 的优势包括更容易的自定义能力、更灵活的返回源文档的方法,以及对流式和异步操作的支持。

技术背景介绍

RetrievalQA 是一种结合了检索和生成的问答方法。通过从文档中检索相关信息,并利用生成模型来回答用户的问题,该方法在准确性与效率之间取得了良好的平衡。LCEL(LangChain Expression Language)是 LangChain 库中的一种更灵活的实现方式,可以更容易地处理复杂的文档处理任务。

核心原理解析

Switching to LCEL 提供了以下几个方面的改进:

  1. 自定义性: LCEL 允许开发者更细粒度地控制提示和文档格式化,而不必拘泥于预设参数。
  2. 返回源文档: LCEL 能够更便捷地处理和返回原始文档,满足需要证据支持的场景。
  3. 流处理和异步支持: 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 实现适用于需要高度定制化过程控制的场景,如要求响应速度快的交互式问答系统,以及需要异步处理大量数据的应用程序。

实践建议

  1. 评估需求: 在迁移到 LCEL 之前,确保您的项目确实需要其提供的灵活性。
  2. 代码封装: 利用 LCEL 的灵活性,将您的业务逻辑封装在函数中以便于复用。
  3. 性能优化: 在大规模应用中,请考虑异步实现以提高系统的响应速度。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值