返回 AICAP-180
B2 · Day 19attention/decoder/KV + judge 校准

judge-human κ

Day 17 我们认定 judge 有系统性偏差、必须校准;Day 18 手标并冻结了 ≥50 条人工 gold。今天把两条线合流。

阶段: B2 · attention/decoder/KV + judge 校准(Day 11-20) 标签: #cohens-kappa #judge-calibration #inter-rater-agreement #eval

今日导引(由浅入深)

Day 17 我们认定 judge 有系统性偏差、必须校准;Day 18 手标并冻结了 ≥50 条人工 gold。今天把两条线合流。

让一个 LLM judge(Qwen3)跑同样 50 条 traces 出机器标签,连同人工 gold 一起喂入 Cohen's κ,定量回答「这个 judge 到底能不能替代人」。

这是 B1→B18 能力曲线里「造好参照 → 用参照给工具发合格证」的判定动作。judge 校准三连到此收束:Day 17 定判据、Day 18 造 gold、Day 19 发合格证(κ 过 0.6 才放行)。明天 Day 20 再给这张合格证加上误差棒(CI)才算真正盖章。

今日最小可判定产出:judge-human κ 点估计 + 是否过 0.6 阈值的明确结论(κ 数值待 key)。

1. 机理精读

Cohen's κ 衡量两个评分者超越随机一致的吻合度:

κ = (p_o − p_e) / (1 − p_e)

其中 p_o 是观测一致率(两评分者判决相同的比例),p_e 是随机期望一致率(按各自边缘分布独立时碰巧一致的概率)。κ 把「碰运气的一致」剔掉,只留「真本事的一致」。

判读基准:<0.4 差、0.6-0.8 好、>0.8 很好。用它判断 LLM judge 是否可替代人工——κ 没过 0.6,judge 不能当准绳。

为什么不能只看准确率?因为在类不平衡场景(比如 90% 的 trace 都该判 pass),一个无脑全判 pass 的 judge 准确率就有 90%,但它没有任何判别力——p_e 很高,κ 会暴露真相:接近 0 甚至为负。κ 才是「真一致性」的诚实度量,这也是 2026 评审硬要求报 κ 而非裸准确率的原因。

κ 的取值范围是 (−∞, 1],但实践中:

  • κ=1 完全一致(超越随机的满分);
  • κ=0 一致程度恰等于随机(judge 等于瞎猜);
  • κ<0 比随机还差(judge 系统性地与人对着干,往往是判据理解相反)。

设计权衡:κ 对类别数与边缘分布敏感,单点估计会骗人(小样本时尤其抖)——所以 κ 必须配 CI(明天 Day 20 用 bootstrap 给它加误差棒)。本日先出点估计 + 阈值判定,明日再加 CI 才算把「judge 可用」这个结论钉死。本日承接 Anthropic《Demystifying evals》(2026-01),并对接仓库已就绪的 src/agent/eval/cohensKappa.ts

与相邻概念的边界:Day 18 产出的是「人评」标签,今天产出的是「机评」标签,κ 是两者的桥;Day 20 给这座桥加误差棒。三天构成「judge 校准」的完整闭环——少任何一步,「judge 可用」的结论都站不住。

2. 推导 / 手算 / 代码走读

本日核心代码 src/agent/eval/cohensKappa.ts(真实文件,已 Read)已含 Cohen's κ + bootstrap CI,已测试绿,本日直接调用、不改动。走读真实符号与行为:

  • cohensKappa(a, b) —— 接两个等长 Label[](judge 标签 vs 人工 gold),内部:累计 agreepo = agree/n;用两个边缘计数 map c1/c2pe = Σ (c1[c]/n)(c2[c]/n);返回 kappa = (po − pe)/(1 − pe)。含 pe == 1 退化分支:完全一致取 1,否则取 0(防除零)。
  • cohensKappaWithCI(a, b, { bootstrap, rng }) —— 先取点估计,再对 n 个配对有放回重采样 B 次(默认 2000),每次重算 κ,排序后取 2.5/97.5 分位得 ci95;RNG 可注入保证测试确定性。
  • percentile(sorted, p) —— 线性插值分位,供 CI。

本日只需把 Qwen3 的 50 条机器标签与 agent-evals/labels-b2.json 的 50 条人工标签按相同顺序排成两个 Label[],调 cohensKappaWithCI 即得 κ + CI。

手算示意(理解 κ 如何戳穿高准确率):

