返回 AIPA 笔记
AIPA Day 17

judge 校准与一致率 — Cohen's kappa 与校准闭环

judge 校准与一致率 — Cohen's kappa 与校准闭环

2026-07-01
judge-calibrationcohens-kappainter-raterdrift

日期: 2026-07-01 阶段: Phase 1 - 产品定义×评测×可观测底座 标签: #judge-calibration #cohens-kappa #inter-rater #drift

核心问题

Day 16 把 judge prompt 调成了四段式、刻度压到二元。但有个致命问题没解决:judge 给的分到底可不可信? Day 3 立的硬规矩是——judge 必须先与人工标注的一致率达标,才能进 CI 阻断 merge。今天回答两个问题:

  1. 怎么量一致率? 直觉会用「裸一致率」(judge 和人工打一样分的比例)。今天证明这个直觉是错的——90% 的裸一致率可能对应一个糟糕的 judge,必须用 Cohen's κ(kappa) 校正掉「瞎蒙也会蒙对」的部分。
  2. 怎么持续校准? 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:可提交9010100
judge:不可提交000
人工边际9010100
  • 裸一致率 $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.900.900.00假象,零鉴别力
judge 有真实鉴别力(均衡样本)0.720.500.44moderate,仍需迭代
judge 校准后0.880.550.73substantial,可进 CI
人工间(rubric 清晰)0.900.500.80任务定义清晰
人工间(rubric 模糊)0.780.550.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 仅落函数与单测。

参考资料

  1. 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 阈值表 (持续)
  2. 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)
  3. eugeneyan — Evaluating the Effectiveness of LLM-Evaluators:Cohen's κ 用于 judge×人工对照;0.21-0.40 fair / 0.41-0.60 moderate;任务相关 κ 从 0.3 到 0.84+ 不等 (持续)
  4. FutureAGI — Human vs LLM Annotation in 2026: Accuracy, Cost, Hybrid:每条 trace 由 2-3 人按 rubric 标注、追踪标注者间 κ (2026)
  5. 本仓库 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 用序数,决策是否切加权 κ,回填本笔记设计要点表。