[从RetrievalQA迁移到LCEL:提升自然语言问答能力的选择]

49 阅读2分钟
# 从RetrievalQA迁移到LCEL:提升自然语言问答能力的选择

## 引言

在自然语言处理领域,RetrievalQA是处理数据源问答的常用方法。然而,随着需求的变化和技术的进步,开发者可能考虑迁移到LCEL实现。本文将探讨这一迁移的好处,并提供详细的代码示例,帮助开发者更好地理解和使用LCEL实施问答系统。

## 主要内容

### 1. 为什么选择LCEL?

LCEL(LangChain Execution Language)提供了一些RetrievalQA无法媲美的特性:

- **更容易自定义**:LCEL中,提示和文档格式可以通过参数轻松配置。
- **灵活的文档返回**:能够轻松返回源文档。
- **支持可运行方法**:如流处理和异步操作。

### 2. 使用相同的文档加载代码

在开始之前,确保安装必要的库:

```bash
%pip install --upgrade --quiet langchain-community langchain langchain-openai faiss-cpu

加载Lilian Weng关于自主代理的博客文章到本地向量存储:

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

3. 使用RetrievalQA与LCEL的对比

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['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)

4. 挑战和解决方案

  • 过于详细的输出:LCEL可能产生详细的输出,可以通过自定义输出解析器来简化。
  • 复杂的组合逻辑:使用LCEL时,可能需要定义复杂的逻辑链,这可以通过封装功能模块化来简化。

总结和进一步学习资源

通过迁移到LCEL,开发者可以更灵活地定制问答系统,同时获得更佳的性能。建议阅读LCEL概念文档获取更多背景信息。

参考资料

  1. LangChain文档
  2. Lilian Weng's Blog

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

---END---