Prhub

#22549 Fix broken streaming response with --incremental-streaming-output

原始 PR 作者 kpham-sgl 合并时间 2026-04-13 06:05 文件变更 2 提交数 1 评论 5 代码增减 +93 / -1

执行摘要

修复 --incremental-streaming-output 流式响应文本乱码问题

根据PR body和关联Issue #22510,用户在使用--incremental-streaming-output参数时,所有模型的流式响应都会产生乱码文本(如"Helloeagesg")。Issue中报告Gemma模型出现"rge"、"age"、"eable"等错误分块,导致最终组装的消息不可用。根本原因是#21037(c37200f5e)变更后,tokenizer_manager在启用incremental_streaming_output时返回增量文本(state.text[last_text_offset:]),但serving_chat.py未相应更新,仍按累积缓冲区长度切片,产生垃圾片段。

该PR值得精读,尤其是理解增量流式与累积流式的设计差异。关注_generate_chat_stream中的条件判断逻辑,这是修复的核心。同时,回归测试展示了如何模拟增量流式场景,对测试编写有参考价值。

讨论亮点

Review中没有实质性技术讨论,两位reviewer(alexnails和JustinTong0323)均直接批准。PR body中详细分析了根本原因和修复方案,Issue #22510提供了具体的复现步骤和错误现象。

实现拆解

实现分为两个关键部分:

  1. 在python/sglang/srt/entrypoints/openai/serving_chat.py的_generate_chat_stream函数中,添加条件判断:当incremental_streaming_output启用时,直接使用content["text"]作为增量文本,否则按原逻辑切片。
  2. 在test/registered/openai_server/basic/test_serving_chat.py中添加test_incremental_streaming_output_delta回归测试,模拟增量流式场景并验证文本正确组装。
文件 模块 状态 重要度
python/sglang/srt/entrypoints/openai/serving_chat.py openai_server modified 8.0
test/registered/openai_server/basic/test_serving_chat.py openai_server_test modified 7.0

关键符号

_generate_chat_stream test_incremental_streaming_output_delta

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

增量流式文本组装逻辑修复 正确性

PR body 详细分析了根本原因:tokenizer_manager 在启用 incremental_streaming_output 时返回增量文本,但 serving_chat 仍按累积文本切片,导致乱码

结论:在 serving_chat 中添加条件判断,当 incremental_streaming_output 启用时直接使用 content["text"] 作为增量文本 · 已解决

风险与影响

风险较低但需注意:

  1. 核心路径变更:修改了流式响应的核心逻辑_generate_chat_stream,虽然变更简单,但涉及所有模型的流式输出,需确保非增量流式模式不受影响。
  2. 条件判断依赖server_args.incremental_streaming_output标志,需确保该标志在tokenizer_manager和serving_chat中一致。
  3. 回归测试覆盖了增量流式场景,但未测试混合模式(部分请求启用、部分禁用)的并发场景。

影响范围:

  1. 用户影响:修复后,所有使用--incremental-streaming-output参数的用户将获得正确的流式响应文本,消除乱码问题,提升用户体验。
  2. 系统影响:仅影响流式聊天响应的文本组装逻辑,不改变模型推理、调度等核心组件。
  3. 团队影响:作为关键bugfix,需尽快合并到主分支,避免影响生产环境。
核心路径变更 条件判断依赖外部标志

关联 Issue

#22510 [Bug] Streaming response returns broken in Gemma

完整报告

参与讨论