用labeled测试集验证prompt效果,每个pipeline携带输入/期望对,最大文本pipeline含3900个案例;用模型做裁判时通过交换AB顺序消除位置偏差,约11%判决不通过交换验证。
Prompt 的改动曾经靠感觉发布:跑三个例子,看起来更好,合并。然后一个"小小的措辞改进"悄悄破坏了一个流水线的数字格式化,持续了四天。现在 prompt 就是代码,代码没有测试就不能合并。
每个流水线都携带一组带标签的输入/预期对。没有人坐下来刻意编写它;它是逐渐累积的,每起事故一个 case,每个测试都是系统曾经出丑的方式。我们最大的文本流水线目前在每次改动时运行约 3,900 个 case,预期失败数恰好为零。零是不可妥协的。一个容忍少量失败的测试套件没有人会去看。
我们的 case 有一半没有唯一的正确答案,所以由模型来评判。模型裁判是一个有偏见的证人,我们像对待证人一样对待它:
Verdict rules:
- Compare A and B for the stated criteria only. Do not reward length.
- TIE is a valid verdict. Prefer TIE over a coin flip.
- Output exactly one line: WINNER: A | B | TIE, then one reason.
(Runner: every pair is judged twice with A and B swapped.
Only a verdict that survives the swap is recorded. ~11% do not.)
位置偏差是真实存在的。裁判偏向第一个答案。交换再一致协议消除了这类噪声,代价是裁判调用次数翻倍。值得。
长度偏差是真实存在的。不受约束的裁判会给字数多的答案奖励。评分规则明确说明了这一点,而且在评判前会对输出长度进行限制。
自我偏好是真实存在的。模型会给自己的同门打高分,所以在高风险场景下,裁判和生成者是不同的模型家族。
对于 agent 任务,我们不测量 pass@k,即 k 次尝试中是否有一次成功。我们的测量方式相反:把同一个任务运行 k 次,只有在每次都成功的情况下,agent 才有资格在该任务类别上获得自主性。一个成功率五分之四的工作流不是完成了 80%。它是一个你还没有安排好的值班轮换。
回报是平淡的,却是最好的方式:prompt 重构、模型切换和提供商迁移变成了常规改动,有红/绿的答案,而不是靠信仰跳跃然后花一周时间盯着日志。