Prhub

#38495 [CI] Fix SPLADE pooler test broken by #38139

原始 PR 作者 haosdent 合并时间 2026-03-30 15:48 文件变更 1 提交数 2 评论 2 代码增减 +8 / -4

执行摘要

修复 SPLADE 池化器测试因接口变更中断,使用真实 PoolingMetadata 替换模拟对象。

PR #38139向PoolingMetadata添加了get_prompt_token_ids_cpu()方法,但测试中使用的SimpleNamespace模拟缺少此方法,导致AttributeError和测试中断。使用真实的数据类可以防止未来接口变更带来的类似问题,如PR body所述。

建议测试维护者和相关开发者阅读此PR,以学习如何处理接口变更时的测试适配,并关注使用真实对象代替模拟的最佳实践。同时,注意gemini-code-assist[bot]提出的可变对象共享风险,考虑在未来测试代码中修复以避免潜在问题。

讨论亮点

gemini-code-assist[bot]在评论中高亮指出,使用[PoolingParams(task="embed")] * B创建pooling_params列表会导致所有元素共享同一个可变对象实例,如果修改其中一个,所有元素都会受影响,可能引发不可预见的副作用和难以调试的测试失败。建议使用列表推导式来创建独立实例,但最终代码未采纳此建议。noooop作为维护者批准了PR,未进一步讨论此问题。

实现拆解

实现集中在单个测试文件tests/models/language/pooling/test_splade_sparse_pooler.py中:

  1. 移除types模块的导入。
  2. 新增PoolingParams和PoolingMetadata的导入。
  3. 将meta对象从types.SimpleNamespace替换为PoolingMetadata实例,并初始化prompt_lens、prompt_token_ids、prompt_token_ids_cpu、pooling_params和pooling_states字段。
  4. pooling_params字段使用[PoolingParams(task="embed")] * B创建,而pooling_states使用列表推导式创建独立实例。
文件 模块 状态 重要度
tests/models/language/pooling/test_splade_sparse_pooler.py tests/models/language/pooling modified 4.0

关键符号

test_splade_pooler_matches_reference_formula

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

评论区精华

可变对象列表创建的风险 正确性

gemini-code-assist[bot] 指出使用列表乘法创建 PoolingParams 列表会导致对象共享,可能引发不可预见的副作用和难以调试的测试失败。

结论:建议使用列表推导式来创建独立实例,但代码中未修改,风险未被解决。 · 待处理

风险与影响

主要风险在于pooling_params列表的对象共享问题,可能导致测试中的副作用,影响测试的准确性和可重复性,如gemini-code-assist[bot]所指出。由于是测试代码变更,对生产系统无直接风险,但可能掩盖真实的代码缺陷。此外,变更涉及测试逻辑,确保正确性至关重要,以避免误报或漏报测试失败。

影响范围仅限于测试系统,提高了CI的稳定性和测试的健壮性,确保SPLADE池化器功能的验证可靠性。对于开发团队,减少了因接口变更导致的测试中断,提升了开发效率和代码质量。用户无直接影响,但间接受益于更稳定的测试覆盖。

潜在可变对象共享风险

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论