[Bug]: Refine/CompactAndRefine streaming collapsed to a single chunk since 0.14.22 (#21374)

当你在 LlamaIndex 0.14.22 及以上版本中,用 Refine 或 CompactAndRefine 并设置 streaming=True 时,流式输出会退化成一次性返回单个 chunk。优先确认是否调用了受影响版本,并在能改动 response mode 的前提下先切到 TREE_S

快速结论:当你在 LlamaIndex 0.14.22 及以上版本中,用 RefineCompactAndRefine 并设置 streaming=True 时,流式输出会退化成一次性返回单个 chunk。优先确认是否调用了受影响版本,并在能改动 response mode 的前提下先切到 TREE_SUMMARIZESIMPLE_SUMMARIZE

适用环境:LlamaIndex 0.14.22、0.14.23、0.14.24;0.14.21 及更早为正常版本。Issue 中未提供操作系统、Python、CUDA 或显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 回复中明确说明四个相关 PR 均未合并,因此没有已验证的官方修复版本。可优先尝试的规避方案是:在你能够控制调用点的情况下,把 response mode 切换到 TREE_SUMMARIZESIMPLE_SUMMARIZE

注意事项:规避方案只适用于调用点可控的场景。CondensePlusContextChatEngine.astream_chat() 因为内部硬编码构建 CompactAndRefine,无法通过切换 response mode 解决;Issue 回复中给出的临时路径是绕过 synthesizer、直接对流式 LLM 使用检索到的上下文,但这一路径尚未被标记为已验证修复。

问题场景

触发场景是使用 LlamaIndex 的 RefineCompactAndRefine 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 正文定位为:由 #21374feat(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.pyastream_calloutput_cls 分支中,为了模拟结构化流式行为,先累积 answer 再产出,导致非结构化场景也走入了缓冲路径,最终只产出一个 chunk。Issue 回复进一步确认这是 multimodal synthesis 重构引入的两层缓冲问题,与 #22749、#22183 等报告同源。注意:原文提到 answer.strip() 会去掉尾部空格,影响拼接 chunk 的调用方。

环境排查

  • 确认 LlamaIndex 版本:0.14.220.14.230.14.24 均受影响;0.14.21 及更早正常。
  • 确认是否使用了 RefineCompactAndRefine,且 streaming=True
  • 确认是否使用 CondensePlusContextChatEngine.astream_chat(),它会间接触发 CompactAndRefine
  • Issue 未提供操作系统、Python 版本、CUDA、PyTorch 或显卡信息,这些不构成本问题的排查项。
  • 同步路径 stream_call 包含相同的 drain loop,行为一致,也需一并确认。

解决步骤

  1. 先复现并确认版本:在受影响版本上运行 Issue 提供的无 API key 复现脚本,观察 LLM deltas fed: 12chunks received 的对比。
  2. 若调用点可控,将 response mode 切换到 TREE_SUMMARIZESIMPLE_SUMMARIZE。Issue 回复说明这两种模式会直接返回 LLM stream,不受该问题影响。
  3. 若使用 CondensePlusContextChatEngine 且无法更改 response mode,Issue 回复建议的临时路径是绕过 synthesizer,直接对流式 LLM 使用检索到的上下文;该路径为 interim path,未标记为已验证修复。
  4. 关注 Issue 回复中列出的四个未合并 PR(#21758、#22750、#22754、#22788),它们都采用在非结构化分支绕过 structured drain path 的思路;在合并前不要将其视为可用修复。
  5. 如果上述 PR 停滞,Issue 回复表示欢迎提交 PR,报告者的复现脚本可作为回归测试参考。

验证方法

运行 Issue 中的复现脚本,确认在期望行为下 chunks received 为 12(每个 delta 一个 chunk),而不是 1。若采用切换 response mode 的规避方案,则观察对应 synthesizer 是否恢复按 token 产出 chunk,并检查拼接后文本是否保留了正确的边界空白。

参考来源

run-llama/llama_index #22831

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25306

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注