Prhub

#31957 fix(vlm): reject Moss vision metadata mismatches

原始 PR 作者 mickqian 合并时间 2026-07-29 07:09 文件变更 2 提交数 3 评论 3 代码增减 +98 / -12

执行摘要

拒绝 Moss-VL 视觉元数据与 token 计数不匹配

_compute_vision_position_ids 之前使用 min 取元数据和 token 计数的小值,并在任一方为零时提前返回,静默构建部分或空的 vision 位置元数据,掩盖了上游数据不匹配的问题,可能导致推理结果异常。PR body 明确要求 'require Moss-VL vision frame metadata to map one-to-one to image tokens'。

此 PR 值得精读,是典型「静默失败 → 快速失败」的改进实践,展示了 fail-closed 的设计决策。测试覆盖了异常的多种边界,可作同类修复的参考。

讨论亮点

无 review 评论,仅作者提交后触发了 CI 并合并。

实现拆解

  1. python/sglang/srt/multimodal/processors/moss_vl.py_compute_vision_position_ids 方法中,将原 if len(flat_eff_h) == 0 or len(image_token_indices) == 0 的提前返回逻辑改为先计算 frame_countimage_token_count,当两者不等时直接抛出 ValueError(含具体计数信息)。
  2. 移除 num_matches = min(...) 及后续切片,改为直接使用完整的 flat_eff_hflat_eff_wflat_vis_startsimage_token_indices,因为现在已保证计数一致。
  3. 新增 test/registered/unit/models/test_moss_vl_processor.py 测试文件,通过参数化测试覆盖 frame_count 多于、少于、等于 token 数以及正整数匹配的场景,验证正确行为和拒绝行为。
文件 模块 状态 重要度
python/sglang/srt/multimodal/processors/moss_vl.py 多模态处理器 modified 7.15
test/registered/unit/models/test_moss_vl_processor.py 测试 added 7.31

关键符号

_compute_vision_position_ids

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

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

核心风险在于调用方未处理 _compute_vision_position_ids 可能抛出的 ValueError,导致整个请求处理中断。但鉴于上游应该是内部调用,该异常会沿调用栈传播到请求处理入口,返回 500 错误,比静默错误更安全。此外,if frame_count == 0 的提前返回路径保留,仅当两者同为 0 时跳过计算,逻辑正确。无性能退化,只是将 min+切片 替换为简单比较。

影响范围限定在 Moss-VL 模型视觉处理路径。对于正常的匹配数据,行为不变。对于不匹配的请求,之前可能构建错误位置编码,现在会直接报错拒绝请求,让用户发现数据准备问题。对系统整体稳定性和可调试性有正面影响。

核心路径变更 错误处理变更 测试覆盖新增

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论