在使用 SQLAutoVectorQueryEngine
时,如果我设置了 verbose=True
并为其提供了一个带有 streaming = True
的 vector_query_tool
,返回的 StreamingResponse
不进行流式传输。
经过分析,我发现 response_gen
生成器在被查询引擎返回之前就被消耗掉了
if self._verbose:
print_text(f"Query Engine response: {response}\n", color="pink")
这是因为 StreamingResponse
的 __str__()
函数定义如下:如果 response_str
是 None
,则消耗生成器对象以显示内容。
def __str__(self) -> str:
"""Convert to string representation."""
if self.response_txt is None and self.response_gen is not None:
response_txt = ""
for text in self.response_gen:
response_txt += text
self.response_txt = response_txt
return self.response_txt or "None"
版本
0.10.40
重现步骤
from dotenv import load_dotenv
load_dotenv()
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(streaming=True)
response_stream = query_engine.query(
"What did the author do growing up?",
)
print(response_stream)
for text in response_stream.response_gen:
print(text)
相关日志/回溯
No output
2条答案
按热度按时间roejwanj1#
要解决
StreamingResponse
通过SQLAutoVectorQueryEngine
与verbose=True
和streaming=True
返回时,由于response_gen
生成器在返回之前被消耗掉而导致无法流式传输的问题,你需要确保在返回生成器之前不消耗它。这可以通过避免在返回生成器之前对其进行任何操作来实现。以下是一个可能的解决方案:
以下是如何修改
_query_sql_other
方法以避免消耗生成器的示例:在这个例子中,生成器
response_gen
在返回之前没有被消耗掉,确保了流式传输功能按预期工作。此外,请确保正确配置LLM和查询引擎以支持流式传输。根据LlamaIndex文档,需要使用支持流式的LLM并在构建查询引擎时设置
streaming=True
。以下是如何设置它的方法:或者,如果使用低级API:
配置后,调用
query
将返回一个StreamingResponse
对象,你可以像接收到的令牌一样迭代它们:或者,你可以像接收到的文本一样打印它:
LlamaIndex中的
StreamingResponse
类专门用于处理流式响应。它包括诸如__str__
、get_response
和print_response_stream
之类的方法,这些方法确保生成器不会过早被消耗。请确保适当使用这些方法以保持流式行为。以下是StreamingResponse
类的相关部分:此外,LlamaIndex中的
StreamingGeneratorCallbackHandler
类确保令牌正确流式传输。以下是类的相关部分:遵循这些指南,可以确保
StreamingResponse
生成器不会过早被消耗,从而使流式传输功能按预期工作。mpbci0fu2#
需要一些人类支持。