50 条里 judge 与人一致 42 条 → po = 0.84。若人和 judge 都把 44/50 标成 pass、6/50 标成 fail,则随机期望一致率:

pe = (44/50)² + (6/50)²
   = 0.88² + 0.12²
   = 0.7744 + 0.0144
   = 0.7888

代入 κ:

κ = (0.84 − 0.7888) / (1 − 0.7888) = 0.0512 / 0.2112 ≈ 0.242

准确率 84% 看着漂亮,κ 却只有约 0.24,远未过 0.6——judge 不合格。这就是 κ 的价值:在类不平衡下,准确率会把一个几乎无判别力的 judge 捧上天,κ 把它打回原形。(此为说明性手算,非本块实测数字。)

判读 κ 结果时按这张对照表给出明确放行/拦截结论:

κ 区间      | 判读      | 对 judge 的处置
------------+-----------+----------------------------------
> 0.8       | 很好      | judge 可直接替代人工
0.6 – 0.8   | 好        | judge 可用,但保留抽检
0.4 – 0.6   | 中等      | 不放行;改 prompt/换 judge 后重测
< 0.4       | 差        | 拒用;judge 与人几乎无共识
< 0         | 反向      | 判据理解相反,先查 rubric/对齐

本日只输出「点估计落在哪个区间 + 是否过 0.6」的结论;区间宽度(CI)由 Day 20 的 bootstrap 补上——只有 CI 整体落在 0.6 以上,才算真正放行。

3. 今日实战

  1. 经 OpenRouter 用 Qwen3 当 judge,跑 Day 18 同样的 50 条 traces,出机器标签。
  2. 把 judge 标签与 agent-evals/labels-b2.json 人工标签按相同顺序排成两个 Label[]
  3. 喂入 cohensKappaWithCIsrc/agent/eval/cohensKappa.ts),算 judge-human κ。
  4. 判断是否过 0.6 阈值,给出「judge 可用 / 不可用」的明确结论。
  5. 离线时人工标签已就绪,judge 标签一旦能跑(有 key)即出 κ。

4. 今日实测 / 产出

  • 状态:待跑(需 OPENROUTER_API_KEY);人工标签就绪后,judge 标签一跑即出 κ。
  • src/agent/eval/cohensKappa.ts 含 Cohen's κ + bootstrap CI,已测试绿
  • 产出:judge-human κ 点估计 + 是否过 0.6。κ 数值待跑——不臆造。

5. 常见误区 / 陷阱

  1. 只报准确率不报 κ——高基线/类不平衡下准确率虚高,κ 才反映真一致性。
  2. 只看点估计不看 CI——小样本 κ 抖动大,无误差棒不可下结论(Day 20 补)。
  3. judge 与人工标签顺序错位——配对乱了 κ 直接失真,务必对齐 task id 顺序。
  4. 用同源模型当 judge——self-preference 偏差让 κ 虚高,校准失效。

6. 学习资源(每条带 YYYY-MM)

  • Anthropic, Demystifying Evals (2026-01) — judge 校准与 κ 的权威方法论,current。
  • Cohen, J., A Coefficient of Agreement for Nominal Scales (1960) — κ 原始定义(经典打底)。
  • Krippendorff, K., Krippendorff's Alpha(方法论综述,多标注者更稳)— κ 的多评分者推广,补充阅读。
  • 仓库代码 src/agent/eval/cohensKappa.ts(Cohen's κ + bootstrap CI,已测试绿)— 本日实现底座。

SOTA检查 (2026-06 更新)

  • 当前主流方案:Cohen's κ 是判官校准的标准指标,仍 current。
  • 是否仍 SOTA:是;补充看 Krippendorff's α(多标注者场景更稳健)。
  • 过时黑名单:避免只报准确率不报 κ(类不平衡下虚高);避免用同源模型自评;避免无 CI 的裸点估计。
  • 下次复查点:2026-Q3 复核 Krippendorff's α 是否成为多标注者评测的硬要求,以及 Qwen3 后续版本作为 judge 的偏差表现。

衔接

  • 昨天:Day 18 — 人工金标准(手标并冻结 ≥50 条 gold)
  • 今天:让 Qwen3 judge 跑同 50 条,用 cohensKappaWithCI 算 judge-human κ 并判 0.6 阈值。
  • 明天:Day 20 — Bootstrap CI + 收口(给 κ 加 95% 误差棒,整合本 block 全部数字成 report-b2.md)