快速结论:当你在 LlamaIndex 0.14.0 至 0.14.24 之间使用 ContextChatEngine、CondenseQuestionChatEngine 或 CondensePlusContextChatEngine,并通过 astream_chat(...).async_response_gen() 或流式接口读取回复时,会发现流式输出失效,只收到 1 个 chunk;优先确认 llama-index 版本,并升级到 0.14.25。
适用环境:Issue 已确认工具为 LlamaIndex,触发版本为 >= 0.14.0,修复版本为 0.14.25;复现环境中使用了 OpenAIEmbedding、VectorStoreIndex 和 ContextChatEngine。Issue 未提供操作系统、Python 版本、CUDA、显卡或其他依赖版本信息。
最快修复方案:将 llama-index 升级到 0.14.25。该版本由维护者在评论中明确说明 “Fixed in 0.14.25”。
注意事项:该问题影响的是非结构化默认 program(output_cls=None)的流式输出路径;结构化 program 仍保持原有的“收集完成后一次性 yield”的行为。Issue 未验证降级到 0.13.6 之外的临时替代方案;如果暂时无法升级,可使用 0.13.6 验证是否为同一问题,但不建议长期停留在旧版本。
问题场景
用户在 LlamaIndex 0.14.0 及之后的版本中运行 ContextChatEngine、CondenseQuestionChatEngine 或 CondensePlusContextChatEngine,调用 astream_chat() 后通过 async_response_gen() 逐 token 读取回复。与 0.13.6 相比,流式输出不再逐块返回,而是整个回复只产生一次迭代,实际表现为 Looped over 1。
报错原文
[Bug]: Streaming responses broken since 0.14.0 for ContextChatEngine and similar classes
## Looped over 1
该 Issue 没有抛出异常或 traceback,核心现象是流式响应退化为单次返回。
原因分析
根因已由社区定位到 v0.14.0 的 refine 重构,集中在 response_synthesizers/refine.py,而 context.py、types.py、base.py、schema.py 与 v0.13.6 相比没有变化。
具体链路如下:
DefaultRefineProgram.astream_call/stream_call的非结构化分支(output_cls=None)被三个 chat engine 共用。该分支会把来自 LLM 的每个 token 累积到本地answer,直到流结束才 yield 一个StructuredRefineResponse。- 随后
_aupdate_response/_update_response把这个单元素 generator 交给_get_attribute_from_object_async_generator,后者将其耗尽,并在最后只 yield 一次。
因此,即使底层的 llm.astream_chat(...) 仍在流式输出,synthesizer 之上的调用方也只能收到一个 chunk。作为对比,v0.13.6 中的 _arefine_response_single 会直接透传 LLM 流,所以旧版流式正常。
环境排查
- 确认已安装的
llama-index版本,尤其是是否处于>= 0.14.0且小于 0.14.25。 - 确认是否使用
ContextChatEngine、CondenseQuestionChatEngine或CondensePlusContextChatEngine。 - 确认是否通过
astream_chat()配合async_response_gen()消费流式响应。 - 确认是否使用非结构化默认 refine program,即未指定
output_cls。 - Issue 未提供 Python、CUDA、PyTorch、显卡或操作系统信息,这些项目无需作为本问题的必要排查项。
解决步骤
- 查看当前 llama-index 版本:如果版本为
0.14.0到0.14.24,则可能命中该回归。 - 将 llama-index 升级到 0.14.25。维护者在 Issue 评论中明确说明 “Fixed in 0.14.25”,该版本修复了非结构化默认 program 的流式透传问题。
- 升级后重新运行最小复现代码,重点观察
tokens计数是否恢复为多次迭代,而不是1。 - 如果所在环境暂时不能升级到 0.14.25,可先用
llama-index == 0.13.6验证现象是否消失,以确认问题确实来自 0.14.x 的 refine 重构。
验证方法
使用 Issue 中的最小复现代码运行:调用 ContextChatEngine.from_defaults(...) 后执行 astream_chat("what is in the document?"),并统计 async_response_gen() 产生的 token 数量。在 0.13.6 下该数字通常为 10 到 100 数量级;在未修复的 0.14.x 下为 1。升级到 0.14.25 后,如果该数字恢复为多次迭代,并且终端输出呈现逐步流式打印,即可确认问题已解决。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: Databricks non-GPT models 400 with reasoning_effort must be a string when reasoning.summary is set](https://www.chat-gpts.plus/wp-content/uploads/2026/09/42347-6e601b9c-768x403.jpg)
![[Bug]: Admin UI model edit persists derived pricing; price-map reload then records Azure spend as $0`](https://www.chat-gpts.plus/wp-content/uploads/2026/09/40649-99c03ccc-768x403.jpg)
