快速结论:当你在 LlamaIndex 0.14.22 及以上版本中,用 Refine 或 CompactAndRefine 并设置 streaming=True 时,流式输出会退化成一次性返回单个 chunk。优先确认是否调用了受影响版本,并在能改动 response mode 的前提下先切到 TREE_SUMMARIZE 或 SIMPLE_SUMMARIZE。
适用环境:LlamaIndex 0.14.22、0.14.23、0.14.24;0.14.21 及更早为正常版本。Issue 中未提供操作系统、Python、CUDA 或显卡信息。
最快修复方案:暂无确认的一步修复方案。Issue 回复中明确说明四个相关 PR 均未合并,因此没有已验证的官方修复版本。可优先尝试的规避方案是:在你能够控制调用点的情况下,把 response mode 切换到 TREE_SUMMARIZE 或 SIMPLE_SUMMARIZE。
注意事项:规避方案只适用于调用点可控的场景。CondensePlusContextChatEngine.astream_chat() 因为内部硬编码构建 CompactAndRefine,无法通过切换 response mode 解决;Issue 回复中给出的临时路径是绕过 synthesizer、直接对流式 LLM 使用检索到的上下文,但这一路径尚未被标记为已验证修复。
问题场景
触发场景是使用 LlamaIndex 的 Refine 或 CompactAndRefine response synthesizer,并开启 streaming=True,期望像 0.14.21 那样按 LLM token 逐个返回 chunk。用户既可以自己构造 synthesizer,也可能通过 CondensePlusContextChatEngine.astream_chat() 间接触发,因为 llama_index/core/chat_engine/utils.get_response_synthesizer() 被硬编码为构建 CompactAndRefine。Issue 报告者是在 SSE 端点从数百个 token 事件变成一个事件、且自身没有锁定版本变化时发现的。
报错原文
[Bug]: Refine/CompactAndRefine streaming collapsed to a single chunk since 0.14.22 (#21374)
LLM deltas fed: 12
chunks received: 1
chunks: ['The torque spec is 4.2 Nm for panel screws. Use']
原因分析
Issue 正文定位为:由 #21374(feat(core): Multimodal synthesis,commit 38b5290a5)引入。该改动新增了 DefaultRefineProgram.stream_call / astream_call,并移除了 _agive_response_single / _arefine_response_single 原本直接返回的 response = await self._llm.astream(...)。在 llama_index/core/response_synthesizers/refine.py 的 astream_call 非 output_cls 分支中,为了模拟结构化流式行为,先累积 answer 再产出,导致非结构化场景也走入了缓冲路径,最终只产出一个 chunk。Issue 回复进一步确认这是 multimodal synthesis 重构引入的两层缓冲问题,与 #22749、#22183 等报告同源。注意:原文提到 answer.strip() 会去掉尾部空格,影响拼接 chunk 的调用方。
环境排查
- 确认 LlamaIndex 版本:
0.14.22、0.14.23、0.14.24均受影响;0.14.21及更早正常。 - 确认是否使用了
Refine或CompactAndRefine,且streaming=True。 - 确认是否使用
CondensePlusContextChatEngine.astream_chat(),它会间接触发CompactAndRefine。 - Issue 未提供操作系统、Python 版本、CUDA、PyTorch 或显卡信息,这些不构成本问题的排查项。
- 同步路径
stream_call包含相同的 drain loop,行为一致,也需一并确认。
解决步骤
- 先复现并确认版本:在受影响版本上运行 Issue 提供的无 API key 复现脚本,观察
LLM deltas fed: 12与chunks received的对比。 - 若调用点可控,将 response mode 切换到
TREE_SUMMARIZE或SIMPLE_SUMMARIZE。Issue 回复说明这两种模式会直接返回 LLM stream,不受该问题影响。 - 若使用
CondensePlusContextChatEngine且无法更改 response mode,Issue 回复建议的临时路径是绕过 synthesizer,直接对流式 LLM 使用检索到的上下文;该路径为 interim path,未标记为已验证修复。 - 关注 Issue 回复中列出的四个未合并 PR(#21758、#22750、#22754、#22788),它们都采用在非结构化分支绕过 structured drain path 的思路;在合并前不要将其视为可用修复。
- 如果上述 PR 停滞,Issue 回复表示欢迎提交 PR,报告者的复现脚本可作为回归测试参考。
验证方法
运行 Issue 中的复现脚本,确认在期望行为下 chunks received 为 12(每个 delta 一个 chunk),而不是 1。若采用切换 response mode 的规避方案,则观察对应 synthesizer 是否恢复按 token 产出 chunk,并检查拼接后文本是否保留了正确的边界空白。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


