# LLM-as-Judge 的效度工程

> 用模型当评委之前，先证明评委可信。本文给出一套完整的效度工程与一手数据：真人分锚与 QWK 准入（QWK 0.10 与 0.281 的评委被淘汰）、锚独立性（一次循环自证事故作废了历史 QWK 0.51–0.61）、QWK×Spearman 联合诊断刻度压缩、位置交换与长度偏置控制、重建验收闸门，以及同族评委自我偏好等诚实边界。

- Canonical (HTML): https://kaguc.com/blog/judge-validity-zh/
- Date: 2026-07-29


*English version: [Validity engineering for LLM-as-judge](/blog/judge-validity/)。“LLM 应用工程”系列第 9 篇。本篇的一手数据来自一个写作判断蒸馏对照实验（实验本身的设计与结论是[第 12 篇](/blog/distill-judgment-experiment-zh/)的主题），全部数字取自该项目的实验日志、运行台账与源码。*

## 问题：评委本身是个没被测量的概率部件

配对评判（pairwise LLM-as-judge）是 LLM 应用质量评估的主流做法：让模型比较 A、B 两稿哪篇更好，统计胜率。它绕开了绝对打分的刻度难题，但引入了一个更隐蔽的问题——**评委自己也是概率部件，它的裁决凭什么可信？**

这不是假想的风险。我们的实验里真实发生过两次：首轮实验的主评委是 llama-3.3-70b，事后测得它与质量锚的 QWK 只有 0.10——接近随机，**整轮实验作废**；后一轮里，claude-sonnet-4.6 判 B>A、gpt-4o 判 A>B，同一批稿子两个评委结论相反，汇总裁决只能记“模糊”。如果回答不了“哪个评委可信”，胜率表就只是另一组随机数。

本文把我们收敛出的做法称为**效度工程**（validity engineering）：在消费评委的任何裁决之前，先用独立证据证明评委测的确实是你以为它在测的东西。它由五个机制组成：准入、锚独立性、刻度诊断、偏置控制、上岗验收。

## 机制一：评委准入——真人分锚与 QWK 门线

准入的做法：让候选评委给一组带质量分的锚文本打分，与锚分算 QWK（Quadratic Weighted Kappa，序数一致性指标）。门线直接写在 `qwk_anchor.py` 的模块注释里：“≥0.5 → 评判可信，配对胜率结论才值得信；<0.3 → 先回去改 rubric”，0.3–0.5 记“勉强”。

对四个候选评委的实测结果：

| 评委 | QWK | 裁定 |
|---|---|---|
| claude-sonnet-4.6 | 0.55–0.61 | 留任（主评委） |
| qwen3.7-max | 0.571 | 留任（交叉评委） |
| gpt-4o | 0.281 | 淘汰（<0.3 不可信） |
| llama-3.3-70b | 0.10 | 淘汰；其担任主评委的首轮实验整轮作废 |

淘汰不是学术洁癖：gpt-4o 正是上文那次“两评委结论相反”的当事方，剔除它之后，裁决回归了可信评委的判断力本身。但这一轮 QWK 是对**合成锚**算的——这引出下一个机制，也是整个体系里最贵的一课。

## 机制二：锚必须独立于被评系统——一次循环自证事故

事故由一句用户质疑触发：“测试数据是不是没代表性？”核查发现，方案指定的三个真实数据集（arXivEdits / peS2o / ASAP）**一条都没有下载成功**——URL 早已 404、Kaggle 登录从没做、脚本还忽略了系统代理。全程跑在种子与合成兜底数据上：exemplars 13 篇、金标准对 5 对（手编）、合成对 8 对、锚 39 篇——**锚分是合成的，不是真人的**。

后果是结构性的：所谓“QWK 锚”实际是评委在对齐**程序自己的降级规则**——循环自证。历史 QWK 0.51–0.61 全部作废，不构成任何真人可信度。值得说明的一个不对称：作废的是“过线”结论；“出局”结论反而站得住——连合成锚的粗糙排序都对不齐的评委，更不可能对齐真人（这是我们的推断，非独立实验）。

修复是把真实数据真正接通：arXivEdits 取 200 对真实专家修订（按 intention 字段筛选写作质量类改写、弃琐碎 typo，中位长度差 27 字符）；ASAP 2.0 取 120 篇真人整体分作文（1–6 分每档 20 篇分层采样，保证 QWK 有跨度）。教训一句话：**锚必须来自被评系统之外，否则 QWK 度量的是评委与你自己代码的一致性。**

## 机制三：QWK×Spearman 联合诊断——刻度压缩不等于排序失效

真人锚就位后，首个真 QWK = **0.323**：模型均分 2.32 vs 人类 3.50，系统性偏严约 1.2 分。多代理调研的诊断是三重根因：偏严刻度错位、genre/rubric 错配（拿物理报告 rubric 打英文议论文）、以及单篇绝对打分这一用法的天花板本就低（项目内调研给出 ASAP holistic 零样本约 0.60 的参考值，未独立核验）。

修因走零/低成本路线：换 ASAP holistic 六档 rubric、删全部“严格”措辞（system prompt 由“严格”改为“校准良好”）、加满量程先验；few-shot 因当前锚数据无 train/eval 切分会泄漏，暂以注释关闭。修前修后：

| 指标 | 修前 | 修后 |
|---|---|---|
| QWK | 0.323 | **0.456** |
| Spearman | — | **0.813** |
| Pearson | — | 0.788 |
| 系统偏移 | -1.18 | -0.87 |
| 模型均分 | 2.32 | 2.63（人类 3.50） |

