[在RAG应用中流式传输结果的实用指南]

85 阅读2分钟

在RAG应用中流式传输结果的实用指南

引言

流式传输是增强RAG(检索增强生成)应用性能的一种强大方法。通过流式传输,你可以实时获得生成的结果,并逐步查看应用程序的执行过程。在本文中,我们将探讨如何从一个RAG应用流式传输结果,涵盖最终输出和链的中间步骤。

主要内容

依赖项设置

我们将在本指南中使用OpenAI嵌入和Chroma向量存储。首先,安装所需的包:

%pip install --upgrade --quiet langchain langchain-community langchainhub langchain-openai langchain-chroma bs4

环境变量设置

确保设置你的OPENAI_API_KEY环境变量,可以通过直接设置或从.env文件加载:

import os
import getpass

os.environ["OPENAI_API_KEY"] = getpass.getpass()  # 输入API密钥

使用LangSmith进行链调试

LangSmith可以帮助你检视复杂应用内部的运行过程。如果使用LangSmith,需设置如下环境变量:

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()  # 输入LangSmith API密钥

构建RAG链

我们将创建一个通过查询重写和检索增强的问答应用:

from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_chroma import Chroma
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载并分块索引文档内容
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs={"parse_only": bs4.SoupStrainer(class_=("post-content", "post-title", "post-header"))},
)
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(docs)
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings())
retriever = vectorstore.as_retriever()

# 构建问答链
system_prompt = "You are an assistant for question-answering tasks. Use the following pieces of retrieved context to answer the question."
prompt = ChatPromptTemplate.from_messages([("system", system_prompt), ("human", "{input}")])
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

代码示例

流式传输应用中结果的代码示例:

# 使用API代理服务提高访问稳定性
for chunk in rag_chain.stream({"input": "What is Task Decomposition?"}):
    if answer_chunk := chunk.get("answer"):
        print(f"{answer_chunk}|", end="")

常见问题和解决方案

  1. 网络限制问题:某些地区可能无法直接访问API,考虑使用API代理服务提高访问稳定性。

  2. 流式传输性能问题:如果流式传输速度较慢,可以优化网络连接或使用更高效的算法进行分块。

总结和进一步学习资源

通过流式传输RAG应用的结果,你可以实时查看生成过程的每一个步骤,为调试和优化提供了巨大的便利。如果你想深入学习流式传输技术,以下资源可能会对你有所帮助:

参考资料

结束语:

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

---END---