返回 AICAP-180
B12 · Day 118RLVR + 模型策略 memo

结果显著性裁决

在 B1→B18 能力曲线上,今天是 B12 实验段的「下判决」环节:昨天(Day 117)已经把 base/tuned 配对求出 Δ 与 95% CI,今天要把这个 CI 翻译成一句能写进 memo 的结论——显著还是不显著?能不能换模型? 与此同时,还要回头校验「打分这件事本身可不可信」:用 Cohen's κ 复核两套标注(两个 judge,或 judge-vs-人工真值)的一致性。逻辑链是

阶段: B12 · RLVR + 模型策略 memo(Day 111-120) 标签: #significance #cohens-kappa #judge-calibration #eval-rigor

今日导引(由浅入深)

在 B1→B18 能力曲线上,今天是 B12 实验段的「下判决」环节:昨天(Day 117)已经把 base/tuned 配对求出 Δ 与 95% CI,今天要把这个 CI 翻译成一句能写进 memo 的结论——显著还是不显著?能不能换模型? 与此同时,还要回头校验「打分这件事本身可不可信」:用 Cohen's κ 复核两套标注(两个 judge,或 judge-vs-人工真值)的一致性。逻辑链是:κ 低 → 标签不可信 → Δ 建立在沙地上 → 先修 grader 再谈显著性。今天的最小可判定产出是 verdict.md——写明 significant? Y/N 与 κ 值。明天(Day 119)才从「不显著/失败的样本」反推数据构造方案。

1. 机理精读

裁决规则:CI 跨 0 ⇒ 不能拒绝 H0。 Day 114 立的假设是 H0(两模型准确率无差)/ H1(tuned 更优)。 今天的裁决规则极其简单也极其硬:若 95% CI 包含 0(即下界 ≤ 0 ≤ 上界),就无法拒绝 H0,结论只能写「方向性更优但不显著(directionally better, NOT significant)」,不能写「tuned 更好」。 这不是保守,而是统计诚实——CI 跨 0 意味着「真实 Δ 等于 0(无差异)」这个可能性没被数据排除。 已落地 A/B 的 N=29、Δ+10.3pp、CI[0.0, 20.7] 正是教科书级反例:点估计 +10.3pp 看着很香,但下界恰好压在 0 上,裁决必须是「not significant」,并附上「需 ~70 任务才有 power」的补救路径。

判决树(写进 verdict.md 的决策逻辑):

κ 够高吗?(judge 标准可信?)
 ├─ 否(κ 低) → 判「标签不可信」→ 先修 grader/judge,本轮 Δ 暂不采信
 └─ 是 → 看 Δ 的 95% CI
          ├─ CI 跨 0  → 「directionally better, NOT significant」+ 写需多少 N
          └─ CI 不跨 0 → 「significant」+ 报 Δ 方向与幅度

为什么裁决前要先看 κ:Δ 的可信度取决于标签的可信度。 Cohen's κ 衡量两套标注在「超越随机巧合」之后的一致程度——κ=1 完全一致,κ=0 等于瞎蒙,κ<0 比瞎蒙还差。常用解读:κ<0.20 极弱、0.21–0.40 弱、0.41–0.60 中等、0.61–0.80 强、>0.80 近乎完美。 在这里它有两个用法:(1) 两个 judge 之间的一致性(inter-rater);(2) judge 与人工真值之间的一致性(judge 校准)。 逻辑顺序是:如果 judge 给 pass/fail 的标准本身就和人/另一个 judge 对不齐(κ 低),那么基于这些标签算出来的 completionRate 和 Δ 都不可信——这时候谈显著性是本末倒置,应该先修 grader/judge,把 κ 拉上来,再回头看 Δ。 κ 是 Δ 的「前置体检」,体检不过就不该上手术台。

小 N 的双重诅咒:CI 宽 + κ 不稳。 N=29 不仅让 Δ 的 CI 宽到触 0,也让 κ 的 bootstrap CI 很宽——cohensKappa.ts 顶部注释明确写了「small N => wide CI — the reason P1 wants N>=50」。 所以本批反复出现的两个「待跑」是同源的:扩到 ~70 任务能收窄 Δ 的 CI;攒到 ≥50 手标能收窄 judge-human κ 的 CI。 两者都卡在「需 key 跑更大任务集 / 需人工标注」上,今天不能假装已完成。

