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

LLM-as-a-Judge 偏差

Day 16 我们用温度扫描量化了「自由采样会破坏严格格式」;今天把镜头从「被评的输出」转向「评分的判官」。

阶段: B2 · attention/decoder/KV + judge 校准(Day 11-20) 标签: #llm-as-judge #eval-bias #cohens-kappa #rubric

今日导引(由浅入深)

Day 16 我们用温度扫描量化了「自由采样会破坏严格格式」;今天把镜头从「被评的输出」转向「评分的判官」。

LLM-as-a-Judge 是 B 阶段评测的核心工具,但它有系统性偏差——不校准就信它的分数,等于在沙地上建评测体系。

这是 B1→B18 能力曲线里「会跑 eval → 会怀疑并校准 eval」的关键一跃。回顾位置:B1 我们让 eval harness 能跑、能算成本;B2 前半段(Day 11-15)打 transformer 内核地基,Day 16 起转入「评测可信度」专题。今天是 judge 校准三连(Day 17 备 rubric → Day 18 标 gold → Day 19 算 κ)的开篇:先把判官的三类偏差讲透,再准备好用 Cohen's κ 对齐人工金标准所需的标注资产。

今日最小可判定产出rubric-b2.md(明确判据)+ 50 条待标 traces 清单。

1. 机理精读

用强 LLM 给另一个模型的输出打分(LLM-as-a-Judge)能极大降低评测成本,但判官不是中立尺子,它带可复现的系统性偏差。三类最关键:

position bias(位置偏差):在 A/B 比较里,judge 倾向偏好先出现的那个答案,单纯换位置就能翻转判决。缓解手段是两个顺序都跑一遍取平均、或随机化位置后再聚合。这条偏差直接威胁所有「成对比较」型评测——B 阶段后面要做的模型 A/B 对比若不处理它,结论可能纯粹是顺序伪影。

verbosity bias(冗长偏差):judge 倾向给更长、解释更多的答案更高分,即便信息密度更低甚至更差。对「简洁正确」该被奖励的任务(如 AML 一句话定性)尤其有害——它会系统性地把啰嗦答案捧上去。

self-preference(自偏好):judge 倾向偏好与自己同源/同家族模型生成的输出,因为风格、措辞、结构更「眼熟」。用同一家模型既当被评者又当判官时风险最大,结论会被悄悄做高。

正因为这些偏差是系统性(非随机噪声)的,单看 judge 给的准确率毫无说服力——随机噪声会随样本量平均掉,系统偏差不会。所以必须拿 judge 跟人工金标准对齐,量化「judge 与人究竟有多吻合,且这吻合超出随机多少」。

这就是 Cohen's κ 的用武之地:κ<0.4 一致性差,0.6-0.8 算好,>0.8 很好。κ 没到 0.6 的 judge,不能当评测准绳。κ 的妙处在于它把「碰运气的一致」剔除,只留「真本事的一致」,比裸准确率诚实得多。

设计权衡:判官越强越贵,但偏差不会因为模型更强就自动消失(self-preference 反而可能更顽固,因为强模型风格更鲜明)。所以评测纪律是「先校准、后信任」——本日先备好校准所需的人工 rubric 与待标清单,Day 18 手标 gold,Day 19 才真正算 judge-human κ。本日论点直接承接 Anthropic《Demystifying evals》(2026-01):judge 偏差是活跃议题,无人工校准的 judge 分数不可信。

与相邻概念的边界:Day 16 关心「输出格式合法性」(机器可判定,无需人);今天关心「输出质量好坏」(需人来定义判据,judge 来近似)。后者无金标准就无从校准,所以今天的产出是标注资产而非数字——这是个刻意的取舍:先建参照系,再量化工具。

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

本日是资产构建日,核心代码 src/agent/eval/cohensKappa.ts 已在仓库就绪并测试绿,今天只对接其输入格式、不重写。走读其公开接口(真实符号,已 Read 确认):

  • cohensKappa(a: Label[], b: Label[]): KappaPoint —— 两个等长评分者标签数组(Label = string),返回点估计 { kappa, po, pe },其中 po 为观测一致率、pe 为随机期望一致率。
  • cohensKappaWithCI(a, b, opts) —— 在点估计基础上做 percentile bootstrap,返回 KappaResult(含 ci95bootstrapSamples,默认 bootstrap = 2000,RNG 可注入便于确定性测试)。
  • percentile(sorted, p) —— 对已升序数组做线性插值取分位,供 CI 计算。
  • 退化边界处理:当两评分者都只用了同一个类别(pe == 1)时,κ 约定为「完全一致取 1,否则取 0」(见源码注释,避免除零)。

三类偏差与缓解手段速查(标注/judge 设计时对照):

偏差            | 表现                    | 缓解
----------------+-------------------------+--------------------------
position bias   | 偏好先出现的答案        | 双向跑取平均 / 随机化位置
verbosity bias  | 偏好更长答案            | rubric 显式奖励简洁正确
self-preference | 偏好同源模型输出        | judge 与被评者异源 + κ 校准

也就是说,本日只需把 traces 标注成与上述 Label[] 兼容的格式(pass/fail/borderline 映射成字符串标签),Day 19 即可直接喂入 cohensKappaWithCI,无需任何 κ 计算代码改动。

手算热身(理解 κ 为何比准确率诚实):

