RuntimeError: Response truncated due to output length limit

用户在 vLLM 0.20.2rc1.dev49 上,使用 Gemma 4 模型(如 mlx-community/gemma-4-26B-A4B-it-OptiQ-4bit)通过 OpenAI 兼容 API 进行流式自动工具调用。具体触发条件是:启用 MTP 推测解码(speculative dec

RuntimeError: Response truncated due to output length limit

RuntimeError: Response truncated due to output length limit

快速结论:此报错通常发生在 vLLM 使用 Gemma 4 模型启用 MTP(Multi-Token Prediction)推测解码 + 流式输出 + 自动工具调用时,当单个 MTP 大小的流式 chunk 内包含多个工具调用边界时,解析器不能正确发出第二个工具调用的 delta,导致测试用例失败。优先排查当前 vLLM 版本是否已包含 #44741 的回归测试。

问题场景

用户在 vLLM 0.20.2rc1.dev49 上,使用 Gemma 4 模型(如 mlx-community/gemma-4-26B-A4B-it-OptiQ-4bit)通过 OpenAI 兼容 API 进行流式自动工具调用。具体触发条件是:启用 MTP 推测解码(speculative decoding with MTP)且streaming 开启,模型在一次推理步中输出多个工具调用的边界(tool_call 标记)。当流式 chunk 中同时包含第一个工具调用结束和第二个工具调用开始时,Gemma4ToolParser 只发出了 index 0 的 delta,漏掉了 index 1,导致工具调用参数缺失。

报错原文

FAILED tests/tool_parsers/test_gemma4_tool_parser.py::TestStreamingExtraction::test_streaming_mtp_chunk_with_multiple_tool_boundaries
E       assert {0} == {0, 1}

该断言失败意味着在单个流式 chunk 中,解析器只输出了 index 0 的 tool call delta,期望同时输出 index 0 和 index 1 的 delta。

原因分析

根本原因是 Gemma4ToolParser 在处理流式 MTP chunk 时,只在遇到第一个 <tool_call|> 边界时触发了 tool call delta 输出,但当 chunk 中紧接着出现第二个边界 <|tool_call> 时,解析逻辑没有将第二个工具调用的起始 delta 发出。具体而言,在单个 speculative/MTP-sized delta 内,文本片段为:

location:<|"|>Milano<|"|>}<tool_call|><|tool_call>call:getStationInfo{

解析器应能为 index 0 和 index 1 分别生成 tool call deltas,但实际只输出了 index 0。这可能是因为 parser 的状态机没有正确重置以处理同一 chunk 内的第二个工具调用开始标记。

环境排查

  • vLLM 版本:确认是否为 0.20.2rc1.dev49 或更早版本。据讨论,#45163 可能未完全修复此问题。
  • 模型:Gemma 4 系列(如 gemma-4-26B-A4B-it)。
  • 依赖:PyTorch 2.11.0+cu130,CUDA 13.0,Python 3.12.13。
  • 运行模式:是否启用了 MTP speculative decoding + auto-tool-choice + streaming。
  • 流式间隔(stream interval):报告中使用了 12 个 token 的间隔来复现此问题。

解决步骤

  1. 确认测试用例是否存在:检查 tests/tool_parsers/test_gemma4_tool_parser.py 中是否包含 test_streaming_mtp_chunk_with_multiple_tool_boundaries 测试。该测试由 #44741 引入,是复现此问题的关键回归测试。
  2. 可优先尝试:关闭 MTP 推测解码或将流式输出模式改为非流式(stream=False)。这是 Issue 中用户提到的最直接的工作区。
  3. 可优先尝试:降级或升级 vLLM 至包含完整修复的版本。当前 Issue 讨论指出 #45163 并未完全解决此特定场景,开发者认为 #44741 的回归测试仍需保留。
  4. 尝试修改 parser 逻辑:如果用户是开发者,可以参考 #44741 中的测试代码,修改 Gemma4ToolParser_process_tool_boundaries 方法,使其能够在单个 chunk 内处理多个连续的 <tool_call|><|tool_call> 标记,并为每个新开始的工具调用生成 delta。
  5. 更新依赖:确保 vLLM 安装版本包含最新的 parser 修复。可以关注 vllm-project/vllm 仓库的 Issue #41967 及相关 PR 的更新。

验证方法

运行回归测试以确认问题修复:python -m pytest tests/tool_parsers/test_gemma4_tool_parser.py::TestStreamingExtraction::test_streaming_mtp_chunk_with_multiple_tool_boundaries -v。如果测试通过(即断言 assert set(emitted_indices) == {0, 1} 成功),则说明问题已解决。也可以在流式工具调用的实际应用中验证:观察是否每个工具调用都获得了完整的 idtypefunction.namefunction.arguments 片段。

参考来源

vllm-project/vllm #41967

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

celebrityanime
celebrityanime
文章: 7952

发表回复

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