与相邻概念的边界。 今天 ≠ Day 117(Day 117 算出 CI,今天才解读 CI); 今天 ≠ Day 119(Day 119 从失败样本造数据,今天只下「显著/不显著」与「κ 多少」的判决)。 κ 在这里是「复核标签可信度」的工具,不是「评模型」的指标——评模型是 completionRate/Δ 的活,别把两者混为一谈。

2. 代码走读:cohensKappa 的判定逻辑

Read 了 src/agent/eval/cohensKappa.ts,关键符号与行为:

  • cohensKappa(a, b) — 两个等长 rater 标签数组。先要求等长且非空(否则抛错)。流程:
    • po(observed agreement)= 两 rater 标签相同的比例。
    • pe(chance-expected agreement)= 对每个类别,两 rater 各自边际频率之积求和(即「随机一致」的概率)。
    • kappa = (po − pe) / (1 − pe)
    • 退化边界:当 pe===1(两 rater 都只用了同一个类别),分母为 0,约定 po===1 时 κ=1,否则 κ=0——避免除零产出 NaN。这条对「两个 judge 全判 pass」这种退化标注集很重要。
  • cohensKappaWithCI(a, b, opts) — 在点估计基础上加 percentile bootstrap CI:bootstrap 默认 2000、rng 可注入;循环 B 次「有放回重采样 n 对、各算一次 κ」,排序后取 2.5%/97.5% 分位做 ci95。返回 KappaResult(含 kappa/po/pe/n/ci95/bootstrapSamples)。纯函数、RNG 可注入、无网络,可确定性单测。
  • 与评测引擎的对接点在 agentEval.tsrunTaskEval 末尾,若传入 humanLabels,会把 judge 标签与人工标签配对,仅当配对数 ≥2 时cohensKappaWithCI 产出 judgeHumanKappa,否则为 null。这解释了为什么「judge-human κ」必须等到攒够手标才有值——少于 2 条配对,κ 字段就是 null,不能凭空填数。

走读结论:cohensKappa.ts 工具本身已 built+tested,今天能跑出「两套现有标注」的 κ;但 judge-human κ 因 ≥50 手标未到位仍为待跑,不能升级成已完成。

一个最小手算例(看清 κ 为何能拆穿「假高一致」)

设两 judge 对 10 条输出打 pass/fail,9 条都标 pass、其中 8 条两者一致:

  • 观察一致 po:假设两 judge 在 9 条上完全一致、1 条相反 → po = 9/10 = 0.90,看着很高。
  • 但若两 judge 都「几乎全标 pass」(边际严重失衡),随机一致 pe 也会很高,比如 pe ≈ 0.82。
  • κ = (po − pe)/(1 − pe) = (0.90 − 0.82)/(1 − 0.82) ≈ 0.44——只算「中等」一致。
  • 教训:高 po 不等于高一致;当标签分布极度倾斜(大多数任务都 pass)时,κ 才是去掉「蒙对」之后的真一致度。这正是 b12 任务集天花板效应(26 ties)下必须看 κ 而非 po 的原因。

3. 今日实战

  1. 跑 κ-harness(src/agent/eval/cohensKappa.ts)复核两组标注一致性——可用的两组是「code grader 标签 vs LLM-judge 标签」或「两次 judge 跑批」,注入固定 rng 求 κ 点估计 + bootstrap CI。
  2. 取 Day 117 的 Δ 与 95% CI,套用裁决规则:CI 是否跨 0 → significant? Y/N。
  3. verdict.md:一句话裁决 + Δ±CI + κ 值 + 补救路径(不显著则写「需 ~N 任务」;κ 低则写「先修 grader」)。
  4. 直接把已落地 A/B 教训写进 verdict 作锚点:N=29、CI[0, 20.7] 跨 0 ⇒ 裁「directionally better, NOT significant,需 ~70 任务」。

4. 今日实测 / 产出

  • 产出物verdict.md(significant? Y/N + κ 值)。
  • 可直接写入的真实裁决:V4-Pro vs V4-Flash directionally better but not-sig @ N=29(Δ+10.3pp、CI[0.0, 20.7] 跨 0)。
  • 状态cohensKappa.ts 工具本身已 built+testedjudge-human κ(需 ≥50 手标)= 待跑(需 ≥50 手标),未到位前 judgeHumanKappa 字段为 null,不得臆造 κ 数字。