设 50 条里 judge 与人一致 40 条 → po = 0.80。但若两者都把 90% 标成 pass,则随机一致率 pe = 0.9×0.9 + 0.1×0.1 = 0.82。代入 κ 公式:

κ = (po − pe) / (1 − pe) = (0.80 − 0.82) / (1 − 0.82) = −0.02 / 0.18 ≈ −0.11

准确率 80% 看着不错,κ 却是负的——意味着 judge 与人的一致甚至不如随机!这正是「高基线/类不平衡下准确率虚高」的体现,也是为什么本块坚持报 κ 而非裸准确率。(此为说明性手算,非本块实测数字。)

rubric 判据要写到「可复现」的颗粒度。一条好 rubric 的最小骨架:

  • pass 的充要条件:例如 AML 定性任务——正确识别结构化拆分意图、给出可核查的依据、未越权下结论。
  • fail 的触发条件:例如漏判明显红旗、编造不存在的证据、给出违反 HITL 纪律的自动决策。
  • borderline 的归类规则:例如证据不足但模型如实声明不确定——既非明确 pass 也非明确 fail,单列。
  • 每条判据配一个正例 + 一个反例,让不同时间标注同一条 trace 能得到一致结论。

判据越具体,position/verbosity/self-preference 这些 judge 偏差才越无处藏身——因为人工 gold 是基于明确判据而非「感觉」产出的,judge 偏离判据时 κ 会立刻暴露。

3. 今日实战

  1. agent-evals/ 抽 ≥50 条 traces。
  2. 写人工标注 rubric,给出 pass / fail / borderline 的明确判据(不模糊、可复现),落 agent-evals/rubric-b2.md
  3. 把 50 条待标 traces 整理成清单,落 agent-evals/traces-b2.json
  4. 确认标注结构与 src/agent/eval/cohensKappa.tsLabel[] 输入兼容(pass/fail/borderline 映射成字符串标签),为 Day 18 手标、Day 19 算 κ 铺路。
  5. 不重写 cohensKappa.ts——它含 bootstrap CI 且已测试绿,直接接入。

4. 今日实测 / 产出

  • 状态:待建(标注资产)
  • 产出:agent-evals/rubric-b2.md + 50 条待标 traces 清单(agent-evals/traces-b2.json)。
  • 注:src/agent/eval/cohensKappa.ts(含 bootstrap CI)在仓库已测试绿,可直接接入,无需重写。
  • 本日不产生任何 κ 数值(κ 在 Day 19 跑出,需 key)。

本日产出的 traces-b2.jsonrubric-b2.md 是后两天的依赖:traces 决定了标注样本,rubric 决定了标注标准。两者一旦冻结,Day 18 标注、Day 19 校准就在固定地基上推进——这正是「先建参照系、再量化工具」纪律的工程落点。

5. 常见误区 / 陷阱

  1. 无人工校准就直接信 judge 分数——κ 未达 0.6 的 judge 不可作准绳。
  2. 用同一家模型既当被评者又当判官——self-preference 偏差最大,结论被污染。
  3. rubric 判据写得模糊(「答得好就 pass」)——导致标注不可复现,κ 失去意义。
  4. 强行把 borderline 二分进 pass/fail——丢失信息且引入标注者主观噪声,应单列。
  5. 只跑一个顺序就做 A/B judge——position bias 未消,结论可能是顺序伪影,须双向跑取平均。

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

  • Anthropic, Demystifying Evals (2026-01) — 本日权威来源:judge 偏差与 κ 校准方法论,当前最 current。
  • Zheng et al., Judging LLM-as-a-Judge with MT-Bench and Chatbot Arena(arXiv:2306.05685, 2023-06)— position/verbosity/self-preference 偏差的奠基性量化研究。
  • Cohen, J., A Coefficient of Agreement for Nominal Scales (1960) — κ 统计量原始定义(经典打底)。
  • 仓库代码 src/agent/eval/cohensKappa.ts(含 bootstrap CI,已测试绿)— 本块校准的实现底座。

SOTA检查 (2026-06 更新)

  • 当前主流方案:Anthropic《Demystifying evals》(2026-01) 是当前最权威的 eval 方法论,仍 current;judge 偏差仍是活跃议题。
  • 是否仍 SOTA:用 κ 对齐人工金标准来验证 judge 可用性,仍是 2026 评测标准纪律。
  • 过时黑名单:避免无人工校准就信 judge 分数;避免只报 judge 准确率不报 κ;避免用同源模型自评自判。
  • 下次复查点:2026-Q3 复核多标注者一致性指标(Krippendorff's α)是否进一步成为评审硬要求,以及 Anthropic/各家 eval 方法论的更新版本。

一句话收束

judge 是评测的放大器:校准对了,它能以 1% 的成本逼近人工判断;校准错了,它会把系统性偏差成倍灌进每一个分数。本日不产出任何 κ 数字,但备好了让 κ 有意义的两块地基——明确的判据与固定的样本。

衔接

  • 昨天:Day 16 — JSON-validity sweep(温度 vs 合法率,机器可判定)
  • 今天:拆解 LLM judge 的三类系统性偏差,备好 κ 校准所需的 rubric 与待标清单。
  • 明天:Day 18 — 人工金标准(gold label 纪律:校准、borderline 归档、冻结防泄漏)