Prhub

#22624 [Test] Fix flaky test_function_call_specific by adding strict=True

sgl-project/sglang · 作者 JustinTong0323 · 合并时间 2026-04-12 16:22

分析状态 已生成
文件变更 1提交数 1 · 评论 3
代码增减 +1 / -0
bugfix test run-ci deepseek

执行摘要

修复工具调用测试的随机失败问题,通过添加 strict=True 确保参数模式强制约束。

PR body明确指出,在#21593之后,tool_choice指定具体函数时,如果没有strict=True参数,系统只会保证生成工具调用,但参数生成是尽力而为的(没有参数模式的约束解码)。在Llama-3.2-1B模型上,当temperature=0.8时,这导致约30%的随机失败率,模型会生成空的{}参数,导致assertIn("city", args_obj)断言失败。PR #22586已经修复了test_function_call_required测试用例的类似问题,本PR是补充修复test_function_call_specific测试用例。

这是一个简单的测试修复,无需深入阅读。值得关注的是它揭示了工具调用协议中strict参数的重要性,以及小模型在非严格模式下可能产生不符合参数模式的输出。对于理解工具调用测试的设计和约束解码机制有一定参考价值。

讨论亮点

review讨论非常有限,只有gemini-code-assist[bot]的自动评论,指出这是一个确保测试覆盖严格模式的修改,但没有实质性的技术讨论。从PR body和关联Issue可以看出,这个修复是基于PR #22586的相同模式,两者都针对#21593引入的协议语义变更导致的测试不稳定问题。

实现拆解

实现非常简单,仅在test/registered/openai_server/function_call/test_openai_function_calling.py文件的test_function_call_specific测试用例中,为get_weather工具的定义添加了"strict": True参数。这个单行变更确保了在工具调用测试中,参数模式会被强制约束,防止模型生成不符合参数模式的空参数。

文件 模块 状态 重要度
test/registered/openai_server/function_call/test_openai_function_calling.py 测试 /OpenAI 服务器 modified 3.0

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

关键符号

test_function_call_specific

评论区精华

strict 参数对工具调用测试的影响 正确性

PR body 解释了为什么需要添加 strict=True:在 #21593 之后,tool_choice 指定具体函数时,如果没有 strict=True,参数生成是尽力而为的,没有约束解码,导致小模型可能生成空参数。

结论:添加 strict=True 确保参数模式被强制约束,修复了测试的随机失败问题。 · 已解决

与历史 PR 的关联 测试

本 PR 是 PR #22586 的补充修复,两者都针对 #21593 引入的协议语义变更导致的测试不稳定问题。

结论:遵循相同的修复模式,为工具定义添加 strict=True 参数。 · 已解决

风险与影响

风险极低。这是一个测试文件的单行修改,仅添加了一个strict=True参数,不会影响生产代码。变更范围非常有限,只影响特定的测试用例。主要风险是如果strict=True参数的行为在未来发生变化,可能会影响测试的预期行为,但这种可能性很小。

影响范围仅限于测试稳定性。修复后,test_function_call_specific测试用例的随机失败率从约30%降至0%,提高了CI的可靠性。对用户、系统或团队的其他方面没有直接影响。这是对测试基础设施的维护性改进。

测试覆盖不足

关联 Issue

#22586 [Test] Fix flaky `test_function_call_required` by adding `strict=True`

完整报告

执行摘要

该PR修复了test_function_call_specific测试用例的随机失败问题,通过为get_weather工具添加strict=True参数,确保在tool_choice指定具体函数时参数模式被强制约束。这是对PR #22586的补充修复,解决了因#21593引入的协议语义变更导致的测试不稳定性问题,将测试失败率从约30%降至0%,提高了CI可靠性。

功能与动机

问题根源:在PR #21593之后,tool_choice指定具体函数时,如果没有strict=True参数,系统只会保证生成工具调用,但参数生成是尽力而为的(没有参数模式的约束解码)。

具体表现:在Llama-3.2-1B模型上,当temperature=0.8时,这导致约30%的随机失败率,模型会生成空的{}参数,导致assertIn("city", args_obj)断言失败。

修复动机:PR #22586已经修复了test_function_call_required测试用例的类似问题,本PR是补充修复test_function_call_specific测试用例,确保测试稳定性。PR body提供了详细的证据:

  • 在#21593之前:10/10通过
  • 在#21593之后:7/10通过(30%失败)
  • 本修复后:11/11通过

实现拆解

实现非常简单,仅修改了一个文件的一行代码:

文件路径 变更内容 影响
test/registered/openai_server/function_call/test_openai_function_calling.py test_function_call_specific测试用例中,为get_weather工具定义添加"strict": True参数 确保参数模式被强制约束,防止模型生成空参数

关键代码片段:

{
    "type": "function",
    "function": {
        "name": "get_weather",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string"}
            },
            "required": ["city"],
        },
        "strict": True, # 新增行
    },
}

评论区精华

review讨论非常有限,只有gemini-code-assist[bot]的自动评论:

"This pull request updates the test_openai_function_calling.py file by adding the 'strict': True parameter to a function definition schema within a test case. This modification ensures that the test covers the strict mode for OpenAI function calling."

从PR body和关联Issue可以看出,这个修复是基于PR #22586的相同模式,两者都针对#21593引入的协议语义变更导致的测试不稳定问题。

风险与影响

技术风险

  • 风险极低,仅修改测试文件,不影响生产代码
  • 如果strict=True参数的行为在未来发生变化,可能会影响测试的预期行为,但这种可能性很小

影响分析

  • 测试稳定性:修复后,test_function_call_specific测试用例的随机失败率从约30%降至0%
  • CI可靠性:提高了持续集成测试的可靠性
  • 用户影响:对最终用户没有直接影响
  • 系统影响:不改变系统功能或性能

关联脉络

与历史PR的关系

  1. PR #22586:直接前驱,修复了同一个测试文件中的test_function_call_required测试用例的相同问题
  2. PR #21593:根本原因,引入了协议语义变更,导致tool_choice指定具体函数时,如果没有strict=True,参数生成变为尽力而为

演进趋势

  • 这反映了工具调用协议中strict参数的重要性逐渐被认识
  • 小模型在非严格模式下可能产生不符合参数模式的输出,需要通过测试约束来保证可靠性
  • 测试用例需要与协议语义变更保持同步,避免因协议更新导致的测试不稳定

跨PR模式

  • 这是第二个修复工具调用测试随机失败的PR,表明团队正在系统性地解决#21593引入的测试回归问题
  • 类似的修复模式(添加strict=True)可能还需要应用到其他相关的测试用例中

参与讨论