系列上一篇把 LLM-as-Judge 的架子搭了起来:定 rubric、组装 prompt、跑出分数,评测从人工肉眼升级成了自动打分。但一个更根本的问题没有回答——judge 自己可信吗?分数是模型生成的文本,不是卡尺量出来的长度:它有偏好、有噪声,一个换换顺序结论就翻转的 judge,报出的"通过率 87%"没有任何含金量。
本篇补齐这块短板:先过一遍业界已系统记录的四大偏差谱系,再给三个当天就能跑的自查实验,然后是两组缓解技术——换位判与去偏提示、锚定样例与校准集——接着给出一致率不达标的处置路径,最后讲 judge 的元评测与作为地面真值的人工标注工程。本文按"谱系 → 自查 → 缓解 → 校准 → 处置 → 元评测 → 标注 → 总结"组织全文。
1、judge 偏差谱系
judge 的偏差不是玄学,每一类都有公开实验证据。工程上最要紧的是下面四种:
| 偏差 | 英文 | 典型表现 |
|---|---|---|
| 位置偏差 | position bias | A/B 对判时系统性偏向某个位置 |
| 长度偏差 | verbosity bias | 更长的答案得分更高,内容相同也如此 |
| 自我偏好 | self-preference | judge 给同厂模型的输出打分更高 |
| 宽严偏差 | leniency bias | 整体打分过松或过严,基线漂移 |
位置偏差的证据最硬。MT-Bench 论文(Zheng 等,2023)把成对答案交换顺序后重新让 GPT-4 判,结论保持一致的只有 65%;把 prompt 改成"先分别引用两个答案再比较",一致率升到 77.5%——有改善,但远没有根除。换句话说,默认配置下每三四个 case 就有一个的胜负取决于谁排在前面。
长度偏差在同一篇论文里被记录为 verbosity bias:质量相当的两个答案,长的赢。后续的 Length-Controlled AlpacaEval 用回归方法把长度从胜率里剥离,修正后的指标与人类偏好的相关性显著提升——反过来说明剥离前的胜率里混着不少长度水分,实现开源在 alpaca_eval 仓库。
自我偏好由 Panickssery 等 2024 年的工作量化:GPT-4、Llama-2 Chat 作为 judge 都给自己的输出打了更高的分,即使人类标注员认为质量相当;而且模型的自我识别能力越强,自我偏好越明显。这条结论的工程含义很直接:不要让模型评自己家的输出。
宽严偏差更像"人格"而非单点错误:不同 judge 的打分基线天然不同,有的出手宽松、有的苛刻。2025 年的一项系统研究覆盖六种 judge 模型,发现连量表格式(档位还是数值)都会影响宽严程度。它不改变排序时危害较小,但绝对分数要进报表时必须校准。
四类偏差的共同点:都是系统性误差,不是随机噪声。随机噪声可以靠多次平均压掉,系统误差只会稳定地把你带偏。
2、偏差自查实验
论文数字是别人家 judge 的,自己的 judge 什么脾气要自己测。三个实验分别对应位置、长度与自我偏好,全部复用现有评测集。
2.1、换序重判测位置
取 30~50 条成对 case,正反两个顺序各判一次,统计结论一致率。脚本如下:
# check_position.py —— 同一批 case 换序重判,测位置偏差
import json
from anthropic import Anthropic
client = Anthropic()
TMPL = ('比较两个客服回答,输出 JSON {{"win": "A"/"B"/"TIE"}}。\n'
'A:\n{a}\n\nB:\n{b}')
cases = json.load(open("pairs.json", encoding="utf-8")) # 每条含 a、b
def judge(a, b):
r = client.messages.create(
model="claude-sonnet-5", max_tokens=64,
messages=[{"role": "user", "content": TMPL.format(a=a, b=b)}])
return json.loads(r.content[0].text)["win"]
same = front = back = 0
for c in cases:
v1, v2 = judge(c["a"], c["b"]), judge(c["b"], c["a"])
if (v1, v2) in [("A", "B"), ("B", "A"), ("TIE", "TIE")]:
same += 1 # 换序后仍是同一答案获胜
elif v1 == v2:
front += 1 # 谁在前谁赢 → 偏前
else:
back += 1 # 谁在后谁赢 → 偏后
print(f"一致率 {same / len(cases):.0%},偏前 {front},偏后 {back}")
判读口径:一致率 90% 以上基本可用;65% 上下就是 MT-Bench 里 GPT-4 的原始水平,说明位置偏差严重。偏前偏后的计数还给出偏差方向,第 3 节的去偏 prompt 可以对着打。
2.2、控制变量测长度
做法是把同一个答案做一版"注水"——内容一字不差,追加几句客套废话——让两者对判:
# check_length.py —— 原版与注水版对判,测长度偏差
from anthropic import Anthropic
client = Anthropic()
base = "退款请在订单页提交申请;拆封商品不支持无理由退货。"
padded = (base + " 温馨提示:退货政策的制定是为了平衡各方权益,"
"感谢您的耐心阅读,祝您生活愉快。")
prompt = f"哪个客服回答更好?A:\n{base}\n\nB:\n{padded}\n只输出 A 或 B"
win_b = sum("B" in client.messages.create(
model="claude-sonnet-5", max_tokens=8,
messages=[{"role": "user", "content": prompt}]).content[0].text
for _ in range(10))
print(f"注水版胜率 {win_b / 10:.0%}")
内容完全相同、只多一段废话的版本如果稳定胜出,长度偏差坐实。更系统的做法是在整批 case 上算答案长度与胜率的相关系数,但注水实验因果链最干净,十分钟跑完。
2.3、跨厂交叉互判
自我偏好的自查是一条纪律:被评模型与 judge 模型不同厂。要验证效果,把 2.1 的脚本里 judge 换成另一家模型重跑整批,统计两个 judge 结论相同的比例——交叉一致率长期低于 70%,说明至少一方的结论里偏好成分大于判据成分。跨厂 judge 的附加收益是互相对照:两个 judge 在同一批 case 上分歧最大的地方,往往就是要转人工细看的地方。
3、换位判与去偏提示
测出来的偏差怎么治?第一组手段便宜:改判法与改 prompt。
换位判把 2.1 的自查直接变成生产逻辑:每个 case 正反各判一次,两次指向同一答案才算数,否则记平局或转人工。
def judge_stable(a, b):
v1, v2 = judge(a, b), judge(b, a) # 复用 2.1 的 judge 函数
if (v1, v2) == ("A", "B"):
return "A"
if (v1, v2) == ("B", "A"):
return "B"
return "TIE" # 换序后结论漂移 → 平局,贵重 case 转人工
代价是 judge 调用翻倍,换来的是位置偏差在机制上被消除——不依赖模型自觉。平局率本身还是免费的健康指标:突然升高,说明近期答案质量趋同或 judge 变钝,两种都值得看一眼。
去偏提示是在 prompt 里明说:加入"不要把长度作为质量信号""两者质量相当时判 TIE 而非硬选"这类条款,并要求先分别列出各自优缺点、再下结论(即 MT-Bench 的"先引用再比较")。要如实讲:它的效果有限——MT-Bench 的一致率从 65% 只提到 77.5%,因为偏差是训练进去的倾向,不是 prompt 里漏写的一句话。实践里正确用法是换位判打底、去偏提示补充,顺序不能反。
4、锚定样例与校准集
第二组手段要花本钱:给 judge 一把"标尺"。
4.1、锚定样例
宽严漂移的根因是"3 分"对 judge 没有物理含义。在 prompt 里放两个已人工标注的样例,等于把抽象分数绑到具体案例上:
ANCHORS = """
先看两个已标定的样例,理解打分尺度:
[样例一] 结论正确,但跳过两步关键推导 —— 2 分
[样例二] 推导完整,仅一处单位笔误 —— 4 分
"""
PROMPT = f"""你是助教,给回答按 1~5 打分。{ANCHORS}
对照上述尺度,给以下回答打分:
{answer}
只输出 JSON:{{"score": 1到5的整数, "reason": "一句话"}}
"""
锚点的选法有讲究:一高一低拉开量程,且都要贴近真实 case 的分布——拿数学作业的锚点去判客服对话没有意义。锚定对宽严偏差效果最好,对位置偏差几乎无效,各管一段。
4.2、校准集与 kappa
终极校准是建一个人工标注的金标集:从评测集分层抽 50 条,难度、类型、bad case 都要覆盖,人工逐条打分作为金标准;judge 跑同一批,算一致率。光算"相同的比例"不够——双方都无脑猜 good 也能撞上八成——要用 Cohen's kappa,它扣掉了随机一致的水分:
# kappa.py —— 计算 judge 与人工金标的 Cohen's kappa
import json
human = json.load(open("golden_human.json", encoding="utf-8"))
judge = json.load(open("golden_judge.json", encoding="utf-8"))
K = ["good", "ok", "bad"] # 三档标签
po = sum(h == j for h, j in zip(human, judge)) / len(human)
pe = sum(human.count(k) / len(human) *
judge.count(k) / len(judge) for k in K) # 随机一致率
print(f"kappa = {(po - pe) / (1 - pe):.3f}")
判读经验值:kappa 低于 0.4 说明 judge 不可用;0.4~0.6 勉强;0.6~0.8 可用于低风险决策;0.8 以上才算可靠的自动化评分。50 条是起步规模,足够把 kappa 估准到正负 0.1 上下;金标集只增不减,每次大改 judge 配置都重算一次。
没有金标集的 judge 分数只是模型的主观意见;有了金标集,它才升级为一把经过校准的尺。
5、一致率不达标的处置
kappa 低于 0.6 时,按成本从低到高依次尝试:
| 手段 | 适用场景 | 代价 |
|---|---|---|
| 修 rubric | 定义模糊导致两套标准 | 半天讨论,最常见根因 |
| 换 judge 模型 | 现模型能力不足 | 改一行参数,重算费用 |
| 降为两分制 | 三档以上分不清 | 牺牲分辨率 |
| 转人工 | 个别高风险 case | 每条几分钟 |
修 rubric 永远是第一反应:十次不达标里约六次是 judge 和人对"好"的定义没对齐——rubric 写着"回答准确、有帮助",人和模型对"有帮助"的理解差出一档。修法是把每个维度写成可核对的事实描述并配反例,例如"有帮助 = 给出下一步动作,仅复述政策不算"。
降为两分制是被低估的一招:三档判不对、通过/不通过判得对的 judge 非常常见,因为序数判断比程度判断容易得多。多数工程场景要的恰好只是"过/不过",分辨率损失是伪代价。兜底是转人工,但要圈定范围:金标集显示某类 case 的 kappa 特别低(比如长答案对比),就把这一类圈出来人工看,其余照走自动。
6、judge 元评测
校准回答"准不准",元评测回答"稳不稳"——一把每次读数都不同的尺,准无从谈起。
稳定性:同一输入原样判 5 次(temperature 大于 0 时尤其必要),看分数方差:
# meta_stability.py —— 同输入多次判分,量 judge 噪声
import statistics
scores = [judge_once(case) for _ in range(5)] # 复用打分 judge
print(f"分数 {scores}")
print(f"标准差 {statistics.stdev(scores):.2f}")
满分 5 的打分 judge,标准差长期大于 0.7 就是坏尺——先修它(降 temperature、加锚定),再谈偏差。对判式 judge 的等价指标是重复判的翻转率。
敏感性是稳定性的搭档:把答案做实质性微扰(删掉一条关键步骤、改错一个数字),判分应当跟着变;做无关扰动(换个同义词),判分应当不变。理想的 judge 对前者敏感、对后者钝感。两类扰动各做 20 条画成二乘二矩阵,过敏与钝感一目了然:钝感的 judge 会把改坏的答案放行,过敏的 judge 会让任何改动都无法通过回归。修法也不同——钝感修 rubric 颗粒度,过敏修判定阈值。
7、人工标注工程
金标集的质量取决于标注工程。人工标注是 judge 唯一的地面真值,但它自己也会烂。
标注指南要写到新标注员不经讨论就能上手:每个维度一段可核对的定义、两个边界样例、冲突时的优先级(正确性高于完整性,完整性高于风格)。指南最常见的问题是写成价值观("回答要有帮助"),而不是操作标准("含下一步动作")。
双人标注加仲裁是质量保险:两人独立标同一批,人人一致率低于 85% 先修指南再继续——人和人都对不齐,说明题目本身歧义;不一致条目由第三人仲裁定案。人机一致率的上限就是人人一致率,这个数字要和 kappa 记在同一张表上。
众包质量控制三件套:埋约 10% 已知答案的金标题,错一题即废此人整批标注;每批抽 5% 复核;按质量而非纯数量结算。内部标注同样适用,只是样本量小些。标注工程是 EDD 体系的地基工程——judge 的 kappa、校准、元指标全部压在它上面。
8、总结
judge 的可信度不是买模型送的,是测出来、校准出来的。谱系上盯四类偏差:位置、长度、自我偏好、宽严,每一类都有公开实验证据,也都能自查。自查跑三个实验:换序重判测位置、注水对判测长度、跨厂交叉验偏好。缓解分两层:便宜的换位判加去偏提示——前者治本、后者效果有限要如实承认;花本钱的锚定样例加 50 条金标集,用 Cohen's kappa 验收,0.6 是可用线。不达标先修 rubric,再换模型、降两分制,最后转人工。judge 自身还要过元评测,稳定性与敏感性双达标才准上岗;而这一切的地基是人工标注工程。
留两个练习:
- 从现有评测集抽 30 条,跑 2.1 的换序实验,报告一致率与偏前/偏后的计数
- 人工标 20 条金标,算 judge 的 kappa,写一页报告:不达标的先修 rubric 再复测
对于已经在用 judge 出报表的团队,建议本周先跑第一个实验——换序一致率低于 80% 的 judge,它报出的每一个百分比都值得重新看一眼。

