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"说不出到底哪里变好、哪里变坏。

Hamel Husain 和 Shreya Shankar 的 evals FAQ 还列了两条:Likert 要更大的样本才能检测出差异,打分者会往中间的分数靠以回避难下的判断。他们的建议是先用二元标签,弄清楚"坏"长什么样。

2二元 rubric:把"好不好"拆成几道是非题

"这份 Bug 报告合格吗"是一个大问题。拆成几条各自能判对错的标准,每条只回答 1(通过)或 0(不通过):

编号标准什么算通过
R1复现步骤从明确的起点(URL、账号、初始数据)出发,按步骤能走到失败
R2期望与实际分别写了期望结果和实际结果,实际结果是观察到的现象,不是推测
R3证据充分附了能支撑结论的证据(第一版,故意写得含糊,下一节改写)
R4不是环境问题失败不是测试环境故障(网络中断、注入的 5xx、测试数据损坏)造成的

整份报告的结论:四条全过才算合格。不要给四条加权求和:R4 不过(把环境故障报成了 Bug),前三条写得再好也是误报。

想看"差多少",用计数代替分数:evals FAQ(Hamel Husain 和 Shreya Shankar)举的例子是"5 个应包含的事实里包含了 4 个",每一个仍然是是非题。

不是说 Likert 不能用。Anthropic 那篇文档的建议是让 LLM 的评价具体、可统计,举的例子既有只输出 correct / incorrect,也有按 1~5 分打,理由是纯定性的评价难以快速、大规模地评估。要用 Likert,就给每一档都写定义,并且在看数据之前定好几分算合格。

3怎么写一条标准

  1. 一条只问一件事。"步骤完整且证据充分"是两道题,一道过一道不过时,标注者只能猜。
  2. 写可以核对的条件,不写形容词。"充分"、"清楚"、"专业"每个人理解不同。
  3. 写清楚看哪里。判 R4 要看 trace 里这一轮有没有注入故障,而不是看报告自己怎么说。
  4. 给边界例子。标注时吵起来的那几条,就是最该写进 rubric 的例子。
  5. 说清楚"不适用"怎么算。不适用是一个隐藏的第三个值:算通过,还是不计入分母,要写死。
  6. 标准从错误分析来。上一讲从 trace 里归纳出的失败类别,每个高频类别对应一条标准;没出现过的问题不急着写。

R3 的改写:

改写前:附了能支撑结论的证据。
改写后:附了至少一条来自本次 trace 的机器证据(请求与响应状态码、控制台报错、DOM 断言结果之一),并且证据里的 URL 和步骤与报告描述一致;只有截图或录屏不算。

4标注一致性:先看两个人能不能对上

同一批报告,A、B 两人各自独立标注,在一条标准上的结果排成 2×2 表:

B 判通过B 判不通过
A 判通过ab
A 判不通过cd
$$\text{总一致率}=\frac{a+d}{N},\qquad \text{通过类一致率}=\frac{2a}{2a+b+c},\qquad \text{不通过类一致率}=\frac{2d}{2d+b+c}$$

