llama_index [Bug]:如果SQLAutoVectorQueryEngine的verbose设置为on,则流式响应无法工作,

0wi1tuuw  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(36)

在使用 SQLAutoVectorQueryEngine 时,如果我设置了 verbose=True 并为其提供了一个带有 streaming = Truevector_query_tool ,返回的 StreamingResponse 不进行流式传输。
经过分析,我发现 response_gen 生成器在被查询引擎返回之前就被消耗掉了

if self._verbose:
    print_text(f"Query Engine response: {response}\n", color="pink")

这是因为 StreamingResponse__str__() 函数定义如下:如果 response_strNone ,则消耗生成器对象以显示内容。

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
roejwanj

roejwanj1#

要解决StreamingResponse通过SQLAutoVectorQueryEngineverbose=Truestreaming=True返回时,由于response_gen生成器在返回之前被消耗掉而导致无法流式传输的问题,你需要确保在返回生成器之前不消耗它。这可以通过避免在返回生成器之前对其进行任何操作来实现。

以下是一个可能的解决方案:

  1. 确保在返回生成器之前,不会对生成器的内容进行任何日志记录或打印操作。
  2. 直接返回生成器,而不对其进行迭代。

以下是如何修改_query_sql_other方法以避免消耗生成器的示例:

在这个例子中,生成器response_gen在返回之前没有被消耗掉,确保了流式传输功能按预期工作。

此外,请确保正确配置LLM和查询引擎以支持流式传输。根据LlamaIndex文档,需要使用支持流式的LLM并在构建查询引擎时设置streaming=True。以下是如何设置它的方法:

或者,如果使用低级API:

配置后,调用query将返回一个StreamingResponse对象,你可以像接收到的令牌一样迭代它们:

或者,你可以像接收到的文本一样打印它:

LlamaIndex中的StreamingResponse类专门用于处理流式响应。它包括诸如__str__get_responseprint_response_stream之类的方法,这些方法确保生成器不会过早被消耗。请确保适当使用这些方法以保持流式行为。以下是StreamingResponse类的相关部分:

此外,LlamaIndex中的StreamingGeneratorCallbackHandler类确保令牌正确流式传输。以下是类的相关部分:

遵循这些指南,可以确保StreamingResponse生成器不会过早被消耗,从而使流式传输功能按预期工作。

mpbci0fu

mpbci0fu2#

需要一些人类支持。

相关问题