在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="")
常见问题和解决方案
-
网络限制问题:某些地区可能无法直接访问API,考虑使用API代理服务提高访问稳定性。
-
流式传输性能问题:如果流式传输速度较慢,可以优化网络连接或使用更高效的算法进行分块。
总结和进一步学习资源
通过流式传输RAG应用的结果,你可以实时查看生成过程的每一个步骤,为调试和优化提供了巨大的便利。如果你想深入学习流式传输技术,以下资源可能会对你有所帮助:
参考资料
- Weng, L. (2023). LLM Powered Autonomous Agents.
- LangChain 官方文档
结束语:
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---