Bug 报告写得好不好,打 1~5 分还是判 pass / fail?
把"好不好"拆成几道是非题,每道题写清楚什么算过、什么不算,再让两个人各标一遍,看能不能对上。
1~5 分看起来信息更多,但 3 和 4 差在哪没人说得清,两个人的分数相关很高也可能一份都对不上。标注都对不上,后面的 Judge 就没有可以对齐的标准。
11~5 分的三个问题
场景:BugHunt 的测试 Agent 跑完一轮,交上来 30 份 Bug 报告,要判断每份报告合不合格。最顺手的做法是让人(或者 LLM)给每份报告打 1~5 分。
问题一:中间的分数没有定义
Anthropic 官方文档 Define success criteria and build evaluations 里的 Likert 打分示例,prompt 只定义了两端:"1: Not at all …"、"5: Perfectly …",2、3、4 留给打分者自己理解。Hamel Husain 的说法更直接:"What makes something a 3 versus a 4? Nobody knows"。
问题二:相关高,不等于对得上
8 份报告,A 打 [5, 4, 4, 3, 2, 4, 3, 5],B 每份都恰好低 1 分。两人的皮尔逊相关是 1.000,分数完全相同的却是 0 份。约定 ≥ 4 分算合格时,A 判 5 份合格,B 只判 2 份。相关系数只看两人的分数是否同涨同落,不看是否给出同一个结论。
问题三:均分会把严重问题平均掉
同一批 10 个任务,旧版 [3, 3, 4, 3, 3, 4, 3, 3, 4, 3],均分 3.3;新版 [5, 5, 4, 5, 1, 4, 5, 1, 4, 5],均分 3.9。均分涨了,但新版有 2 份是 1 分(完全不可用),旧版一份都没有。"均分从 3.3 涨到 3.9"说不出到底哪里变好、哪里变坏。
2二元 rubric:把"好不好"拆成几道是非题
"这份 Bug 报告合格吗"是一个大问题。拆成几条各自能判对错的标准,每条只回答 1(通过)或 0(不通过):
| 编号 | 标准 | 什么算通过 |
|---|---|---|
| R1 | 复现步骤 | 从明确的起点(URL、账号、初始数据)出发,按步骤能走到失败 |
| R2 | 期望与实际 | 分别写了期望结果和实际结果,实际结果是观察到的现象,不是推测 |
| R3 | 证据充分 | 附了能支撑结论的证据(第一版,故意写得含糊,下一节改写) |
| R4 | 不是环境问题 | 失败不是测试环境故障(网络中断、注入的 5xx、测试数据损坏)造成的 |
整份报告的结论:四条全过才算合格。不要给四条加权求和:R4 不过(把环境故障报成了 Bug),前三条写得再好也是误报。
想看"差多少",用计数代替分数:evals FAQ(Hamel Husain 和 Shreya Shankar)举的例子是"5 个应包含的事实里包含了 4 个",每一个仍然是是非题。
3怎么写一条标准
- 一条只问一件事。"步骤完整且证据充分"是两道题,一道过一道不过时,标注者只能猜。
- 写可以核对的条件,不写形容词。"充分"、"清楚"、"专业"每个人理解不同。
- 写清楚看哪里。判 R4 要看 trace 里这一轮有没有注入故障,而不是看报告自己怎么说。
- 给边界例子。标注时吵起来的那几条,就是最该写进 rubric 的例子。
- 说清楚"不适用"怎么算。不适用是一个隐藏的第三个值:算通过,还是不计入分母,要写死。
- 标准从错误分析来。上一讲从 trace 里归纳出的失败类别,每个高频类别对应一条标准;没出现过的问题不急着写。
R3 的改写:
4标注一致性:先看两个人能不能对上
同一批报告,A、B 两人各自独立标注,在一条标准上的结果排成 2×2 表:
| B 判通过 | B 判不通过 | |
|---|---|---|
| A 判通过 | a | b |
| A 判不通过 | c | d |
后两个叫"特定类别一致率"(proportions of specific agreement,Cicchetti & Feinstein 1990)。分母里的 \(2a+b+c\) 是两人判通过的次数之和,所以通过类一致率回答的是"一个人判通过时,另一个人也判通过的程度"。
为什么要分开看:100 份报告,两人都判通过 85、各自单方面判不通过 5、都判不通过 5。总一致率 90%,看起来不错;但不通过类一致率只有 \(2\times5/(10+10)=50\%\):一个人说"这份不合格"时,另一个人只有一半的时候同意。而 Bug 报告评测最关心的恰恰是不合格的那些。
随机也能对上不少:两人通过率都是 90% 时,各自按这个比例随机贴标签,期望一致率是 \(0.9\times0.9+0.1\times0.1=82\%\)。90% 只比随机高 8 个百分点。两人的通过率越接近、且越偏向同一类,这个基线越高;一人判 90% 通过、另一人判 10% 通过时,基线只有 18%。把这两个数合成一个指标就是 Cohen's κ,下一讲「Judge 校准」用它比 Judge 和人。
样本量:一致率也是一个比例,用第 1 周的 Wilson 区间。30 份里对上 24 份(80%),95% 区间是 [62.7%, 90.5%],前提是每份报告的标注互相独立。
▶演示 1:标注对照台
合成数据:30 份 BugHunt 测试 Agent 提交的 Bug 报告,A、B 两人独立标注(手工构造,用来演示计算)。选一条标准,看两人在哪几份上对不上;选 Likert,拖动阈值看"几分算合格"怎么改变结论。所有数字由页面实时计算。
5对不上怎么办
- 独立标。标之前不商量,看不到对方的标签,最好也看不到报告出自哪个版本的 Agent。
- 逐条标准算一致率,总一致率、通过类、不通过类都看,再把分歧逐条列出来。
- 开分歧会。一条条过分歧,找出是标准写得含糊,还是有人看漏了。
- 改 rubric:加一条规则或一个边界例子,给 rubric 记版本号,受影响的已标数据按新版重标。
- 换一批新报告再测。讨论过的那批两人都记住了答案,在旧数据上重测会高估一致性。
Hamel 和 Shreya 的 evals FAQ 给的流程和前四步一致:独立标注、量一致性、讨论分歧、往 rubric 里补规则或例子,再按新 rubric 重标受影响的样本,迭代到一致率稳定在高位;分歧一直解决不了,由领域专家拍板并记下理由。第 5 步"换一批新数据重测"是本章额外的建议,FAQ 里没有这一条。对中小团队,他们更推荐一开始就只指定一位领域专家("benevolent dictator")做最终裁定,多人标注留给确实需要的场合。
▶演示 2:2×2 一致性计算器
改四个格子,或者点预设。看总一致率高的时候,不通过类一致率可以有多低;随机期望一致率由两人各自的通过率决定。
| B 判通过 | B 判不通过 | |
|---|---|---|
| A 判通过 | a | b |
| A 判不通过 | c | d |
✎练习
6面试要点
一句话讲清楚
评价 Agent 的输出,我不让人打 1~5 分,而是把"合格"拆成几条二元标准,每条写清楚通过条件、要看的证据和边界例子,整份报告四条全过才合格。上线 Judge 之前先让两个人独立标同一批数据,逐条标准看总一致率和不通过类一致率;对不上的地方开会讨论、改 rubric,再在新的一批数据上重测。
追问准备
- Likert 就完全不能用吗?能用,Anthropic 文档也把 1~5 分列为可选做法。前提是每一档都有定义、阈值事先定好,而且报告分布,不只报告均分。
- 二元标签丢了"好一点、差一点"的信息怎么办?拆成更细的子项计数,比如"4 条标准过了 3 条"、"5 个应包含的事实包含了 4 个",每一项仍然是是非题。
- 总一致率 95% 还不够吗?不通过很少时,总一致率主要由"都判通过"撑起来。要分别看不通过类一致率,并和随机期望一致率比。
- 一个人标还是多个人标?小团队优先指定一位领域专家拍板(Hamel 和 Shreya 所说的 benevolent dictator);多人标注时先独立标、量一致性,再讨论。
- 和 LLM Judge 什么关系?人与人都对不上的标准,Judge 也没有可以对齐的目标。人标出来的标签是下一讲校准 Judge 的参照。
常见错误说法
❌ "两人分数相关 0.9,标得很一致":相关不等于一致,整体差 1 分时相关仍是 1。
❌ "总一致率 90%,标注没问题":要看不通过类一致率,还要和随机期望一致率比。
❌ "rubric 要在看数据之前一次写好":标准会在标注中变化(criteria drift),要记版本、迭代。
❌ "讨论完分歧,在同一批数据上重标,一致率涨了,说明 rubric 改好了":要换一批新数据独立标。