Prhub

#21785 Add CompletionSampler for non-chat eval in run_eval

原始 PR 作者 hnyls2002 合并时间 2026-04-01 07:33 文件变更 2 提交数 2 评论 2 代码增减 +85 / -3

执行摘要

新增 CompletionSampler,支持通过 /v1/completions API 进行非聊天模型评估。

根据 PR body,一些 CI 测试模型(如 DeepSeek-V3 INT8 量化检查点、基于 Llama-2 的 EAGLE 模型)通过 Completion API 在 GSM8K 上表现良好,但在 Chat API 下得分接近零。为了统一所有评估路径到 run_eval 以支持回归 CI,需要添加 Completion API 采样器。

建议工程团队精读此 PR,关注 CompletionSampler 的设计如何与现有 ChatCompletionSampler 集成,以及参数提取的优化方式。对于使用非聊天模型的开发者,此功能值得关注。

讨论亮点

没有 review 讨论,因此无讨论要点。

实现拆解

实现分为两个文件:1) simple_eval_common.py 中添加了 CompletionSampler 类,使用 client.completions.create() 发送原始文本提示,并跟踪完成令牌数。2) run_eval.py 中新增 --api 参数(选项 'chat' 或 'completion'),在 run_eval_once 函数中根据参数选择采样器。第二个提交提取了公共参数以避免重复代码。

文件 模块 状态 重要度
python/sglang/test/simple_eval_common.py test modified 8.0
python/sglang/test/run_eval.py test modified 7.0

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

关键符号

CompletionSampler.__init__ CompletionSampler.__call__ run_eval_once run_eval

评论区精华

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

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

风险与影响

风险包括:1) API 兼容性:Completion API 可能不支持某些模型参数,如 reasoning_effort,在 CompletionSampler 中未处理。2) 错误处理:CompletionSampler.__call__ 中对 BadRequestError 和其他异常的捕获可能导致返回空字符串,影响评估准确性。3) 测试覆盖:PR body 中提到测试计划,但未提供具体测试代码,需确保新功能经过充分验证。

影响范围:1) 用户:模型评估者和开发者现在可以使用 Completion API 进行非聊天评估,提高特定模型的评估准确性。2) 系统:统一了评估路径,减少了维护多个评估脚本的需要。3) 团队:简化 CI 回归测试,确保评估一致性。影响程度中等,主要限于评估工具。

API 兼容性风险 错误处理可能不完整 测试覆盖待验证

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

本 PR 新增了 CompletionSampler 类,使模型评估工具能通过 OpenAI 的 /v1/completions API 进行非聊天评估,解决了某些模型在 Chat API 下性能下降的问题,并统一了所有评估路径到 run_eval,便于 CI 回归测试。该变更属于有意义的功能改进,影响范围有限,但需注意 API 兼容性和错误处理风险。

功能与动机

根据 PR body 描述,动机源于某些 CI 测试模型(如 DeepSeek-V3 INT8 量化检查点、Llama-2-based EAGLE 模型)在 GSM8K 评估中通过 Completion API 表现良好,但在 Chat API 下因聊天模板包装得分接近零。为了将所有评估路径统一到 run_eval 以支持回归 CI,需要添加一个 Completion API 采样器。

实现拆解

实现方案包括两个关键文件修改:

  • python/sglang/test/simple_eval_common.py:新增 CompletionSampler 类,使用 client.completions.create() 发送原始文本提示,代码示例:
    def __call__(self, message_list: MessageList) -> str:
        prompt = "\n".join(
            msg["content"]
            for msg in message_list
            if isinstance(msg.get("content"), str)
        )
        response = self.client.completions.create(
            model=self.model,
            prompt=prompt,
            temperature=self.temperature,
            top_p=self.top_p,
            max_tokens=self.max_tokens,
        )
    
  • python/sglang/test/run_eval.py:新增 --api 参数(默认 'chat',选项为 'chat' 或 'completion'),在 run_eval_once 函数中根据参数选择采样器。第二个提交提取了公共参数(如 model、max_tokens)以避免代码重复。

评论区精华

没有 review 讨论,因此无讨论要点。

风险与影响

  • 技术风险:Completion API 可能不支持某些模型参数(如 reasoning_effort),CompletionSampler.__call__ 中对异常的捕获可能返回空字符串,影响评估准确性;测试计划未包含具体代码,需验证功能覆盖。
  • 影响范围:用户(模型评估者)可更准确地评估非聊天模型;系统减少了评估脚本维护复杂度;团队通过统一路径提升了 CI 测试效率。影响程度中等,主要限于评估工具模块。

关联脉络

从近期历史 PR 分析中,本 PR 与 #21751(修复 CI 环测试超时)和 #21753(优化 CI 重测试检测)相关,因为它们都关注 CI 测试的稳定性和功能增强,反映了团队在提升评估和测试一致性方面的持续努力。

参与讨论