[Bug]: Streaming responses broken since 0.14.0 for ContextChatEngine and similar classes

这个报错通常出现在使用 LlamaIndex ContextChatEngine 、 CondenseQuestionChatEngine 或 CondensePlusContextChatEngine 进行流式对话时:调用 astream_chat() 或 stream_chat() 后,异步/同

快速结论:这个报错通常出现在使用 LlamaIndex ContextChatEngineCondenseQuestionChatEngineCondensePlusContextChatEngine 进行流式对话时:调用 astream_chat()stream_chat() 后,异步/同步生成器只产出 1 个完整响应块,而不是逐 token 流式返回。优先排查 LlamaIndex 版本是否落在 >= 0.14.0< 0.14.25 区间。

适用环境:Issue 中确认的工具为 LlamaIndex(llama-index);涉及 Python 异步代码与 llama_index.embeddings.openai.OpenAIEmbedding;触发版本为 >= 0.14.0,已在 0.14.25 修复。Issue 未明确给出操作系统、CUDA、显卡或具体 Python 版本。

最快修复方案:升级到 llama-index == 0.14.25 或更高版本。Issue 摘要明确说明 FIxed in 0.14.25,根因修复由 PR #22788 合入。

注意事项:若暂时无法升级,只能继续停留在 0.13.6 或等待/回移对应修复;Issue 中未给出其他已验证的临时绕过写法。另外,结构化输出(output_cls 不为 None)的合成器仍保持“收集完再一次性产出”的既有契约,不应误认为结构化输出也应逐 token 流式返回。

问题场景

用户在 LlamaIndex 中使用 ContextChatEngine(或 CondenseQuestionChatEngineCondensePlusContextChatEngine)并调用流式接口 astream_chat() / stream_chat() 时,期望通过 response.async_response_gen() 逐 token 拿到输出。实际表现为:底层 llm.astream_chat(...) 仍然在流式产出,但上层只收到一个完整响应块。回退到 llama-index == 0.13.6 时,流式正常,循环计数通常在 10–100 量级;升级到 >= 0.14.0 后,循环计数变成 1。

报错原文

[Bug]: Streaming responses broken since 0.14.0 for ContextChatEngine and similar classes

## Looped over 1

原因分析

根因定位在 v0.14.0 的 refine 重构,集中在 response_synthesizers/refine.py;对比 v0.13.6,context.pytypes.pybase.pyschema.py 没有变化。

  1. DefaultRefineProgram.astream_call/stream_call 的非结构化分支(output_cls=None,正是这三个 chat engine 使用的分支)会把 LLM 的每一个 token 累积到本地 answer,待流结束后只 yield 一个 StructuredRefineResponse
  2. 随后 _aupdate_response/_update_response 把这个单元素生成器交给 _get_attribute_from_object_async_generator,后者将其耗尽并在最后只 yield 一次。

因此即使 llm.astream_chat(...) 仍在流式返回,合成器之上的所有调用方只能拿到一个块。在 v0.13.6 中,_arefine_response_single 会把 LLM 流直接透传,这就是旧版本流式正常的原因。

环境排查

  • 确认 llama-index 版本:问题触发区间为 >= 0.14.0,修复版本为 0.14.25
  • 确认是否使用 ContextChatEngineCondenseQuestionChatEngineCondensePlusContextChatEngine
  • 确认调用的是流式接口(astream_chat / stream_chat)以及 response.async_response_gen() 的使用方式。
  • 确认是否涉及结构化输出(output_cls);本次回归仅影响非结构化分支。
  • Issue 未提供操作系统、Python、CUDA、PyTorch、显卡等环境信息,这些项无需作为排查重点。

解决步骤

  1. 查看当前 LlamaIndex 版本,确认是否处于 >= 0.14.0 且低于 0.14.25。若不在该区间,本 Issue 的结论大概率不适用。
  2. llama-index 升级到 0.14.25 或更高版本。该修复由 PR #22788 合入,核心改动是:
  3. 让非结构化 default program 在 token 到达时直接 yield 原始 delta;
  4. _update_response/_aupdate_response 原样透传该生成器;
  5. 结构化 program 保持原有“先排空、再一次性 yield”的契约不变。
  6. 如果必须停留在受影响版本,可优先尝试回退到 0.13.6 作为临时规避;注意这只是版本回退,并非 Issue 中验证过的修复路径。
  7. 注意测试侧的回归:Issue 提到 chat-engine 测试曾固定了该回归行为(assert num_iters == 1),修复后已改为要求增量交付。如果本地有类似断言,需要同步更新。

验证方法

使用 Issue 提供的复现脚本运行:调用 await chat_engine.astream_chat("what is in the document?"),再用 async for token in response.async_response_gen() 统计 token 数。若输出恢复逐 token 打印、且 ## Looped over 的数量回到 10–100 量级(而非 1),说明流式已恢复。也可直接断言循环次数大于 1,或观察打印内容是否在响应完成前逐步出现。

参考来源

run-llama/llama_index #22749

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25309

发表回复

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