跳转到主要内容
manifest.json
判定器决定一个任务是否完成。它永远是一个引用,指向已经拥有那个答案的东西 —— 从不是平台自己 实现的东西。

三种 kind

这里有意没有第四种,特别是没有内置的那种。
这个仓库上一次长出内置打分器时,它写了自己的仿真管线和自己的权重,得出的判断和评测侧不一致,最后 被整体回滚。一个住在控制面里的判定器,不管开始时多小,都会是”什么算正确”的第二个定义,而这两个 定义会恰好在最要紧的时候不一致。

契约

不管哪种 kind,解析出来的判定器在平台这一侧长得一样:
两个参数:任务,以及 harness 提交的那份轨迹。一个返回值:奖励。
平台裁判按指定的那个 rubric 版本给轨迹打分。它收到任务的 prompt、拉平后的轨迹文本,以及任务 的 reference(如果有)。轨迹会替你拉平 —— 字符串还是字符串,message 对象贡献它的 content 或 text,列表会被拼接。 各家 harness 的形状不同,而判定器契约关心的是模型产出了什么,所以这个折叠在这里做一次,而不是 在每个作者的代码里做一遍。

判定失败是错误,永远不是零

你的判定器答不出来时 —— 端点挂了、模块 import 不了、rubric 没了 —— 平台会抛异常。它不会上报 0.0 的奖励。
这是任何写判定器的人最需要知道的一条规则,为什么值得说白:一个被静悄悄置零的奖励,和一个真的 答错了的回答完全无法区分。一次在第 400 步判定器悄悄坏掉的训练运行,会继续产出一条 reward 曲线、 继续看起来合理,并在剩下几个小时里用噪声教模型。 所以在你自己的判定器代码里:
错误会被包装成 VerificationError 并带上失败的那个引用,所以作业日志会点名是哪个判定器停下来、 以及为什么。

怎么选

确认成功

打印 manifest 声明的判定器。然后提交一次短跑,盯 Validation 标签页上的 reward 分布:对每条 rollout 都平在同一个值上的 reward 是一个返回常数的判定器,而它和一个模型完全做不到的任务看起来一模一样。

下一步

编写环境 · 编写评分标准 · 使用环境