后两个叫"特定类别一致率"(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,拖动阈值看"几分算合格"怎么改变结论。所有数字由页面实时计算。

看哪一项
列表
总一致率(Wilson 95%)
通过类一致率
不通过类一致率
随机期望一致率
A 判通过
B 判通过
2×2 表
这一项的标准
逐份标注(红底 = 两人结论不同;1 = 通过,0 = 不通过)

5对不上怎么办

  1. 独立标。标之前不商量,看不到对方的标签,最好也看不到报告出自哪个版本的 Agent。
  2. 逐条标准算一致率,总一致率、通过类、不通过类都看,再把分歧逐条列出来。
  3. 开分歧会。一条条过分歧,找出是标准写得含糊,还是有人看漏了。
  4. 改 rubric:加一条规则或一个边界例子,给 rubric 记版本号,受影响的已标数据按新版重标。
  5. 换一批新报告再测。讨论过的那批两人都记住了答案,在旧数据上重测会高估一致性。

Hamel 和 Shreya 的 evals FAQ 给的流程和前四步一致:独立标注、量一致性、讨论分歧、往 rubric 里补规则或例子,再按新 rubric 重标受影响的样本,迭代到一致率稳定在高位;分歧一直解决不了,由领域专家拍板并记下理由。第 5 步"换一批新数据重测"是本章额外的建议,FAQ 里没有这一条。对中小团队,他们更推荐一开始就只指定一位领域专家("benevolent dictator")做最终裁定,多人标注留给确实需要的场合。

标准会边标边变。Who Validates the Validators?(Shankar et al., UIST 2024)在 9 位从业者的用户研究里观察到 criteria drift:要有标准才能给输出打分,可给输出打分的过程又在帮人定义标准。有人看到新类型的坏输出后加了新标准,有人改了对已有标准的理解,还有一位参与者两次为了和前面的打分保持一致而判了"坏"。这说明 rubric 不可能一次写完,要记版本、定期回头看。

▶演示 2:2×2 一致性计算器

改四个格子,或者点预设。看总一致率高的时候,不通过类一致率可以有多低;随机期望一致率由两人各自的通过率决定。

预设
B 判通过B 判不通过
A 判通过 a b
A 判不通过 c d

✎练习

题 1(Likert):两位标注者给 50 份报告打 1~5 分,皮尔逊相关 0.95。下面哪个说法对?
相关只衡量两组分数是否同涨同落,对整体平移不敏感。一致性要看给出的结论是否相同:分数完全相同的比例,或者按约定阈值二值化以后的一致率。
题 2(算):在"不是环境问题"这条标准上,两人都判通过 40 份,A 判通过、B 判不通过 3 份,A 判不通过、B 判通过 5 份,都判不通过 2 份。不通过类一致率是多少?
%
2d / (2d + b + c) = 4 / (4 + 3 + 5) = 33.3%。总一致率是 42 / 50 = 84%,看着不低,但一个人说"这是环境问题"时,另一个人只有三分之一的时候同意。
题 3(写标准):下面哪一条最适合写进二元 rubric?
A 是形容词,每个人理解不同;B 一条问了两件事,一件过一件不过时没法判;C 只问一件事,而且给了可以核对的条件。
题 4(算):A 判通过的比例是 80%,B 是 70%。两人各自按自己的比例随机贴标签,期望一致率是多少?
%
0.8 × 0.7 + 0.2 × 0.3 = 0.56 + 0.06 = 62%。实测总一致率要和这个数比,才知道比随机好多少;下一讲的 Cohen's κ 就是把这两个数合成一个。
题 5(流程):第一批 40 份报告标完,开了分歧会,改写了 R3。怎么知道改写后的 rubric 一致性变好了?
A 一起标就不是独立标注,一致率没有意义;C 是独立的,但这 40 份在分歧会上逐条讨论过,两人都记得结论,一致率会偏高。要用新的一批报告。

6面试要点

一句话讲清楚

评价 Agent 的输出,我不让人打 1~5 分,而是把"合格"拆成几条二元标准,每条写清楚通过条件、要看的证据和边界例子,整份报告四条全过才合格。上线 Judge 之前先让两个人独立标同一批数据,逐条标准看总一致率和不通过类一致率;对不上的地方开会讨论、改 rubric,再在新的一批数据上重测。

追问准备

  1. Likert 就完全不能用吗?能用,Anthropic 文档也把 1~5 分列为可选做法。前提是每一档都有定义、阈值事先定好,而且报告分布,不只报告均分。
  2. 二元标签丢了"好一点、差一点"的信息怎么办?拆成更细的子项计数,比如"4 条标准过了 3 条"、"5 个应包含的事实包含了 4 个",每一项仍然是是非题。
  3. 总一致率 95% 还不够吗?不通过很少时,总一致率主要由"都判通过"撑起来。要分别看不通过类一致率,并和随机期望一致率比。
  4. 一个人标还是多个人标?小团队优先指定一位领域专家拍板(Hamel 和 Shreya 所说的 benevolent dictator);多人标注时先独立标、量一致性,再讨论。
  5. 和 LLM Judge 什么关系?人与人都对不上的标准,Judge 也没有可以对齐的目标。人标出来的标签是下一讲校准 Judge 的参照。

常见错误说法

❌ "1~5 分比 pass / fail 信息多,所以更好":多出来的信息如果每个人理解不同,就是噪声。
❌ "两人分数相关 0.9,标得很一致":相关不等于一致,整体差 1 分时相关仍是 1。
❌ "总一致率 90%,标注没问题":要看不通过类一致率,还要和随机期望一致率比。
❌ "rubric 要在看数据之前一次写好":标准会在标注中变化(criteria drift),要记版本、迭代。
❌ "讨论完分歧,在同一批数据上重标,一致率涨了,说明 rubric 改好了":要换一批新数据独立标。