QWK 仍未过 0.5，但关键发现在另一个数字上：**Spearman 0.813 ≫ QWK 0.456**。`qwk_anchor.py` 里的诊断规则一句话概括：“Spearman 高而 QWK 低 → 纯刻度问题（重标定可救）；两者都低 → 排序信号本身弱。”混淆矩阵给出实锤——评委**从不给 5 或 6 分**，人类 5、6 档共 40 篇全被压进 3–4 列。这是一个**排序强、打分保守**的评委，不是一个瞎打的评委。

结论落在用法上：**配对评判只消费排序（评委强项），不消费绝对刻度（评委弱项）——配对胜率作为主信号有底气；单篇绝对打分不可用。**刻度可经事后单调重标定部分校正，但合法性有三个前置条件（经对抗校验确认）：映射单调、用 held-out/CV 报数、参数不跨域迁移——5-fold 复现证明 in-sample 重标定会虚高。且重标定救不了高分段：人类 5 与 6 在评委眼里完全分不开（都打 3/4），这是真实天花板。

## 机制四：偏置控制——位置交换、身份遮蔽、rubric 罚冗余

LLM 评委有位置偏好（偏爱先出现或后出现的一篇）。对策是协议级的：每对稿子按 (A,B) 和 (B,A) 两个顺序各评一次，**两次不一致就记平局**，绝不产出伪裁决。核心逻辑四行（`eval_judge.py`）：

```python
sys_ab = _MAP_AB[_one_order(domain, a, b, rubric, cf)]   # 顺序① first=A
sys_ba = _MAP_BA[_one_order(domain, b, a, rubric, cf)]   # 顺序② first=B
consistent = (sys_ab == sys_ba)
decided = sys_ab if (consistent and sys_ab != "tie") else "tie"
```

这个设计还顺带产出一个评委质量信号：交换一致率。实测 claude-sonnet-4.6 在 N=30 上交换一致率 93%（28/30），pilot N=8 上 8/8；而 qwen3.7-max 多在 0.2–0.5，其胜率大量由平局构成——协议自动把弱评委的不稳定吸收成 tie，而不是让它污染结论。

另两项配套：**身份遮蔽**（评委看不到哪篇出自哪条流水线）；**长度偏置靠 rubric 治而不靠祈祷**——评判提示词明确写入“更长不是优点、信息密度低按冗余扣分、实质相当不得因更长而选”。

## 机制五：重建验收——先判已知强弱对，再判新稿

准入与诊断之外还有最后一道上岗闸门，项目内称“ICAI 式验收”（reconstruction）：把已知强弱对（金标准好稿 vs 降级弱稿）交给带 rubric 的评委挑“更好的一篇”，**挑对率 ≥0.7（代码常量 `GATE_THRESHOLD = 0.7`）才允许它评判新稿**，同时报告交换一致率。逻辑是朴素的：连已知答案都挑不对的评委，没资格裁决未知。

成本边界也写进了模块注释：每对 ×2 次交换是真实 LLM 调用，会烧 token——所以这道闸门定位在**开发/离线侧**，默认不进客户实时链路。

## 全景：评委的上岗流程

```mermaid
flowchart TD
    A[候选评委] --> B[真人分锚打分 → QWK]
    B -->|QWK < 0.3| X[淘汰]
    B -->|过线| C{QWK × Spearman 联合诊断}
    C -->|排序也弱| Y[修 rubric / few-shot 后重测]
    C -->|排序强、刻度压缩| D[只授予配对评判资格<br/>绝对打分不可用]
    D --> E[重建验收：已知强弱对挑对率 ≥ 0.7]
    E -->|不过| Y
    E -->|通过| F[上岗：位置交换两评<br/>不一致记平、身份遮蔽、rubric 罚冗余]
```

## 适用边界

按惯例，说清楚这套做法的边界，以及它本身没有解决的问题：

1. **同族评委的自我偏好必须声明。**我们的主评委 claude-sonnet-4.6 与做 skill 提炼和对抗核查的 Claude Opus 同属一族，实验的“强”结论全部来自这一同族评委，存在“Claude 认得 Claude 式 reasoning”的自我偏好风险。破解只有两条路：非同族第三方评委，或人类锚复核。
2. **锚域不等于目标域。**英文锚只证明评委判英文议论文可信，证明不了它判中文物理报告可信——这是外部效度缺口。生产侧移植版的 docstring 把这条告诫写死：配对评委在中文域可靠性未验证，默认不跑实时链路。
3. **高分段分辨力未经验证。**Spearman 0.81 主要由中低分区驱动；而配对比较恰恰发生在“两篇都不算差”的区间——评委在该区间的排序能力是一个未单独检验的假设，上端量程塌缩对它是真实威胁。
4. **LLM 评委不替代人类锚。**当全部偏好证据来自 LLM 评委时，无法排除 LLM-judge 的系统性偏好；实验的人类盲评（30 对）在写作时仍在采集中，这被诚实地列为最致命局限。
5. **可确定性检测的失败模式不要用评委。**丢内容、结构劣化这类问题用零 token 回归门就够（见[第 11 篇](/blog/deterministic-boundary-zh/)）——更对，且每轮省一次评委调用。评委只该出现在确定性判据够不着的偏好层。

## 参考

- arXivEdits——真实专家修订数据集（schema 为 `sentence-1`/`sentence-2` + `intention`）；本项目按 intention 筛选写作质量类改写，取 200 对作强弱对。
- ASAP-AES 2.0——英文作文真人整体分（1–6）基准；经 Hugging Face 镜像 `jatinmehra/Automated-Essay-Scoring-2.0` 获取，分层采样 120 篇作可信度锚。
- 一手记录：本文全部数字出自该项目的实验日志与机读运行台账（journal / runs.tsv），QWK 逐篇 (id, human, model) 落盘于 `results/qwk_scores.csv` 以支持复算与重标定。

