judge 校准与一致率 — Cohen's kappa 与校准闭环
judge 校准与一致率 — Cohen's kappa 与校准闭环
日期: 2026-07-01 阶段: Phase 1 - 产品定义×评测×可观测底座 标签: #judge-calibration #cohens-kappa #inter-rater #drift
核心问题
Day 16 把 judge prompt 调成了四段式、刻度压到二元。但有个致命问题没解决:judge 给的分到底可不可信? Day 3 立的硬规矩是——judge 必须先与人工标注的一致率达标,才能进 CI 阻断 merge。今天回答两个问题:
- 怎么量一致率? 直觉会用「裸一致率」(judge 和人工打一样分的比例)。今天证明这个直觉是错的——90% 的裸一致率可能对应一个糟糕的 judge,必须用 Cohen's κ(kappa) 校正掉「瞎蒙也会蒙对」的部分。
- 怎么持续校准? judge 不是一次校准就永久可信——模型版本会变、数据分布会漂移。需要一个分歧驱动的迭代闭环。
这对 AML Copilot 是合规底线问题:一个看着「90% 同意人工」的 judge,可能只是因为大多数 SAR 本来就「可提交」,judge 无脑全判 yes 就能蒙到 90%——而它对真正该拦的劣质 SAR 毫无鉴别力。
关键内容
A. Cohen's κ 的定义与计算:为什么不用裸一致率
裸一致率(observed agreement, $p_o$) = judge 与人工打分相同的样本比例。它的致命缺陷:没有扣除「随机也会一致」的部分。当类别分布不均衡(AML 场景:绝大多数 SAR 是「可提交」),裸一致率会被基线撑得虚高。
Cohen's κ 的修正思路——把「超出随机水平的那部分一致」单独拎出来:
$$\kappa = \frac{p_o - p_e}{1 - p_e}$$
- $p_o$:观测一致率(judge 与人工实际一致的比例)
- $p_e$:期望(随机)一致率——若 judge 和人工各自按其边际分布独立瞎打,会一致多少
- 分子 $p_o - p_e$:超出随机的真实一致;分母 $1 - p_e$:可能超出随机的最大空间。κ 把真实一致归一化到 [−1, 1],1=完美、0=和瞎蒙没区别、负=比瞎蒙还差。
$p_e$ 的算法(按边际概率,numiqo 口径):对每个类别,把「judge 判该类的比例 × 人工判该类的比例」相乘,再对所有类别求和:
$$p_e = \sum_{k} \left( \frac{\text{judge 判 } k \text{ 的数}}{N} \times \frac{\text{人工判 } k \text{ 的数}}{N} \right)$$
为什么这条公式对 AML 至关重要——看一个数值例子(二元:可提交 / 不可提交)。设 100 个 SAR,人工判 90 可提交、10 不可提交;judge 学懒了,无脑全判可提交:
| 人工:可提交 | 人工:不可提交 | judge 边际 | |
|---|---|---|---|
| judge:可提交 | 90 | 10 | 100 |
| judge:不可提交 | 0 | 0 | 0 |
| 人工边际 | 90 | 10 | 100 |
- 裸一致率 $p_o = (90+0)/100 = \mathbf{0.90}$ —— 看着很棒!
- $p_e = (\frac{100}{100} \times \frac{90}{100}) + (\frac{0}{100} \times \frac{10}{100}) = 0.90 + 0 = \mathbf{0.90}$
- $\kappa = \frac{0.90 - 0.90}{1 - 0.90} = \frac{0}{0.10} = \mathbf{0}$
裸一致率 90%,κ = 0。κ 一眼戳穿:这个 judge 和「无脑全判可提交」的瞎蒙没有任何区别,对该拦的 10 份劣质 SAR 一份都没拦住。
反直觉洞察①(90% 裸一致率可能 κ 趋近 0):在类别极不均衡的场景,裸一致率几乎只反映多数类的占比,对少数类(恰恰是最该抓的「不可提交 SAR」)的鉴别力完全不可见。裸一致率高,是 judge 可信的必要非充分条件。 AML 的告警本就稀疏(行业 FP 率 85%-95%,真阳极少),用裸一致率验 judge 等于自欺。必须 κ。
numiqo 的另一个例子印证这个「悖论」:$p_o = 0.72$(72% 裸一致)但 $p_e = 0.50$,算出 $\kappa = 0.4$——只是「moderate」。裸一致率比 κ 系统性偏高,差距随类别不均衡扩大。
κ 的解释阈值(Landis & Koch,业界通用):
| κ 区间 | 解释 | 本项目 judge 准入 |
|---|---|---|
| < 0 | 比随机还差 (Poor) | 禁止上线 |
| 0 – 0.20 | 轻微 (Slight) | 禁止 |
| 0.21 – 0.40 | 一般 (Fair) | 禁止 |
| 0.41 – 0.60 | 中等 (Moderate) | 不进 CI gate,仅记录 |
| 0.61 – 0.80 | 显著 (Substantial) | 达标,可进 CI |
| 0.81 – 1.0 | 几乎完美 (Almost Perfect) | 理想 |
2026 工程口径(FutureAGI):「Production teams now compute Cohen's kappa between judge and a labeled human sample before they ship any new rubric」「κ above 0.80 strong, 0.60–0.80 substantial, below 0.60 needs rubric work」。本项目 judge 准入门设 κ ≥ 0.6(substantial),与 Day 3 PRD 里「judge×人工一致率 ≥ 0.8」对齐——注意那是裸一致率口径的 v1 假设,今天用 κ 收紧:裸一致率 0.8 只是入场券,κ ≥ 0.6 才是真门槛。
B. judge × 人工双盲对照流程
校准的前提是有一个干净的「人工金标」。流程必须双盲,否则人工会被 judge 分数锚定,κ 虚高:
校准样本池(从 66 案 SAR 抽 N 份)
│
┌───────────┴───────────┐
▼ ▼
judge 独立打分 2-3 名人工独立打分
(不看人工) (不看 judge、互不看)
│ │
│ 先算人工间 κ_human
│ (任务歧义度自检,见下)
└───────────┬───────────┘
▼
对照:计算 κ(judge, 人工合议)
│
┌───────────┴───────────┐
κ ≥ 0.6 κ < 0.6
judge 进 CI gate 进 C 节分歧驱动迭代
关键前置:先算人工间一致率 $\kappa_{human}$。FutureAGI 口径:「If two human raters agree on fewer than 80%(κ < 0.6)of examples, the task definition is ambiguous; calibrate the rubric, not the judge.」——若人类自己都达不成共识,说明 rubric 维度定义模糊,此时去校准 judge 是优化噪声。必须先让人工间 κ 达标,再谈 judge。这条顺序不能反。
反直觉洞察②(judge κ 低,错的可能不是 judge):发现 judge κ 低,第一反应往往是「换个更强的模型/调 prompt」。但若人工间 κ 也低,根因是 rubric 维度本身定义不清(如「coverage」边界模糊),judge 只是忠实地反映了这个模糊。先修 rubric(让人类能一致),再修 judge。 顺序搞反,会在一个本质模糊的任务上把 judge 调成过拟合人工噪声。
C. 分歧驱动的 judge prompt 迭代闭环
judge κ 不达标时,不是盲调 prompt,而是从分歧样本归因。这是一个状态机:
┌──────────────────────────────────────────┐
│ [校准] 算 κ(judge, 人工) │
└───────────────┬──────────────────────────┘
│ κ ≥ 0.6 ?
┌───────┴───────┐
是 否
│ ▼
│ ┌──────────────────────────────┐
│ │ [归因] 拉出全部分歧样本 │
│ │ 按 judge↔人工 差异聚类 │
│ │ → 哪个维度分歧最多? │
│ └───────────────┬──────────────┘
│ ▼
│ ┌──────────────────────────────┐
│ │ [修复] 三选一: │
│ │ · 维度定义模糊 → 改 rubric │
│ │ · 边界档难分 → 补锚定示例 │
│ │ · judge 系统性偏向 → 调角色段 │
│ └───────────────┬──────────────┘
│ ▼
│ 重新算 κ(回 [校准])
▼
┌──────────────────────────────┐
│ [上岗] judge 进 CI gate │
│ [监控] 每月重抽样算 κ │ ◄── 漂移检测
│ κ 跌破 0.6 → 降级回人工 │ (模型版本/数据分布变化)
└──────────────────────────────┘
三种修复对应 Day 16 四段式的不同段:维度模糊改第2段 rubric、边界难分补第3段锚定示例、系统性偏向调第1段角色。FutureAGI 口径:上岗后「re-sample monthly to catch judge drift」——校准不是一锤子买卖,是持续监控指标,κ 跌破阈值即降级回人工(呼应 Day 3 的「一致率漂移即降级」)。
各方法的一致率量化对照(说明为什么必须报 κ 而非裸一致率):
| 场景 | 裸一致率 $p_o$ | $p_e$ | κ | 判读 |
|---|---|---|---|---|
| judge 无脑全判可提交(不均衡) | 0.90 | 0.90 | 0.00 | 假象,零鉴别力 |
| judge 有真实鉴别力(均衡样本) | 0.72 | 0.50 | 0.44 | moderate,仍需迭代 |
| judge 校准后 | 0.88 | 0.55 | 0.73 | substantial,可进 CI |
| 人工间(rubric 清晰) | 0.90 | 0.50 | 0.80 | 任务定义清晰 |
| 人工间(rubric 模糊) | 0.78 | 0.55 | 0.51 | 先修 rubric 再校 judge |
设计要点/决策表
| 要点 | 决策 | 理由 |
|---|---|---|
| 一致率指标 | Cohen's κ,禁用裸一致率单独定门 | 裸一致率被多数类撑高,κ 校正随机一致 |
| judge 准入门 | κ ≥ 0.6 (substantial) | 对齐 FutureAGI 2026 工程口径 |
| 前置检查 | 先算人工间 κ_human ≥ 0.6 | 人类不一致=rubric 模糊,先修 rubric 不修 judge |
| 双盲 | judge 与人工独立打分、人工互不看 | 防锚定导致 κ 虚高 |
| 漂移监控 | 每月重抽样算 κ,跌破即降级回人工 | judge 非一次校准永久可信 |
| 迭代归因 | 从分歧样本聚类定位失效维度 | 不盲调 prompt,对症改三段之一 |
对本项目的落地
- 新建
src/aml/judgeCalibration.ts:导出cohensKappa(judgeLabels, humanLabels) → number(实现 A 节公式,支持二元与低基数序数),以及calibrationReport(samples) → { kappaJudgeHuman, kappaHuman, disagreements },把分歧样本按维度聚类输出,喂给 C 节迭代闭环。 - 人工金标接口:校准样本从 66 案 SAR 中抽样(v1 全量 66 即可),人工标注结果以
{ caseId, faithfulness, coverage, submittable }形式存为src/aml/__tests__/judgeGold.ts内嵌常量(与retrievalGolden.ts内嵌 golden 同模式),2-3 人标注先算 κ_human。 - CI 准入门:在测试里断言
cohensKappa(judge, human) ≥ 0.6才允许 judge 分进evalBaseline聚合并阻断 merge;κ < 0.6 时 judge 分仅记录、不参与 gate(呼应 Day 16「未校准 judge 只记录不阻断」)。 - 与 evalBaseline 关系:
evalBaseline.ts现产出规则基线 recall/FPR;judge 校准是给「judge 这个评测器本身」做质检——评测器也要被评测。两者构成:规则判得对(baseline)→ judge 评得准(calibration)→ 双校准后 judge 才能上岗评 SAR 语义质量。 - 诚实标注:
judgeCalibration.ts头注明确 κ 阈值 0.6 为 v1 设计门槛,W3 用真实标注数据测算后回填;漂移监控(每月重算 κ)为 P3 上线后的运营动作,W1-W2 仅落函数与单测。
参考资料
- numiqo — Cohen's Kappa: Measuring Inter-Rater Agreement:公式 $\kappa=(p_o-p_e)/(1-p_e)$;$p_e$ 按边际概率乘积求和;worked example $p_o=0.72, p_e=0.50, \kappa=0.4$;Landis & Koch 阈值表 (持续)
- FutureAGI — LLM-as-Judge Best Practices in 2026: Calibration, Bias, and Cost:上线新 rubric 前先算 judge×人工 κ;κ>0.8 strong / 0.6-0.8 substantial / <0.6 needs rubric work;每月重抽样查漂移;人工间一致 <80% 则先校 rubric 不校 judge (2026)
- eugeneyan — Evaluating the Effectiveness of LLM-Evaluators:Cohen's κ 用于 judge×人工对照;0.21-0.40 fair / 0.41-0.60 moderate;任务相关 κ 从 0.3 到 0.84+ 不等 (持续)
- FutureAGI — Human vs LLM Annotation in 2026: Accuracy, Cost, Hybrid:每条 trace 由 2-3 人按 rubric 标注、追踪标注者间 κ (2026)
- 本仓库
src/agent/eval/retrievalGolden.ts(内嵌 golden 模式参照)、src/aml/evalBaseline.ts(聚合口径)(2026-06)
SOTA 检查 (2026-06-11)
- Cohen's κ 作为 judge 校准的事实标准在 2026-06 稳固:FutureAGI、eugeneyan、numiqo 口径一致——「上线前算 judge×人工 κ、定期重抽样查漂移」已是 table-stakes;本日 WebSearch 未见替代指标取代 κ 的主流方法论。
- κ 之外的补充指标在升温:部分团队在多分类/序数场景改用 加权 κ(weighted kappa) 或 Krippendorff's α(容多标注者、容缺失);本项目二元/低基数序数用普通 Cohen's κ 足够,但若 coverage 维度做成 0-3 序数,应考虑加权 κ(相邻档分歧惩罚轻于跨档),W3 校准时评估。
- 「裸一致率撒谎、κ 校正随机」是统计常识非新发现:但 2026 仍有团队直接信任 judge 裸一致率(FutureAGI 称「most teams get it wrong」),故本笔记的反直觉洞察①仍是 live 的踩坑点。
- 过时认知警示:「judge 校准一次即永久可信」过时——模型版本更新(如供应商静默换权重)会让 κ 漂移,必须周期性重算;这是 Day 3「漂移即降级」的量化执行。
- 待跟踪:W3 拿到真实 2-3 人标注后,先验证 κ_human 是否 ≥0.6(rubric 是否够清晰),再测 judge κ;若 coverage 用序数,决策是否切加权 κ,回填本笔记设计要点表。