Prhub

#39253 [Bugfix] Fix GLM tool parser streaming with MTP or stream interval

vllm-project/vllm · 作者 sfeng33 · 合并时间 2026-04-13 13:10

分析状态 已生成
文件变更 4提交数 4 · 评论 20
代码增减 +788 / -416
tool-calling bugfix v1 model refactor

执行摘要

修复 GLM 工具解析器在流式推理和 MTP 推测解码下的参数格式错误。

根据Issue #34449,用户报告GLM-5-FP8模型在streaming推理时工具调用参数格式错误,特别是在stream_interval > 1或MTP speculative decoding启用时。PR body中明确指出,现有解析器在流式场景下无法正确处理参数,导致malformed/lost tool call arguments。

建议技术管理者和工程师精读此PR,以了解从状态机到无状态重新解析方法的设计权衡,重点关注_extract_content_build_args_json_so_far方法中的流式处理逻辑。

讨论亮点

Review中,gemini-code-assist[bot]指出了JSON解析的正确性问题:当部分参数值为非字符串类型(如数字或布尔值)时,无条件追加双引号可能导致无效JSON。作者sfeng33回应已修复此问题,讨论焦点集中在实现细节和正确性上,无其他争议。

实现拆解

关键改动包括:1. 在glm4_moe_tool_parser.py中重构extract_tool_calls_streaming方法,移除_buffer等状态变量,引入_sent_content_idx和重新解析逻辑,通过_extract_content处理非工具调用文本。2. 在utils.py中新增partial_tag_overlap函数,处理部分XML标签重叠以支持流式边界。3. 更新test_glm4_moe_tool_parser.pytest_glm47_moe_tool_parser.py测试文件,适配新逻辑并扩展覆盖streaming场景。

文件 模块 状态 重要度
vllm/tool_parsers/glm4_moe_tool_parser.py tool-parsers modified 8.0
vllm/tool_parsers/utils.py tool-parsers modified 6.0
tests/tool_parsers/test_glm4_moe_tool_parser.py testing modified 5.0
tests/tool_parsers/test_glm47_moe_tool_parser.py testing modified 5.0

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

关键符号

_extract_content _build_args_json_so_far extract_tool_calls_streaming partial_tag_overlap

评论区精华

JSON 解析正确性问题 正确性

gemini-code-assist[bot] 指出:当部分参数值为非字符串类型时,无条件追加双引号可能导致无效 JSON,例如 '<arg_value>42</tool_call>' 会被解析为 '"key": 42"}'。

结论:作者 sfeng33 回应已修复此问题,具体修复细节在代码中调整以正确判断值类型。 · 已解决

风险与影响

风险包括:1. 重构可能引入回归,影响现有GLM模型的工具调用功能,需确保测试覆盖充分。2. partial_tag_overlap函数需要正确处理各种标签边界情况,否则可能导致流式文本截断错误。3. 新方法依赖重新解析,在长文本或高频调用时可能带来轻微性能开销,但未在讨论中明确评估。

影响范围:使用GLM-4/5模型进行工具调用的用户,特别是在启用流式推理或MTP speculative decoding时。影响程度:修复了参数格式错误,提升了streaming下的功能完整性和用户体验,确保了模型推理的可靠性。对系统内部,重构简化了解析器状态管理,提高了代码可维护性。

核心路径变更 边界情况处理风险

关联 Issue

#34449 [Bug]: GLM-5-FP8 malformed tool calls

完整报告

执行摘要

  • 一句话:修复GLM工具解析器在流式推理和MTP推测解码下的参数格式错误。
  • 推荐动作:建议技术管理者和工程师精读此PR,以了解从状态机到无状态重新解析方法的设计权衡,重点关注_extract_content_build_args_json_so_far方法中的流式处理逻辑。

功能与动机

根据Issue #34449,用户报告GLM-5-FP8模型在streaming推理时工具调用参数格式错误,特别是在stream_interval > 1或MTP speculative decoding启用时。PR body中明确指出,现有解析器在流式场景下无法正确处理参数,导致malformed/lost tool call arguments。

实现拆解

关键改动包括:1. 在glm4_moe_tool_parser.py中重构extract_tool_calls_streaming方法,移除_buffer等状态变量,引入_sent_content_idx和重新解析逻辑,通过_extract_content处理非工具调用文本。2. 在utils.py中新增partial_tag_overlap函数,处理部分XML标签重叠以支持流式边界。3. 更新test_glm4_moe_tool_parser.pytest_glm47_moe_tool_parser.py测试文件,适配新逻辑并扩展覆盖streaming场景。

关键文件:

  • vllm/tool_parsers/glm4_moe_tool_parser.py(模块 tool-parsers): 核心解析器实现,重构了streaming逻辑,从有状态改为无状态重新解析方法
  • vllm/tool_parsers/utils.py(模块 tool-parsers): 新增partial_tag_overlap函数,用于处理流式中部分XML标签的重叠,支持边界情况
  • tests/tool_parsers/test_glm4_moe_tool_parser.py(模块 testing): 测试文件,扩展和更新了streaming场景测试,验证重构后的解析器行为
  • tests/tool_parsers/test_glm47_moe_tool_parser.py(模块 testing): 测试文件,针对GLM-4.7模型解析器的streaming测试更新

关键符号:_extract_content, _build_args_json_so_far, extract_tool_calls_streaming, partial_tag_overlap

评论区精华

Review中,gemini-code-assist[bot]指出了JSON解析的正确性问题:当部分参数值为非字符串类型(如数字或布尔值)时,无条件追加双引号可能导致无效JSON。作者sfeng33回应已修复此问题,讨论焦点集中在实现细节和正确性上,无其他争议。

  • JSON解析正确性问题 (correctness): 作者sfeng33回应已修复此问题,具体修复细节在代码中调整以正确判断值类型。

风险与影响

  • 风险:风险包括:1. 重构可能引入回归,影响现有GLM模型的工具调用功能,需确保测试覆盖充分。2. partial_tag_overlap函数需要正确处理各种标签边界情况,否则可能导致流式文本截断错误。3. 新方法依赖重新解析,在长文本或高频调用时可能带来轻微性能开销,但未在讨论中明确评估。
  • 影响:影响范围:使用GLM-4/5模型进行工具调用的用户,特别是在启用流式推理或MTP speculative decoding时。影响程度:修复了参数格式错误,提升了streaming下的功能完整性和用户体验,确保了模型推理的可靠性。对系统内部,重构简化了解析器状态管理,提高了代码可维护性。
  • 风险标记:核心路径变更, 边界情况处理风险

关联脉络

  • 暂无明显关联 PR

参与讨论