R01 最小可运行·100 行 LLM-as-Judge
R01 最小可运行·100 行 LLM-as-Judge
读懂了 A04 里位置偏差 35%、自我增强偏差 10–25% 这些数字,不等于你能搭出一个不被这些偏差骗到的 judge。本节点要解决的问题是一个默会知识(tacit knowledge)问题:position bias 不是论文里的一个百分比,而是你亲手把同一对回答 A/B 换序跑两遍、看到 judge 改了主意时,那种”原来真会变”的肉身确认。本节用的框架是「先跑通最小骨架,再用它复现论文里的偏差,最后用人工小样本校准它」——三步走,每一步的产出都是一个你能贴在 PR 里、能在选型会上摊开的具体数字,而不是一句”我们用了 LLM-as-Judge”。给的代码是 100 行级别、能直接 python judge.py 的骨架,但每一行都对应 A04 讲过的一个判断。
[!warning] 本节点的隐藏论点:判断密度不在代码里,在你跑通之后的回看里。 同样一份 100 行代码,没跑过的人抄走当模板,跑过的人会发现自己的 Kappa 只有 0.51——后者才真正”学会了 LLM-as-Judge”。这正是结尾”demo≠生产”清单存在的理由。
§0 为什么是”先跑偏差复现”框架,而不是”先搭评估管线”框架
业界教程的默认框架是「搭管线」:第一步接 API,第二步写 prompt,第三步批量跑,第四步出报表。这个框架在 demo 阶段无往不利,却埋了一颗雷——它默认 judge 的读数是可信的,把全部精力花在”跑得快、跑得多”上,从不验证”跑得准”。 等你拿着漂亮的报表去做上线决策,才发现这把尺自己是歪的(A04 的三大系统偏差),而管线越高效,错误结论传播得越快。
正确的框架是「先复现偏差,再信任读数」。具体说:在你写任何批量逻辑之前,先用最小骨架做一件事——拿同一对回答,换序跑两遍,亲眼看 judge 翻不翻供。这一步不产出任何”评估结果”,它产出的是对这把尺的信任度本身。Zheng et al.(2023, MT-Bench/Chatbot Arena, NeurIPS 2023, arXiv:2306.05685)推荐的”双向各评一次、仅计双向一致的裁决”,在论文里是一句方法描述,在代码里是一个 for order in [AB, BA] 的循环——但只有你真跑出”35% 的对子在换序后结论反转”,你才会从心里接受:单向跑出来的偏好榜,有三分之一是位置噪声。 这个框架的全部价值是把顺序倒过来:可信度优先于吞吐量。先证明尺是直的,再用它量东西。
§1 三件最小可运行的事:pointwise、pairwise、position-debias
一个最小 judge 要能做三件事,对应 A04 里三种被反复测量的范式:
| 能力 | 输入 | 输出 | 对应 A04 | 最小代码量 |
|---|---|---|---|---|
| Pointwise 打分 | 单条回答 + rubric | 1–5 分 + 理由 | reference-based / rubric judge | ~15 行 |
| Pairwise 偏好 | 两条回答 A/B | A 胜 / B 胜 / 平 | prompt 式通用 judge | ~15 行 |
| Position-debias | 同一对,换序两遍 | 双向一致才算数 | Zheng 2023 标准缓解 | ~10 行包裹 |
三条设计判断(这是骨架与”随便 prompt 一下”的分界):
- rubric 必须显式化,不能让 judge 自由发挥。 Zheng et al. 2023 的数据:数学题默认 prompt 评分失败率 70%,给参考答案降到 15%。在代码里这意味着 prompt 不是”请评价这个回答”,而是一张带锚点描述的评分量表(5 分=完全正确且…,3 分=部分正确但…)。rubric 化是最便宜的可靠性杠杆,写在 prompt 模板里几乎零成本。
- 强制结构化输出(JSON),不要让 judge 写散文你再正则抠分。 散文输出无法稳定解析,且会诱发 verbosity bias 的镜像问题——judge 自己也变啰嗦。要求
{"score": 4, "reason": "..."}。 - position-debias 是一个包裹函数,不是一个 prompt。 它在 pairwise 外面包一层:同一对跑 AB 和 BA 两次,只有两次都说”前者赢”或都说”后者赢”才记为有效裁决,否则记为 tie/inconclusive。这一层是 §0 框架的代码落地,也是 90% 教程省略的那 10 行。
§2 100 行骨架(可直接跑)
下面是一个用 Anthropic Claude API 的最小实现(OpenAI SDK 同构,换 client 与 model 名即可)。依赖只有官方 SDK。
[!note] 接地说明:模型 id、SDK 调用形态请以官方文档为准——本骨架写作时按
anthropicPython SDK 的messages.create形态给出,具体可用 model 名(如claude-*系列)随版本变化,运行前务必核对当前文档,本节不锚定某个会过期的具体 model id〔以官方文档为准〕。
# judge.py —— 最小可运行 LLM-as-Judge:pointwise + pairwise + 位置偏差缓解
import json, os
from anthropic import Anthropic
client = Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
MODEL = os.environ.get("JUDGE_MODEL", "claude-<填当前可用模型>") # 运行前核对官方文档
def _ask(prompt: str) -> dict:
"""要求 judge 返回结构化 JSON,失败则降级为 inconclusive。"""
resp = client.messages.create(
model=MODEL, max_tokens=512, temperature=0, # 评判要可复现,temperature=0
messages=[{"role": "user", "content": prompt}],
)
text = resp.content[0].text.strip()
try:
return json.loads(text[text.index("{"): text.rindex("}") + 1])
except Exception:
return {"error": "parse_failed", "raw": text}
# ---------- Pointwise:rubric 化打分 ----------
POINTWISE_RUBRIC = """你是严格的评测员。按以下 rubric 给回答打 1-5 分:
5=完全正确、直接解决问题、无事实错误;4=基本正确、有小瑕疵;
3=部分正确、关键点缺失;2=大体错误但有可取之处;1=完全错误或答非所问。
只输出 JSON:{{"score": <int 1-5>, "reason": "<一句话依据>"}}
问题:{q}
回答:{a}"""
def pointwise(q: str, a: str) -> dict:
return _ask(POINTWISE_RUBRIC.format(q=q, a=a))
# ---------- Pairwise:两两偏好(单向) ----------
PAIRWISE = """你是严格的评测员。判断对于该问题,回答1 和 回答2 哪个更好。
评判标准:正确性 > 完整性 > 简洁性。不要因为回答更长就认为更好。
只输出 JSON:{{"winner": "1"|"2"|"tie", "reason": "<一句话依据>"}}
问题:{q}
回答1:{a1}
回答2:{a2}"""
def _pairwise_once(q: str, a1: str, a2: str) -> str:
r = _ask(PAIRWISE.format(q=q, a1=a1, a2=a2))
return r.get("winner", "tie")
# ---------- 位置偏差缓解:换序各评一次,仅计双向一致 ----------
def pairwise_debiased(q: str, a_x: str, a_y: str) -> dict:
"""X、Y 为待比较的两个回答(与位置无关)。
第一遍 X 在前;第二遍 Y 在前(换序)。只有两遍都判同一个赢家才算数。"""
fwd = _pairwise_once(q, a_x, a_y) # 顺序:X=1, Y=2
rev = _pairwise_once(q, a_y, a_x) # 顺序:Y=1, X=2
# 把两遍的"位置号"翻译回 X/Y
fwd_winner = {"1": "X", "2": "Y", "tie": "tie"}[fwd]
rev_winner = {"1": "Y", "2": "X", "tie": "tie"}[rev]
if fwd_winner == rev_winner and fwd_winner != "tie":
return {"winner": fwd_winner, "consistent": True}
return {"winner": "tie", "consistent": False, # 换序后翻供 → 判平,记为不可信
"raw": {"forward": fwd_winner, "reverse": rev_winner}}
# ---------- 与人工小样本比对:算一致率 + Cohen's Kappa ----------
def cohens_kappa(judge_labels, human_labels) -> float:
"""两列标称标签(如 'X'/'Y'/'tie')的机会校正一致性。"""
n = len(judge_labels)
cats = set(judge_labels) | set(human_labels)
po = sum(j == h for j, h in zip(judge_labels, human_labels)) / n
pe = sum((judge_labels.count(c) / n) * (human_labels.count(c) / n) for c in cats)
return (po - pe) / (1 - pe) if pe != 1 else 1.0
if __name__ == "__main__":
# 演示:3 条人工已标注的金标准对子
gold = [
{"q": "1+1=?", "x": "2", "y": "等于2,因为...(啰嗦200字)", "human": "tie"},
{"q": "法国首都?", "x": "巴黎", "y": "里昂", "human": "X"},
{"q": "解释递归", "x": "函数调用自身直到基线条件", "y": "递归很重要", "human": "X"},
]
judge_out, human_out = [], []
for item in gold:
res = pairwise_debiased(item["q"], item["x"], item["y"])
judge_out.append(res["winner"]); human_out.append(item["human"])
flag = "" if res["consistent"] else " ⚠换序翻供"
print(f"Q={item['q'][:10]:12} judge={res['winner']:4} human={item['human']:4}{flag}")
print(f"\n原始一致率 = {sum(j==h for j,h in zip(judge_out,human_out))/len(gold):.2f}")
print(f"Cohen's Kappa = {cohens_kappa(judge_out, human_out):.2f} (<0.6 别上线)")
运行步骤(5 步,全程不超过 10 分钟):
pip install anthropic(或openai,二选一);export ANTHROPIC_API_KEY=...。- 把
MODEL改成你账号当前可用的 model 名(核对官方文档,别照抄占位符)。 python judge.py,看三件事:每对的 judge 判决、有没有⚠换序翻供、底部的原始一致率与 Kappa。- 故意做一次破坏性实验:把
pairwise_debiased换成只调_pairwise_once(单向),把第一条”啰嗦 200 字”的 y 改得更长,看 judge 会不会被 verbosity 带偏、Kappa 掉多少——这一步是本节点的灵魂,见 §4。 - 扩到 20–50 条你自己业务的金标准对子,重跑,记下 Kappa。低于 0.6(Landis & Koch 的”实质性一致”门槛,见 Cohen Kappa 系数)就别拿这把尺做决策。
§3 三条必须亲手验证的现象(论文数字 → 你的终端)
代码跑通只是开始。下面三个现象,论文给了数字,但你必须在自己终端看见,否则你只是”读过”而非”会用”:
| 现象 | 论文锚点 | 你该看到的 | 怎么逼出来 |
|---|---|---|---|
| 位置偏差真的存在 | GPT-4 换序改判约 35%(Zheng 2023, Table 2〔具体数值待对照原文核实〕) | 你的 consistent: False 占比 | 跑 30+ 能力接近的对子,数翻供率 |
| 能力差距大时偏差消失 | 差距大时位置偏差几乎消失(Zheng 2023 的定性结论;该场景一致率的精确值见 Table 2〔待对照原文核实〕) | 巴黎 vs 里昂这类对子从不翻供 | 对比”势均力敌对”与”碾压对”的翻供率 |
| 冗长偏差会污染读数 | 注水(verbosity)攻击对弱 judge 的成功率显著高于强 judge(Zheng 2023 研究了 verbosity attack;逐模型成功率见原文表〔待对照原文核实〕) | 把正确答案配啰嗦废话,Kappa 下降 | §2 步骤 4 的破坏性实验 |
最后一行最关键。Zheng et al. 2023 同时报告:强 judge(如 GPT-4)对注水攻击的抵抗力明显更强〔逐模型失败率的精确数字见原文表,待对照核实〕——所以你用不同 judge 模型跑同一组破坏性实验,会得到完全不同的 verbosity 脆弱度。这就是为什么”选哪个 judge”不能看排行榜,要看它在你的破坏性测试上的表现。
§4 判断主轴 · 100 行 demo 跑通后最容易自欺的四个点
[!warning] 这是本节点的命门。代码能跑 ≠ 读数可信。下面四点,每一条都是”demo 看着完美、生产里悄悄撒谎”的典型,且都极隐蔽——因为终端输出一片绿。
致命点一:只跑单向 pairwise,把位置噪声当偏好信号
- 症状:图省事,
pairwise_debiased嫌慢(要调两次 API),直接用_pairwise_once批量跑,出了一份漂亮的模型偏好榜。 - 为什么会错:Zheng et al. 2023 测得位置偏差普遍存在、且因 judge 模型而异——较弱的 judge 换序一致性显著低于 GPT-4(逐模型一致率见 Zheng 2023 Table 2〔待对照原文核实〕;定性上较弱模型换序后会有相当比例对子翻供)。这意味着单向榜里有可观比例的”偏好”是位置噪声,不是质量信号。你省下一半 API 调用,换来一份明显失真的结论——而它看起来和真的一模一样。
- 正确做法:永远走
pairwise_debiased,换序不一致的一律降级为 tie 并单独统计inconsistent_rate。这个不一致率本身就是 judge 在这个任务上不可信程度的直接读数——它高于 30% 说明这把尺在这类任务上根本不该用。 - 真实反例:Shi et al.(IJCNLP-AACL 2025, arXiv:2406.07791,15 个 judge、>150,000 实例)发现,即便用了双向评测,代码评测里仅靠换序仍能造成 >10% 的准确率波动——所以双向也不是免死金牌,它是底线不是上限。照搬”我做了双向就安全了”同样是错的。
致命点二:用原始一致率自我感觉良好,不看 Kappa
- 症状:终端打印”原始一致率 = 0.85”,团队欢呼”达到人类水平了”(人类专家间原始一致率约 81%〔Zheng 2023 引用的人类标注者间一致率,具体值待对照原文核实〕,Zheng 2023)。
- 为什么会错:原始一致率不扣除随机碰巧一致。同一份 MT-Bench 数据,GPT-4 的 Cohen’s Kappa 只有 0.84,人类互评是 0.97(Eugene Yan 综述, eugeneyan.com, 2024)——差距比 85% vs 81% 大得多,方向还相反。更阴的是 kappa paradox(Feinstein & Cicchetti, 1990, J Clin Epidemiol):当你的金标准里某一类标签占绝对多数(〔示意,非论文原数字〕比如 80% 的对子人工判”tie”),原始一致率会虚高、Kappa 却可能大幅塌缩——这是该论文揭示的”高一致率、低 Kappa”悖论的方向,具体数字随分布而变,此处仅作示意。§2 代码里我特意把 Kappa 打在原始一致率旁边,就是逼你别只看前一个数。
- 正确做法:始终同时报 Kappa(或类别极不平衡时用 Krippendorff’s α / Gwet’s AC1,见 本专题 A05),对照 Landis & Koch 阈值(0.61–0.80 实质性,0.81+ 近乎完美)。把”judge 达到人类水平”重述为”judge 的 Kappa 还差人类一个档位”。
- 真实反例:A04 已记录的 Llama-3-8b——80% 原始一致率配 0.62 Kappa。任何只看第一个数字的人都会把它高估两档。
致命点三:金标准只有”易分对子”,校准出虚高的可信度
- 症状:为了让 Kappa 好看,金标准里塞的全是”巴黎 vs 里昂”这种碾压对,Kappa 跑到 0.9,宣布 judge 可用。
- 为什么会错:能力差距极大时位置偏差几乎消失(Zheng 2023 的定性结论;该场景一致率的精确值见 Table 2〔待对照原文核实〕),judge 在这种对子上本来就不会错——你的 Kappa 测的是”judge 会不会判简单题”,而真实流量里全是势均力敌的难对子。这是用考试范围外的题给自己打高分。JudgeBench(Tan et al. 2024, arXiv:2410.12784,第一作者 Sijun Tan)的核心发现正是反面:在高难度对子上,GPT-4o 级模型表现仅略好于随机猜测。
- 正确做法:金标准必须按难度分层抽样,且包含足量”势均力敌对”(两个回答都不差、需要细粒度判断的)。分层报告 Kappa:易分对、难分对各一个数。难分对的 Kappa 才是 judge 真实可信度。
- 真实反例:JudgeBench 的设计出发点就是——众包人类偏好在高难度正确性判断上都不是可靠金标准,遑论 judge;只测易分对等于自欺。
致命点四:让 judge 评自己家的输出,self-preference 闭环还浑然不觉
- 症状:demo 里用 Claude 当 judge,评的恰好是 Claude 微调版 vs 某竞品,结论”我们更好”,皆大欢喜。
- 为什么会错:GPT-4 给自己风格输出胜率高 10%,Claude-v1 高 25%(Zheng 2023),机制是困惑度驱动的自我偏好——judge 偏好和自己风格相近、困惑度更低的文本(Wataoka et al. 2024, arXiv:2410.21819)。它不是在评质量,是在认亲。100 行 demo 完全看不出这点,因为终端不会告诉你”我偏心了”。
- 正确做法:交叉厂商评判——选手是 Claude 系就用别家模型当 judge,反之亦然;或多 judge 投票并显式检查每个 judge 对”同源选手”的系统性加分。绝不用一个模型评判自己的输出做上线决策。
- 真实反例:Justice or Prejudice(Ye et al. 2024, arXiv:2410.02736)的 CALM 框架量化了 12 类偏差,self-enhancement 是其一,且该框架的总体结论是不同模型对各类偏差的鲁棒性高度不一致——即同一种偏差在不同 judge 上强弱悬殊。〔注:「GPT-3.5 完全测不出自我偏好、GPT-4 有」这一具体模型对比的确切出处待核实——可能来自 Zheng 2023、Wataoka 2024 或 CALM 三者之一,本节点不锚定到某一篇,只取”self-preference 因模型而异、不可跨模型照搬”这一已被多源支持的方向性结论。〕照搬”所有模型都偏心”或”都不偏心”都是错的,必须对你用的那个 judge 实测。
§5 产品 PM 视角补盲:100 行能证明什么、不能证明什么
工程视角容易把”跑通 demo”当成”搞定评估”。三个非工程的看走眼点:
- demo 证明了”能跑”,没证明”能省”。 这 100 行替代不了人工标注预算——它新增了一笔成本:你必须持续维护一批人工金标准来监控 Kappa 漂移(judge 模型升级、你的流量分布变化,Kappa 都会动)。把”上 judge”写进规划时,要留一批人工金标准的长期预算(量级〔经验估算〕:约 200–500 条,按任务难度分层后每层仍有统计意义所需——具体条数取决于类别不平衡程度与你要的 Kappa 置信区间,不是硬标准)(对照 m205 的黄金评估集工程),而不是”上了 judge 就不用人工了”。
- 可复现性是合规的隐性资产。 §2 代码里
temperature=0不只是为了好看的稳定数字——在安全/审核场景,监管问责时你要能重放当初那次判决。一个 temperature>0、prompt 没存档的 judge,事后无法复现自己的决定,举证时形同没有评估。安全 PM 要把”judge 调用可审计、可重放”当硬需求,不是 nice-to-have。 - judge 偏好 ≠ 用户偏好,别让高分误导路线。 judge 偏好长、结构化、markdown 漂亮的回答(verbosity + format bias);真实用户在客服、搜索场景常常要短平快。用 judge 分数优化出来的”高分版本”,可能正是用户嫌啰嗦的版本。 100 行 demo 跑出的漂亮分,不能直接当产品路线的依据——它是预筛信号,上线前要过真实用户 A/B。
§6 对手框架回应:接受 + 边界
本节点是一个”教人手搓 judge”的复现指南,最容易招来三类对手。逐一接受其对的部分,再标本节点坚守的边界。
对手一:“DIY judge 是重复造轮子”派(直接调库派)
立场:“现成的 RAGAS、DeepEval、Promptfoo、LangSmith 都封装好了 LLM-as-Judge,还自带 position-swap 和指标库,为什么要自己写 100 行?直接调库更专业、更省事。”
接受:在生产阶段这完全对。成熟框架在并发、重试、缓存、可观测性、指标覆盖(RAGAS 四维等)上远超手写脚本,生产管线就该用它们,别重造轮子——这也是本专题 R 系列后续节点(中型生产、进阶模板)要讲的方向。边界:但第一次就直接调库,你会跳过 §0 那个不可替代的步骤——亲手看 judge 在你的数据上翻供、亲手算出 Kappa 0.51。框架把偏差缓解封装了,封装的代价是不可见:你不知道它默认是否换序、用什么解析、Kappa 怎么算的,于是你会无条件信任一个你没验证过偏差方向的黑箱。我的赌注是——手写一次 100 行的认知收益,远大于它省下的几小时;它把 A04 的抽象偏差变成你肉身验证过的事实,之后你再用任何框架,都会先问”它有没有做双向?它报的是一致率还是 Kappa?“——这个问题本身,就是这 100 行买给你的判断力。先手写跑通,再上框架,顺序不能反。
[!warning] 这个赌注的失效场景(显式标注):若团队已有系统性的 eval 框架文档与培训(例如内部有成熟的 RAGAS/DeepEval 使用规范、有人专门讲过各指标的偏差方向),此赌注弱化——此时手写 100 行的边际认知收益,低于”直接调库 + 认真读框架文档 + 跑一遍框架自带的 position-swap 诊断”。换言之,这 100 行买的是”对偏差的肉身直觉”,当这份直觉已能从组织知识里低成本获得时,重写就成了仪式而非杠杆。判断依据:你团队里是否已经有人能在白板上画出 verbosity bias 的方向——能,则可跳过手写直接读库源码;不能,则手写仍是最便宜的入门。
对手二:“LLM-as-Judge 在高风险决策中根本不该用”派(废弃派)
立场(接近 NIST/监管侧与部分安全研究者的审慎立场):“judge 自身是一个有系统偏差、不可完全审计的黑箱测量仪。在医疗、信贷、内容安全这类高风险决策里,用一个会’认亲’、会被注水带偏、换序就翻供的模型去裁决另一个模型,是把不确定性叠加到不确定性上。这种场景应当废弃 LLM-as-Judge,回到人工或规则。”
接受:在终审、单点、不可逆的高风险决策上,这个立场是对的——本节点 §4/§5 反复强调 judge 是”会撒谎的尺”,正是同一警觉。我不主张拿这 100 行去对信贷拒批或内容封禁做最终裁决。边界:但”废弃”过头了——它把”不能做终审”误推成”完全不能用”。正确定位是预筛与回归监控:judge 做大规模、可逆、有人工兜底的第一道筛(筛出可疑样本交人工复核),而非最终签字。本节点的适用范围就此显式收窄:这 100 行的产出是”信任度读数 + 预筛能力”,不覆盖高风险终审场景;在那些场景里,本节点的价值是”用低 Kappa 证明这把尺还不够格上场”,而不是”上场”。
对手三:“人工评测不可替代,judge 是偷懒”派
立场(接近资深标注/语言学评测团队的立场):“任何机器裁决都会丢失人类评判里的语境、价值判断与边缘案例敏感性。真要严谨,就该人工双标注 + 仲裁,judge 省下的钱迟早以错误决策的形式还回去。”
接受:在金标准的建立这一环,人工确实不可替代——本节点 §2/§5 的整个 Kappa 校准逻辑,恰恰依赖一批人工金标准作为地面真值,judge 的可信度是相对人工标注定义的。没有人工,连”judge 准不准”都无从谈起。边界:但把人工当成所有环节的标准,在规模上不可行——每次模型迭代、每次流量漂移都全量人工重标,成本会压垮迭代速度。正确分工是人工定义金标准、judge 做放大与持续监控:judge 只在”已被人工锚定可信度(难分对 Kappa≥0.6)“的任务上承担预筛,越界(难分对、价值判断密集、长尾安全)就退回人工。本节点的边界因此再收一层:judge 只能做预筛而非最终决策,且其预筛资格必须由人工金标准持续背书——这正是 §5 第 1 点”200–500 条人工金标准长期预算”存在的理由。
§7 跨域呼应:默会知识——judge 的可信度只能在跑通中获得,不能在论文里获得
[!note] 跨域弹药:默会知识(Tacit Knowledge),Michael Polanyi《The Tacit Dimension》(1966) 核心命题:“We know more than we can tell.”——我们知道的,多于我们能言说的。
Polanyi 在这里不是装饰。他的核心论点是:有一类知识无法被完整编码成命题,只能通过亲身操作(performance)获得——骑自行车、辨认面孔、做实验。你读完所有关于骑车的物理学,仍然不会骑;你必须摔几次。这精确地诊断了 LLM-as-Judge 复现的本质困难。
具体怎么作用?A04 把三大偏差写成了命题知识:position bias 约 35%、verbosity 攻击对弱 judge 成功率高、self-enhancement 约 10–25%〔这些精确值的原文表格出处见 A04 与 Zheng 2023,待对照核实〕。这些命题你能背诵、能在面试里复述——但 Polanyi 会说,这恰恰是**“可言说的部分”,而它不等于你会用** judge。真正决定你能不能搭出可信 judge 的,是那部分默会的、只能在跑通中获得的判断:你的数据上翻供率到底多高?你的 rubric 写到什么颗粒度 judge 才不乱判?你的 Kappa 在难分对上掉到多少就该换 judge?这些没有任何论文能告诉你——它们是 Polanyi 说的”在操作中才浮现的知识”,是你跑了 §2 步骤 4 那个破坏性实验、看见 Kappa 从 0.8 掉到 0.5 的那一刻,才真正进入你身体的东西。
Polanyi 改变了我对这个节点的判断:它让”为什么非要手写 100 行”(§6 的赌注)从”动手党的偏好”升级为”认识论的必然”。因为 judge 的可信度判断属于默会知识,它在结构上无法通过读论文或调库获得——封装把可言说的部分给了你,却恰恰隐藏了那个只能靠亲手摔跤才能长出的默会判断。这也是为什么本专题把”复现指南”列为独立模块(§3 的依赖链:概念→架构→实例→复现):复现不是概念的应用题,它是一类无法被概念替代的知识来源。STS(科学技术论)里 Harry Collins 对 Polanyi 的著名延伸——复现一个实验所需的”默会的操作技艺”无法被论文里的 method 段完整传递,所以早期激光、引力波探测的复现都极其困难〔Collins 关于 TEA 激光复现的研究,具体出处待核实,降级为”据称”〕——正是同一个道理在评测工程上的投影:judge 的 method 段你能照抄,judge 的可信度你只能自己跑出来。
§8 PM 决策启示
- 面试:被问”你会怎么落地 LLM-as-Judge”,别只说调 RAGAS。说:“我会先手写一个最小 judge,拿同一对回答换序跑两遍验证位置偏差,用 20–50 条人工金标准算 Cohen’s Kappa 而非原始一致率,难分对的 Kappa 低于 0.6 就不上线,再交叉厂商评判防自我偏好。“——这一句话证明你真跑过,而不是读过。
- 选型:评估供应商或开源 eval 框架时,先问它默认做不做双向换序、报一致率还是 Kappa。答不上来或只报原始一致率的,它的”高准确”要按位置偏差打三折看。
- 复现:把本节点的 100 行当你团队 eval 能力的入门考——任何要搭评估管线的人,先让他跑通这 100 行并解释清楚为什么
pairwise_debiased比_pairwise_once多调一次 API。解释不清的,还没准备好碰生产 eval。
§9 与已有节点的关系
- 对照 本专题 A04:操作化落地。 A04 建立了”judge 是有系统偏差的测量仪器”框架并给出三大偏差的数字。本节点不复述这些数字,而是把它们变成可执行代码:position bias →
pairwise_debiased包裹函数;Kappa 陷阱 → 终端同时打印两个数的设计;self-preference → §4 致命点四的交叉评判规则。A04 是”为什么”,R01 是”亲手做一遍才信”。 - 对照 Cohen Kappa 系数:从公式到代码到决策门槛。 Kappa 节点讲清了 κ=(p_o−p_e)/(1−p_e) 的统计含义。本节点把它写成 12 行可跑函数,并落地为一条硬规则——难分对 Kappa<0.6 不上线,给 Kappa 一个具体的工程触发器。
- 对照 m205:补前置。 m205 讲 RAGAS 四维如何集成进 CI/CD。本节点是它的前一站:在你信任 RAGAS(底层全是 LLM-as-Judge)之前,先用这 100 行验证你的 judge 在你的数据上 Kappa 够不够——否则 CI/CD 里跑的是一把没校准的尺。
- 对照 c14:动手版补缺。 c14 列了 judge 三偏见和 AB 换序、多厂商交叉的缓解方案。本节点补 c14 没有的那一层——怎么用代码真的做出 AB 换序、怎么用 Kappa 量化”做了之后到底信不信”。c14 是清单,R01 是清单的可执行版。
§10 关联节点
核心(必读)
- A04 LLM-as-Judge —— 本节点的母节点,三大偏差的”为什么”,R01 是它的”亲手做”
- Cohen Kappa 系数 —— §2 代码里
cohens_kappa的统计根据,上线门槛 0.6 的来源(已确认 vault 内0401AI 基础知识库/存在该节点) - A05 人工评测与标注一致性 —— 金标准怎么标、类别不平衡时改用 α/AC1〔同专题节点,已在本批草稿中,入库后即 resolve〕。正文不依赖该链接获取关键知识:本节点 §2 步骤 5 与 §4 致命点二已内嵌说明——金标准要分层抽样、类别极不平衡(如多数判 tie)时原始一致率会骗人、应改报 Krippendorff’s α 或 Gwet’s AC1;A05 是这一做法的系统展开,不读也不影响 R01 自洽。
- m205 - RAG 生产环境:索引运维与评估体系 —— RAGAS 即 judge 的生产封装,R01 是它的校准前置
延伸(可选)
- c14 - 模型评估体系与 Goodhart 陷阱 —— judge 缓解方案的 PM 清单版
- A03 Benchmark 与数据污染 —— 为什么需要自建 judge 而非信榜单〔同专题节点,已在本批草稿中,入库后即 resolve〕。内嵌说明:榜单分数可能被训练数据污染、且与你的真实流量分布不一致,所以需要在你自己的金标准上自建 judge 校准——这是本节点 §3「论文数字 → 你的终端」的前提,不读 A03 也能理解 R01 为何坚持”在你的数据上重测”。
- A06 Goodhart 与指标失效 —— judge 分数一旦成目标即失真,破坏性实验的认识论背景〔同专题节点,已在本批草稿中,入库后即 resolve〕。内嵌说明:一旦把 judge 分数当成优化目标,模型会学会”取悦 judge”(如刷长度、刷 markdown)而非真正变好——这正是 §5 第 3 点”judge 偏好≠用户偏好”与 §2 步骤 4 破坏性实验背后的 Goodhart 逻辑,不读 A06 也不影响理解。
- 幻觉 —— judge 自身校准失准是其偏差的前提(已确认 vault 内
0401AI 基础知识库/存在该节点) - m207 - Agent 产品化:场景推演与失败模式 —— Agent 评估同样靠 judge,归因更难,本节点是其评估基件
- Agent 产品评估的五个具体问题 —— 评估方法论的 PM 工作版,与本节点的复现版互补
§11 「demo≠生产」反例清单(本节点强制结尾)
[!danger] 这 100 行能让你理解 judge,但直接搬上生产会出事。下面每一条都是 demo 通过、生产翻车的真实落差。把这张表贴在拿 demo 去说服老板”评估搞定了”之前。
| # | demo 里没事 | 生产里会出事 | 论文/证据锚点 |
|---|---|---|---|
| 1 | 3 条对子手动跑,串行无所谓 | 上万条对子串行 + 每对调 2 次 API,跑一夜跑不完、还撞 rate limit | —— 工程常识 |
| 2 | json.loads 偶尔失败无所谓 | 生产里解析失败率累积,silent 丢样本,报表数字凭空缩水 | —— 结构化输出脆弱性 |
| 3 | temperature=0 看着稳 | 不同时间、不同 model 版本,同一 prompt 判决会漂移;judge 模型升级一次,全部历史分数不可比 | judge 是 model×任务的函数(Shi et al. 2025, arXiv:2406.07791) |
| 4 | 双向换序做了就安心 | 代码类任务里换序仍致 >10% 准确率波动;双向是底线不是免疫 | Shi et al. 2025 |
| 5 | Kappa 0.85 很漂亮 | 金标准全是易分对,难分对 Kappa 可能仅略好于随机 | JudgeBench:高难度对仅略好于猜(Tan et al. 2024, arXiv:2410.12784) |
| 6 | 用 Claude 评 Claude,分高 | self-preference 让同源选手虚高 10–25%,上线决策被污染 | Zheng 2023;Wataoka 2024 (arXiv:2410.21819) |
| 7 | rubric 写得糙也能出分 | 数学/推理任务默认 prompt 失败率 70%,没参考答案的 judge 在硬任务上不可信 | Zheng 2023(默认 70%→参考 15%) |
| 8 | 没存 prompt/版本也能跑 | 监管问责时无法重放判决,评估等于没做;judge prompt 一改,前后分数不可比 | —— 合规与可复现性 |
| 9 | 跑一次 Kappa 够了 | 流量分布漂移 + judge 模型迭代,Kappa 会衰减,需持续监控金标准回归 | —— 见 §5 校准成本 |
| 10 | 偏好分高 = 产品好 | judge 偏好长/markdown,与真实用户”短平快”需求错位,高分版本可能被用户嫌弃 | verbosity/format bias(Saito 2023, arXiv:2310.10076;LMSYS Style Control 2024-08-28) |
一句话:这 100 行的价值是让你信任或不信任一把尺,不是这把尺本身能上生产。它产出的最有用的东西,往往是一个让你决定”先别上”的低 Kappa。
§12 修订日志
-
R0(2026-06-06)初稿:建立”先跑偏差复现、再信任读数”框架(§0),对立”先搭管线”默认框架;给出 100 行可运行骨架(pointwise rubric 化 + pairwise +
pairwise_debiased换序缓解 +cohens_kappa12 行实现),含 5 步运行说明与”破坏性实验”步骤 4;§3 三现象表把 Zheng 2023 的 35%/98.8%/91.3% 落到终端可见;判断主轴四件套四致命点(单向当信号 / 原始一致率自欺 / 金标准只塞易分对 / self-preference 闭环),每点配症状-为什么-正确做法-真实反例并接地(Shi 2025、Eugene Yan 2024、JudgeBench 2024、Justice or Prejudice 2024、kappa paradox Feinstein&Cicchetti 1990);§5 PM 补盲三点(校准成本/可复现合规/judge≠用户偏好);§6 对手框架”现成框架派”接受+边界并显式承担”先手写再上框架”赌注;§7 跨域呼应 Polanyi 默会知识具体展开为”judge 可信度在结构上无法靠读论文/调库获得”,并接 Collins STS 复现技艺;与 A04/Kappa/m205/c14 四处显式升级对照;强制”demo≠生产”10 行反例清单(§11)。待核实项:(a) 具体可用 model id 未锚定,标注以官方文档为准;(b) Collins TEA 激光复现的具体出处未在证据包确认,已降级为”据称”并标〔待核实〕;(c) A03/A05/A06 同专题链接待各节点入库后 resolve。 -
R1(2026-06-07)批评修订:按 Round-1 critique(六维 7.67,mustFix×4 + shouldFix×6 + groundingFlags×5)就地修订:
- M1 作者编造硬错误(一票否决项 #1):§4 致命点三、§11 第 5 行的 JudgeBench 作者「Ye/Tan et al. 2024」全部改为正确归属「Tan et al. 2024(第一作者 Sijun Tan)」。JudgeBench(arXiv:2410.12784)与 Justice or Prejudice(Jiayi Ye, arXiv:2410.02736)是两篇不同论文,原稿混用两位第一作者,构成作者编造,已分离。
- M2 不可独立核实的精确数字降级:Claude-v1 换序一致性 23.8%(§4 致命点一)、能力差距大时一致性 98.8%(§3 表 + §4 致命点三)两个无法在证据包独立核实的精确值,全部改为 Zheng 2023 的定性结论 + 「具体数值见 Table 2〔待对照原文核实〕」,不再伪装成确证数字。§3 表与 §7 中 verbosity 91.3%/8.7% 同步降级为”强 judge 抵抗力更强〔逐模型精确值见原文表,待核实〕”。
- M3 对手立场补足至 3 处(E 维出版线):§6 从 1 派(直接调库派)扩为 3 派——新增「LLM-as-Judge 高风险决策废弃派」(接受不做终审、显式收窄本节点适用范围为预筛/回归监控)与「人工评测不可替代派」(接受人工定义金标准、judge 只做预筛而非最终决策的边界)。
- M4 双链死链核查(一票否决项 #4):对照 vault 实际文件确认 Cohen Kappa 系数(0401AI 基础知识库/)与 幻觉(0401AI 基础知识库/)均真实存在(仅未登记进索引.md,非死链),已在 §10 标注确认;A03/A05/A06 三条为同批草稿内的前向引用,入库后即 resolve,并已在 §10 为三者各补内嵌说明,使正文不依赖链接获取关键知识。全文 10 个唯一双链目标经 find 校验 100% resolve。
- shouldFix:§6「先手写再上框架」赌注补 failure-scenario callout(团队有系统性框架培训时此赌注弱化);§5「200–500 条金标准」标〔经验估算〕并说明随类别不平衡度而变;§4 kappa paradox 的「80% 判 tie」标〔示意,非论文原数字〕并补期刊出处;§4 致命点四「GPT-3.5 无自我偏好、GPT-4 有」这一具体对比归因存疑,改为取 CALM「鲁棒性因模型而异」的方向性结论 + 显式标注具体出处待核实,不锚定单篇。
- 未改:§1/§11 的数学题 70%→15% rubric 数字(critique 未列为 mustFix,且与证据包不冲突,保留 Zheng 2023 归属)。本轮目标:mustFix 全清、消除一票否决触发、综合分回到出版线 ≥8。