5. 常见误区 / 陷阱

  • 把不显著的方向性差异当定论上线:CI 跨 0 还写「换模型」是 eval-rigor 的头号违规。诚实写「方向性更优、扩样本再裁」。
  • 跳过 κ 直接信 Δ:judge 标准没校准(κ 低)时,Δ 建立在不可信标签上。κ 是 Δ 的前置体检,先看 κ 再看 Δ。
  • 小 N 上把 κ 点估当真值:N=29 时 κ 的 bootstrap CI 很宽,单看点估会高估一致性。报 κ 必带 CI。
  • 退化标注误读:两 judge 全判 pass 时 po 很高但 pe 也≈1,κ 可能塌成 0——别把「高 po」当成「高一致」,κ 才是去随机后的真一致。
  • 把 κ 当成「模型有多好」的指标:κ 衡量的是「打分这件事可不可信」,不是「模型答得好不好」。模型好坏看 completionRate/Δ,两者别混。
  • 手标不足时硬凑 κ:少于 2 条 judge↔human 配对,judgeHumanKappa 就是 null;凑不够就如实标待跑,不能拿 inter-judge κ 冒充 judge-human κ。

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

  • Anthropic — Demystifying evals(2026-01):CI 跨 0=不显著、judge 校准、小 N 高方差的戒律。
  • Cohen, J. — A Coefficient of Agreement for Nominal Scales(经典,1960,配 2026 现役 judge-calibration 实践):κ 定义与去随机一致性。
  • Statsig — Sequential Testing / always-valid p-values(2026-01):何时可下显著性结论、避免 peeking。
  • 本仓代码:src/agent/eval/cohensKappa.tssrc/agent/eval/agentEval.tsjudgeHumanKappa 仅在 ≥2 配对时产出)。

7. 面试视角 / 关键要点

  • 「显著性怎么判?」 → 95% CI 跨 0 ⇒ 不能拒绝 H0 ⇒ 「方向性更优但不显著」;不跨 0 才叫显著。
  • 「为什么还要算 κ?」 → κ 复核标签可信度;judge 标准没校准(κ 低),基于它的 Δ 不可信,先修 grader 再谈显著性。
  • 「κ 多少算够?」 → 经验阈值:>0.60 强、0.41–0.60 中等、<0.40 弱;P1 要 N≥50 是因为小 N 下 κ 的 CI 太宽。
  • 「po 已经 0.9 了还不够?」 → 高 po 不等于高一致;标签分布倾斜时 pe 也高,κ 才是去随机后的真一致(见第 2 节手算例)。

一句话总结:先用 κ 验标签、再用 CI 验差异;κ 不过先修 grader,CI 跨 0 就写不显著——这是 verdict.md 的两段式判决逻辑。

SOTA检查 (2026-06 更新)

  • 现役主线:「95% CI 跨 0 = 不显著」与「κ 一致性复核标签可信度」是统计常识级现役做法,judge↔human κ 校准是 2026 LLM-as-judge 的标准前置体检。
  • 避免/禁用:避免把不显著的方向性差异当成定论上线——这是 eval-rigor 的核心戒律(Demystifying evals 2026-01)。避免在 κ 未校准(或 κ 因 N 太小不可信)时就信 Δ。
  • 下次复查点:judge-human κ 待 ≥50 手标到位后复跑(攒满即可把 judgeHumanKappa 从 null 变实值);复查 Demystifying evals 是否有 2026 更新版的 κ 阈值建议。

8. 产出状态速查

状态备注
verdict.md(裁决 + κ)可写真实裁决V4-Pro vs V4-Flash directionally better but not-sig @N=29
cohensKappa.ts 工具已 built+tested点估计 + bootstrap CI,RNG 可注入
judge-human κ待跑(需 ≥50 手标)<2 配对时 judgeHumanKappa 为 null,不得臆造
显著性判据已确立CI[0.0,20.7] 跨 0 ⇒ NOT significant,需 ~70 任务

衔接

  • 昨天:Day 117 — Δ 与置信区间(配对 bootstrap 求 Δ±95% CI,delta-ci.test.ts 绿)。
  • 今天:CI 是否跨 0 → 显著性裁决 + Cohen's κ 复核标签一致性,写 verdict.md
  • 明天:Day 119 — Gap→数据构造(从失败/不显著的样本聚类出 top-3 gap,每个 gap 绑构造方案 + eval 指标)。