流式响应(Streaming)
概念解释
流式响应是指在生成响应的过程中,逐步地将生成的部分结果返回给用户。这种方式允许用户在完整响应生成之前就开始处理或打印响应的开头部分,从而大大减少查询的感知延迟。
设置流式响应
要启用流式响应,你需要使用支持流式处理的 LLM。目前,流式处理支持 OpenAI、HuggingFaceLLM 以及大多数通过 LangChainLLM 的 LangChain LLMs。
注意:如果你选择的 LLM 不支持流式处理,将会引发 NotImplementedError
。
要使用高级 API 配置查询引擎以使用流式响应,可以在构建查询引擎时设置 streaming=True
:
query_engine = index.as_query_engine(streaming=True, similarity_top_k=1)
如果你使用低级 API 来组合查询引擎,则在构造响应合成器时传递 streaming=True
:
from llama_index.core import get_response_synthesizer
synth = get_response_synthesizer(streaming=True, ...)
query_engine = RetrieverQueryEngine(response_synthesizer=synth, ...)
流式响应
在正确配置了 LLM 和查询引擎之后,调用 query
现在会返回一个 StreamingResponse
对象:
streaming_response = query_engine.query(
"What did the author do growing up?",
)
响应会在 LLM 调用开始时立即返回,而无需等待完整完成。
注意:在查询引擎进行多次 LLM 调用的情况下,只有最后一次 LLM 调用会被流式处理,并且响应会在最后一次 LLM 调用开始时返回。
你可以从流式响应中获取一个生成器,并在令牌到达时进行迭代:
for text in streaming_response.response_gen:
# 在令牌到达时进行处理
pass
或者,如果你只想在令牌到达时打印文本:
streaming_response.print_response_stream()
端到端示例
以下是一个完整的示例,展示了如何设置和使用流式响应:
# 安装 LlamaIndex
!pip install llama-index
import logging
import sys
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
# 下载数据
!mkdir -p 'data/paul_graham/'
!wget 'https://raw.githubusercontent.com/run-llama/llama_index/main/docs/docs/examples/data/paul_graham/paul_graham_essay.txt' -O 'data/paul_graham/paul_graham_essay.txt'
# 加载文档并构建 VectorStoreIndex
documents = SimpleDirectoryReader("./data/paul_graham").load_data()
index = VectorStoreIndex.from_documents(documents)
# 设置查询引擎以使用流式响应
query_engine = index.as_query_engine(streaming=True, similarity_top_k=1)
# 查询索引
response_stream = query_engine.query(
"What did the author do growing up?",
)
# 打印流式响应
response_stream.print_response_stream()
在这个示例中,我们首先安装了 LlamaIndex,然后下载并加载了文档,构建了 VectorStoreIndex
。接着,我们配置了查询引擎以使用流式响应,并进行了查询。最后,我们使用 print_response_stream
方法打印了流式响应。
通过这种方式,用户可以在完整响应生成之前就开始处理或打印部分结果,从而提高查询的响应速度和用户体验。