Chapter 02
方法:怎么产出一个分数,以及凭什么相信它
上一章建立了『评什么』的四层模型——这章解决『怎么评』:在有/没有标准答案两种情形下产出分数,并回答一个常被跳过的问题:判分器本身可信吗?
本章你将建立的 schema
- 答案空间是否封闭,决定了用 reference-based 还是 LLM-as-a-judge——前者测词汇重叠、后者测语义质量。
- judge 有 position / verbosity / self-enhancement 三大可命名偏差,每个都有对应的缓解手段;但最危险的偏差是 judge 与 generator 共享的盲点。
- 一个 judge 在对人工标注的 golden set 用 Cohen's κ 校准过之前不可信;它的上限是人与人之间的一致率。
这一章是把第 1 章的「评什么」翻译成「怎么评」的一章。第 1 章把要测的东西分成四层模型——其中 outcome 层(任务最终成没成)和 component 层(单步检索 / 单次工具调用对不对)正是本章方法各自落地的地方:有客观答案的 outcome 与 component 信号用 reference-based 打分,开放式的 outcome 质量用 LLM-as-a-judge。本章先讲两类打分方法本身,再用一整节讲一个常被跳过的问题——判分器自己可信吗。读者读完应当能为一个任务挑出打分方法,同时能说出「在我拿这个 judge 对着人类校准过之前,我不信它」。
2.1有标准答案时:reference-based 打分
reference-based 打分把模型输出和一个已知的「正确答案」(reference)做机械比对,给出一个不需要任何模型来评判的客观分数。
当任务有唯一或近乎唯一的正确答案时,引入一个 LLM judge 既贵又引入噪声。reference-based 打分是确定性的、可复现的、零成本的——同一对(输出,答案)今天和明天算出来的分一模一样。这正是 第 1 章 component 层那些「单步对不对」的信号,以及 outcome 层里有标准答案的任务,首选的度量方式。
四种主力做法
exact match(精确匹配):输出字符串与答案逐字符相等才算对,否则算错。抽取式问答、分类标签、枚举型字段用它。它最严格——「Paris」和「Paris.」(多一个句点)都算错,所以通常配一层归一化(去标点、统一大小写、去首尾空格)。
F1(token overlap,词级重叠):把输出和答案都切成 token 集合,precision = 命中的 token 占输出的比例,recall = 命中的 token 占答案的比例,F1 是两者的调和平均。它比 exact match 宽容:答案是「the capital of France」、输出是「capital of France」时 exact match 给 0,F1 仍给高分。SQuAD 等抽取式 QA 基准的标准指标就是 exact match + F1 并列。
状态比对(state comparison):当任务的产物是一个可枚举的状态——数据库被改成什么样、文件系统里多了哪些文件、购物车里最终有哪几件商品——就不比文本,直接比对执行后的世界状态是否等于期望状态。这是 agent 任务里最贴近 outcome 层的客观信号:不管 agent 中间怎么绕,只看终局状态对不对。
code:跑测试就是最干净的 eval。当模型输出的是代码,最干净的判分不是比对文本,而是把测试跑一遍——通过 / 不通过是一个完全客观的二元信号,不需要任何人或模型来解读。代码生成的事实标准基准(HumanEval、MBPP、SWE-bench)全部用执行单元测试来打分。这也是为什么「能转成代码 + 测试」的任务,eval 设计上是最幸运的。
BLEU 与 ROUGE:n-gram 时代的两个遗产
在 LLM judge 出现之前,机器翻译和摘要靠两个 n-gram 重叠指标打分,今天仍会在论文里遇到:
- BLEU(n-gram precision,偏精确率):机器翻译指标。看译文里的 n-gram(连续 n 个词)有多少能在参考译文里找到,再乘一个对过短译文的惩罚。核心是 precision——「生成的词组里,有多少在参考译文里也出现」。
- ROUGE(n-gram recall,偏召回率):摘要指标。反过来看参考摘要里的 n-gram 有多少被生成摘要覆盖到。核心是 recall——「参考摘要里该覆盖的要点,被盖住了多少」。
exact match、F1、BLEU、ROUGE 看似各异,机制其实同一个:把语言当成 token 的袋子或序列,数重合。它们完全不理解语义。后果是语义等价问题——「Paris」和「法国首都」指同一个实体,但 token 零重合,F1 给 0.0;一句被同义改写、意思完全没变的回答,会因为换了词而被狠狠惩罚。reference 漏列了一个等价的正确答案,正确输出照样得 0。所以这类方法只在答案空间封闭时才有效:抽取式 QA(答案是原文里的一个片段)、分类(标签集有限)、代码(行为由测试定义)。一旦答案可以有无穷多种正确的表达方式——开放式问答、摘要质量、对话得体性——词汇重叠就和真实质量脱钩了。这条裂缝正是下一节 LLM-as-a-judge 存在的全部理由。
F1 = 0.0。注意:这类指标测的是字面重合、不是语义;底部那行边界条件是它们的适用范围——只有答案空间封闭(标签、片段、代码)时词汇重叠才约等于质量,一旦答案能有无穷种说法就彻底脱钩。| 方法 | 测的是什么 | 何时有效 | 何时失效 |
|---|---|---|---|
| exact match | 归一化后逐字符相等 | 分类标签、枚举字段、短抽取答案 | 答案有多种合法表述(同义、改写、格式差异) |
| F1(token overlap) | 输出与答案的 token 集合重合度 | 抽取式 QA、答案是原文片段 | 「Paris」vs「法国首都」——同义但 token 不重合,给 0.0 |
| 状态比对 / code 测试 | 执行后的世界状态 / 测试通过与否 | agent 终局状态可枚举;输出是代码 | 产物无法转成可断言的状态或测试(如「写一段有感染力的文案」) |
| BLEU(n-gram precision) | 译文 n-gram 在参考里的精确率 | 机器翻译、有参考译文 | 开放生成;与人类判断相关性弱 |
| ROUGE(n-gram recall) | 参考要点被生成覆盖的召回率 | 抽取式 / 短摘要 | 抽象式摘要——换一种说法盖住要点也被扣分 |
一个客服 agent 被问「你们支持退货吗」。golden answer 写的是「支持,30 天内无理由退货」,agent 答的是「可以的,下单后一个月内都能退」。用 F1 打分会得到什么?这说明 reference-based 在客服场景的什么局限?
展开答案(先停 10 秒再点)
F1 会很低:两句话语义几乎等价,但共享的 token 很少(「退」算一个,其余几乎不重合,「30 天」和「一个月」连数字都对不上)。客服回答是开放式的——同一个正确意思有无数种说法,答案空间不封闭。
这正是表 2.1 最后两行揭示的失效区:词汇重叠和语义质量脱钩。这种任务不该用 reference-based,得交给下一节的 LLM-as-a-judge——让一个会读语义的模型来判「这个回答在事实上对不对、得不得体」。
2.2没标准答案时:LLM-as-a-judge
LLM-as-a-judge(用大模型当裁判)让一个 LLM 按给定标准去评判另一个模型的输出,把「读懂语义再打分」这件人类才会做的事自动化。
开放式输出——摘要、对话、长文回答、agent 的最终交付——没有唯一正确答案,reference-based 在这里失效(§2.1)。靠人工逐条评是金标准但慢且贵,跑不动 CI、扛不住每天上千条回归。LLM-as-a-judge 是开放式打分的主力方法:它能读懂语义、按 rubric 给出可解释的判断,且能规模化。代价和偏差是后两节的主题。
用 LLM 当裁判有三种模式,区别在于喂给 judge 什么、要它吐出什么形状的结果。三种模式的可扩展性、信号粒度、对噪声的敏感度各不相同。
pointwise:按 rubric 给单个输出打分
给 judge 一个输出加一份评分准则(rubric),要它输出一个绝对分(如 1–5)。优点是 O(n)——n 个输出评 n 次,线性扩展,能直接跑 CI、能给单条样本一个可记录的分数。代价是绝对分会漂移:同一个 judge 在不同批次、不同 prompt 措辞下对「4 分」的理解会变;而且它抓不住小差距——两个质量明显有别的回答会双双被打成 4 分,因为绝对刻度太粗。
pairwise:A/B 谁更好
给 judge 两个输出,只问「哪个更好」。优点是信号最细——人类对「A 比 B 好」的判断远比对「A 值几分」的判断稳定,相对偏好天然消除了绝对刻度的漂移。Chatbot Arena 的排行榜就建立在海量 pairwise 对战上。代价有两个:一是 O(n²),n 个候选两两比较要 ~n² 次调用,贵;二是对顺序敏感——judge 会系统性偏爱排在前面的那个(position bias,§2.3)。
reference-guided:把 gold answer 塞进 prompt
在 pointwise 或 pairwise 的基础上,额外把一份标准答案(gold answer)放进 judge 的 prompt,让它「对照着这份正确答案来评」。它只在任务有客观解时可用——数学题、有标准步骤的推理题、有正确事实的问答。一旦可用,它能大幅提升可靠性:Zheng 等人(MT-Bench)发现,对数学 / 推理这类题,给 judge 提供参考答案能把 judge 的失败率显著压下来,因为 judge 不必自己重新推一遍正确答案——它只要做对照。
模式越细、信号越好,调用就越贵。pointwise 是 O(n) 的线性成本;pairwise 是 O(n²)——10 个模型两两对战要 ~45 场,100 个就要 ~4950 场,成本平方级膨胀,所以实践中常用 Elo / Bradley-Terry 之类的采样和排序技巧来减少必须真打的场次。reference-guided 的代价不在调用次数,而在前置成本:得先有一份可信的 gold answer——而准备 gold answer 本身就要人工,这把成本推回到了人工标注那一侧。
团队要给一个开放式写作 agent 做每日回归:每天跑 500 条 prompt,看今天的版本有没有比昨天差。pointwise 还是 pairwise 更合适?
展开答案(先停 10 秒再点)
回归的本质是「今天 vs 昨天」的相对比较,这正是 pairwise 的强项——把今天的输出和昨天的输出 A/B 对比,judge 判哪个更好,直接得到「变好 / 变差」的细粒度信号,绕开了绝对分漂移。而且回归是「新旧两两比」,不是「n 个候选互比」,没有 O(n²) 爆炸——每条 prompt 只比 1 对,总共 500 场,成本可控。
如果用 pointwise,今天打 4.1、昨天打 4.0,这 0.1 的差会淹没在 judge 自身的漂移噪声里,根本说不清是真退化还是 judge 抖动。代价提醒:pairwise 别忘了 §2.3 的 position bias——A/B 顺序要交换。
2.3judge 的三大偏差与缓解
LLM judge 不是中立的尺子——它有三种可命名、可测量、可缓解的系统性偏差:偏爱靠前的答案、偏爱更长的答案、偏爱自己模型家族的答案。
Zheng 等人(MT-Bench / Chatbot Arena,2023)系统地测了这三种偏差。把它们当成 judge 的「已知故障模式」——每一个都有对应的工程缓解。
position bias:偏爱第一个答案
在 pairwise 模式下,judge 会系统性地偏向排在前面的那个答案,即使两个答案质量相当。把同一对答案交换位置再问一遍,judge 有相当比例会改口——说明它判的部分是「位置」而不是「质量」。
交换 A/B 顺序各判一次,只有两个顺序都判同一个赢,才算它真赢;否则记平局。这是一个硬一致性闸门,不是把两次分数简单平均——平均会让一个「正着判赢、反着判输」的位置噪声蒙混成 0.5 的弱胜,而闸门直接把它判成平局,逼 judge 用质量而非位置说话。
verbosity / length bias:偏爱更长的答案
judge 倾向于给更长的答案打更高分,即使多出来的内容只是冗余填充、没有增加任何信息。Eugene Yan 的实测里,把一个答案用等价但啰嗦的方式重写、内容实质不变,judge 仍有 超过 90% 的概率偏好那个更长的版本。不同模型抵抗力不同——GPT-4 在这项上抵抗得最好,但没有模型完全免疫。
self-enhancement bias:偏爱自己家族的输出
judge 会偏爱自己模型家族生成的输出,哪怕输出是匿名呈现的。Zheng 等人测得:Claude-v1 给自己家族的输出 +25% 胜率,GPT-4 给自己 +10%——即使评测时去掉了任何「这是谁写的」的标识。这意味着用某模型当 judge 去评它自己家族的 generator,分数会系统性虚高。
两条手段:① judge 用与被测 generator 不同家族的模型,断开自我偏爱的通路;② judge 尽量用能力更强的模型——更强的 judge 对所有偏差的抵抗力都更好,与人类的一致率也更高。
| 偏差 | 表现 | 实测幅度 | 缓解 |
|---|---|---|---|
| position bias | 偏爱排在前面的答案 | 交换顺序后相当比例改口 | 交换 A/B 双判,双赢才算赢,否则平局 |
| verbosity / length bias | 偏爱更长的答案,哪怕是冗余填充 | >90% 偏好被填充但等价的答案(GPT-4 抵抗最好) | rubric 显式要求简洁;控制长度变量;用 GPT-4 级 judge |
| self-enhancement bias | 偏爱自己模型家族的输出 | Claude-v1 +25% / GPT-4 +10% 自我胜率(即使匿名) | 用不同家族的 judge;用更强的 judge |
position / verbosity / self-enhancement 三种偏差都能命名、能测、能缓解。真正危险的是第四种——judge 和 generator 共享的盲点。当 judge 和 generator 来自同一个家族、在相近的数据上训练,它们会犯同一类错误:一个事实错误但措辞流畅、逻辑自洽的回答,generator 自信地写出来,judge 同样自信地判它对——一个「错得很流畅」的答案能同时骗过两者。这种偏差没有简单的缓解手段,因为它藏在两个模型共同的能力边界之外。识别它要靠系统的错误分析——把 judge 判对、但实际是错的样本捞出来逐条看(这是第 3 章 error analysis 的主题)。
你的 generator 和 judge 都用 GPT-4o,且你在排行榜上看到它评出自己家族的模型分数很高。会出什么问题?
展开答案(先停 10 秒再点)
两层问题叠加。表层是 self-enhancement bias:judge 偏爱自己家族(GPT-4 +10%),所以 GPT-4o generator 拿到的分会系统性虚高,排行榜不可信——缓解是换一个不同家族的 judge(比如用 Claude 或 Gemini 来评 GPT-4o 的输出)。
深层、且更危险的是共享盲点:同家族的 generator 和 judge 在相近数据上训练,会对同一类「流畅但错误」的回答一起失明——generator 写出来,judge 判它对,分数高且一致,但答案是错的。换 judge 家族能缓解 self-enhancement,但缓解不了共享盲点中那部分跨家族也共有的错误;最终只能靠对着人类标注做错误分析来兜底(§2.6 + 第 3 章)。
2.4G-Eval:让 judge 打分更细的机制
G-Eval 用「LLM 自动生成评分步骤 + 按 token 概率加权求分」两个技巧,把粗糙、方差大的整数分变成与人类判断更接近的连续分。
朴素 pointwise 有个隐疾:让 LLM 在 1–5 里打分,它几乎只吐整数,而且某一位数字(比如「3」)的概率会一家独大。结果是分数方差极小、大量样本挤在同一个整数上、产生大量平局——这种粗糙的分布和人类细腻的质量判断相关性很差。G-Eval(Liu 等人,2023)就是来修这个问题的。
三步流程
① 给任务定义 + 评分准则。把要评什么(如「摘要的连贯性」)和一个 0–5 的准则交给 LLM。
② LLM 自动生成一串 chain-of-thought 评分步骤。不靠人手写细则,而是让 LLM 自己把准则展开成一份具体的、分步的评分指引(「先读原文抓主旨,再看摘要是否覆盖主旨、句子间是否连贯……」)。
③ form-filling 打分。让 LLM 按这份生成出来的步骤,像填表一样给出每一项的分。
关键技巧:概率加权分
真正让 G-Eval 与人类相关性变好的是最后这一步的聚合方式。不取 LLM 嘴上说的那个整数,而是看它对每个候选分数 token 的概率,做加权求和:
# 说明性伪代码,非可直接运行(省略了真实 API 调用与 logprob 取用细节)
# ① + ②:把准则交给 LLM,让它先生成一串评分步骤(CoT)
EVAL_PROMPT = """
任务:评估下面这段摘要的「连贯性」,分数 1-5。
评分准则:5 = 句子间逻辑顺畅、主旨连贯;1 = 跳跃、断裂。
第一步:自己列出评估连贯性的具体步骤。
第二步:按这些步骤,只输出一个 1-5 的整数分。
原文:{source}
摘要:{summary}
"""
# ③:form-filling —— 拿到模型在每个分数 token 上的概率分布
# resp.logprobs 形如 {"1": p1, "2": p2, ..., "5": p5}
score_probs = get_token_probs(call_llm(EVAL_PROMPT), tokens=["1","2","3","4","5"])
# 关键技巧:概率加权分 = Σ p(s_i) · s_i (over score tokens)
# 不取模型嘴上说的那个整数,而是按它对每个分数的"信心"加权
final_score = sum(p * int(s) for s, p in score_probs.items())
# 朴素法只会吐整数 4;加权后得到 4.31 —— 连续、可分辨细微差距
print(final_score) # e.g. 4.31 (非固定值,取决于模型 logprobs)
Σ p·s核心就这一行:把 {1:.02, 2:.05, 3:.18, 4:.55, 5:.20} 这样的分布求期望,得到 3.88 而不是生硬的 4。连续分能分辨出朴素整数分压平掉的细微质量差。
问题的根在 LLM 输出层的概率分布过于尖锐:对一个 4 分左右的摘要,模型在「4」上放了 0.9 的概率,「3」「5」各分一点,最后采样几乎必出「4」。于是无数个「质量略有差别但都在 4 附近」的样本全被压成同一个整数——分数分布退化成几个尖峰,方差小、平局多,自然和人类的连续质感对不上。概率加权把这层被采样丢掉的信息捞回来:用 Σ p(sᵢ)·sᵢ 求期望,模型对「4」90% 的信心和对「3」「5」各 5% 的信心一起进入最终分,得到 3.95 这样的连续值。结果是 G-Eval 在 SummEval 上对人类判断的 Spearman ρ = 0.514,超过了此前的指标。局限:G-Eval 偏向LLM 自己生成的文本——judge 和 generator 同源时,它会给 LLM 风格的输出打更高分,这又回到了 §2.3 的共享盲点。
上面的 prob_weighted_score.py 不能直接跑:真实实现要处理具体厂商的 logprobs 取用方式、分数 token 的对齐(有的模型会把「10」切成两个 token)、以及概率归一化。它的作用是把 Σ p(sᵢ)·sᵢ 这个唯一承重的公式讲清楚,不是给一段开箱即用的库代码。
2.5rubric 设计:从「模糊 Likert」到「错误驱动的二元判据」
rubric(评分准则)的质量决定 judge 的噪声。凭空发明的 1–5 Likert 量表噪声大;从真实错误里提炼出的具体二元 pass/fail 判据噪声小。
judge 的可靠性有一半压在 rubric 上。同一个强模型,配一份含糊的 rubric 会评得满是噪声,配一份精确的 rubric 才能稳定。rubric 设计是 judge 工程里最被低估、回报最高的一环。
失败模式:凭空发明的 1–5 Likert
最常见的 rubric 是一个 1–5 的 Likert 量表:「1 = 很差,5 = 很好」。问题是两个评分员(无论人还是 judge)对每一档的理解不一样——评分员 A 的「4」和评分员 B 的「4」根本不是同一个东西,「3」和「4」的边界全凭感觉。喂给 judge,这种模糊性直接变成评分噪声:同一个输出多评几次给出不同分,因为量表本身没有可操作的判据。
修复:错误驱动的二元判据(Hamel Husain)
Hamel Husain 的做法是把 Likert 换成二元 pass/fail 判据,而且这些判据不是凭空发明的,而是从错误分析里发现的。先去看模型真实输出里反复出现的具体失败——「它会编造不存在的退货政策」「它会忽略用户指定的日期格式」——再把每一个失败固化成一条可判定的 pass/fail:「回答是否只用了知识库里有的政策?是 / 否」。二元判据消除了 Likert 的档位模糊:要么命中这个具体缺陷,要么没有,两个评分员不会再对「这算 3 还是 4」争执。
含糊 Likert:「回答的有用性,1–5 分。」——judge 给 3 还是 4 全凭手感。
错误驱动的二元判据:「① 回答是否直接答了用户问的那个问题?是/否 ② 是否只引用了知识库里存在的事实?是/否 ③ 是否遵守了用户要求的格式?是/否」——每一条都对应一个在真实输出里观察到的失败模式,judge 只做客观判定。
criteria drift 的 catch-22
Shankar 等人在 EvalGen(《Who Validates the Validators?》,2024)里发现一个绕不开的循环:给输出打分这个行为本身,才教会你判据到底是什么。研究里的参与者一边给输出打分,一边不断意识到「原来真正在乎的是这一点」,于是回头去改之前已经打过的分——他们的评判标准在打分过程中持续漂移(criteria drift)。这是一个 catch-22:你想先定好 rubric 再打分,但你要打了分才知道 rubric 该是什么样。
criteria drift 的含义不是「标准会变所以没法定」,而是:rubric 不是一次写死的,是迭代出来的。正确的流程是——看一批输出 → 提炼初版二元判据 → 用它打分 → 在打分中发现新的失败模式和理解偏差 → 修订判据 → 再打分。rubric 和 golden set 标注(§2.6)是同一个迭代循环的两面:标注教你判据,判据指导标注。指望一次性写出完美 rubric,等于否认了 criteria drift 这个被实证观察到的现象。
团队第一版 rubric 是「回答质量 1–5 分」,两个标注员独立打分一致率只有 55%。换成什么样的 rubric 能把一致率拉上去?
展开答案(先停 10 秒再点)
把单一的 1–5 Likert 拆成若干条错误驱动的二元判据。55% 的低一致率几乎肯定来自档位模糊——两人对「3 还是 4」各有理解。先做一轮错误分析,把真实输出里反复出现的失败固化成「是/否」判据(「有没有编造事实」「有没有答非所问」「有没有违反格式」),每条都客观可判。
二元判据天然比连续量表一致——「命中没命中这个具体缺陷」比「值几分」好对齐。但别期望一步到位:根据 criteria drift,第一轮二元判据打分时还会发现新的失败模式,要回头修订判据——这是迭代,不是一锤定音。
2.6校准:你凭什么相信这个 judge
一个 judge 在对着人工标注的 golden set 用 Cohen's κ 验证过、且没超出人与人一致率的上限之前,它给出的分数不能当真。
前五节产出了分数,但没有任何一节回答:这个分数对吗?一个 judge 完全能稳定地、自信地、低成本地给出系统性错误的分。校准是把「judge 说的分」和「人类认定的真值」对齐的过程——没校准过的 judge,本质上是一个你不知道偏到哪去的尺子。
第一步:建一个 golden set
judge 只有在对着一个人工标注的 golden set 验证过才可信。golden set 是一批 ~30–200 条样本,要点有三:来自真实分布(从线上真实流量或贴近真实的数据里抽,不是凭空造的简单样例)、专家标注(由真正懂这个任务该长什么样的人打标签)、规模不必大(30–200 条足够测出 judge 和人类的一致程度,关键在质量不在数量)。
第二步:用 Cohen's κ 度量一致性,而不是裸 % agreement
对齐程度不要用裸的百分比一致率(raw % agreement),要用 Cohen's κ。κ 在裸一致率的基础上扣掉了「纯靠随机也会蒙对」的那部分一致——两个评分员就算瞎猜,在二分类上也有约 50% 会碰巧一致,裸一致率把这部分白送的运气也算成了功劳。Eugene Yan 给出过一个具体反例:一对评分的裸一致率 80%,换算成 Cohen's κ 只有 0.62。更要命的是类别不均衡时——如果 95% 的样本都是「pass」,一个无脑全判 pass 的 judge 裸一致率就有 95%,看着很高,κ 却接近 0,因为它完全没有信息量。裸一致率在这种分布下骗人最狠。
第三步:认清硬天花板——judge 不可能超过人与人的一致率
校准有一个不可逾越的上限:judge 与人类的一致率,不可能高于人类标注者彼此之间的一致率。如果两个专家对同一批样本只能达成 65% 的一致,那这个任务本身就有 35% 的主观模糊地带——judge 再强也变不出一个「正确答案」来,因为根本不存在一个所有人都同意的答案。这种情况下指望 judge 达到 80% 一致是数学上不可能的:80% 的「正确」从何而来?人类自己都给不出。这也给了一个判断 judge 是否够好的标尺:先测人与人一致率,再拿它当 judge 的目标上限。Zheng 等人的好消息是:在 MT-Bench 上,GPT-4 与人类的一致率超过 80%,和人与人之间的一致率持平——也就是说在那个任务上,GPT-4 judge 已经逼近了天花板,再调也榨不出多少。
你的 judge 和人类的一致率是 78%,这够好吗?
展开答案(先停 10 秒再点)
单看 78% 无法判断——必须先知道两件事。第一,人与人一致率的天花板是多少?如果两个专家在这个任务上也只有 78% 一致,那 judge 已经撞到天花板,78% 就是优秀,再想提升是和任务固有的主观性较劲。如果人-人能到 92%,那 judge 的 78% 说明它还漏了 14 个百分点的可学信号,值得改 rubric 或换更强的 judge。
第二,这 78% 是裸一致率还是 Cohen's κ?如果是裸一致率,且类别不均衡(比如大多数样本都 pass),78% 换算成 κ 常常只有 0.5 出头,含金量远没有数字看着高。结论:78% 这个数字本身没有意义,它只有放进「人-人上限」和「κ 而非裸值」这两个参照系里才能解读。
下面这张表把全章收束成一个选型决策——给定任务类型,该用哪种打分方法、为什么。这是本章的「备选方案」核心:每一行的「为什么」都回指前面某一节揭示的机制或失效。
| 任务类型 | 推荐方法 | 为什么 |
|---|---|---|
| 分类 / 抽取式 QA / 代码(答案空间封闭) | reference-based(exact match / F1 / 测试) | 有唯一正确答案,确定性、零成本、可复现,无需引入 judge 噪声(§2.1) |
| 开放式单条质量打分 · 要规模化跑 CI | pointwise(最好 G-Eval 加权) | O(n) 线性可扩展;G-Eval 概率加权修掉整数分方差大、平局多的问题(§2.2 §2.4) |
| 两个版本 / 两个模型谁更好 · 回归对比 | pairwise(+ 顺序交换闸门) | 相对偏好信号最细、绕开绝对分漂移;务必交换 A/B 顺序消除 position bias(§2.2 §2.3) |
| 有客观解的推理 / 数学 / 事实问答 | reference-guided | 把 gold answer 塞进 prompt,judge 只需对照而非自己重推,可靠性大幅提升(§2.2) |
| 任何上线前的 judge —— 不分任务 | 先对 golden set 测 Cohen's κ | 没校准过的 judge 是偏向未知的尺子;κ 去随机一致,且不可能超人-人上限(§2.6) |
§本章 self-check
先合上教程,把你能想到的答案写在纸上或编辑器里。 写完再点开答案对照——直接点开等于把这一节当再读一遍。
- reference-based 的四种做法(exact match / F1 / 状态比对 / code 测试)底层测的是同一个东西——是什么?它在什么时候失效?
- LLM-as-a-judge 的 pointwise 和 pairwise 各自的成本量级(O(?))和主要弱点是什么?
- position bias 的缓解为什么是「双判双赢才算赢」的硬闸门,而不是把两次分数平均?
- G-Eval 的「概率加权分 = Σ p(sᵢ)·sᵢ」解决了朴素 pointwise 的什么具体问题?(设计层面)
- 为什么度量 judge↔human 一致性要用 Cohen's κ 而不是裸 % agreement?judge 一致率有没有上限?
答案(先做完再展开)
- 四种做法测的都是表层词汇/状态重叠,不理解语义。当答案空间不封闭(同一个正确意思有无数种表述)时失效——「Paris」vs「法国首都」F1 给 0.0。所以只适用于抽取式 QA、分类、代码这类答案封闭的任务(§2.1)。
- pointwise 是 O(n),弱点是绝对分漂移、抓不住小差距;pairwise 是 O(n²),信号最细但成本平方级膨胀、且对答案顺序敏感(position bias)(§2.2)。
- 因为平均会把一个「正着判赢、反着判输」的纯位置噪声蒙混成 0.5 的弱胜,留下污染;硬闸门直接把这种顺序翻转判成平局,只承认两个顺序都赢的——逼 judge 用质量而非位置说话(§2.3)。
- 朴素 pointwise 让 LLM 打分时几乎只吐整数、且某个整数概率独大 → 分数方差小、大量平局、与人类相关性差。按 token 概率加权求期望得到连续分,捞回被采样丢掉的信息,SummEval 上 ρ 提到 0.514(§2.4)。
- 裸一致率把「纯随机也会蒙对」的那部分算成了功劳,类别不均衡时尤其骗人(全判多数类就能拿高裸一致率);κ 扣掉了随机一致——Eugene Yan 给的实例里 80% 裸一致只有 κ=0.62。上限是人与人之间的一致率:两个专家只同意 65%,judge 不可能到 80%(§2.6)。
给一个「没有客观真值」的任务设计 judge 校准
你要评一个写营销文案的 agent——「文案有没有感染力」是高度主观的,两个市场专家独立打 1–5 分一致率只有 60%。这个任务能用 LLM-as-a-judge 吗?如果能,你的 golden set 怎么建、用什么指标、judge 的目标一致率定多少才算合理?如果发现 judge 和人类一致率做到了 75%,你该高兴还是警惕?
提示(卡住再展开)
抓住天花板这条线:人-人一致率只有 60%,意味着这个任务有 40% 的纯主观地带,根本不存在一个所有人都同意的「正确文案」。所以 judge 的合理目标上限就是 ~60%,不是 80%——把 60% 当满分线。
那么 judge 做到 75% 一致反而要警惕:它超过了人-人上限,这在数学上很可疑——多半是 judge 抓住了某个人类标注里的系统性偏差(比如所有标注员都偏爱更长的文案,judge 学会了用长度作弊,于是和「同样有 length bias 的人类」高度一致)。这把 §2.3 的 verbosity bias 和 §2.6 的天花板缝在了一起。出路:先用错误驱动的二元判据(§2.5)把「感染力」拆成可客观判定的子项(有没有明确的行动号召、有没有具体而非空洞的卖点……),把主观大题分解成若干高一致率的小题,再分别校准。