同一份答案换个顺序就翻盘:大模型裁判到底在偏袒谁

大模型裁判(LLM-as-a-judge)是用一个强模型给另一个模型的回答打分,或做两两比较,把人工评测的成本压到可以天天跑。它在 MT-Bench 上与人类有超过 80% 的一致率,但这个数字常被误读成“客观”。只把两个答案的出现顺序换一下,Vicuna-13B 就能在 80 道题里的 66 道上被判赢 ChatGPT;裁判还会偏爱更长、更工整以及自己写出的文本。本文拆开位置偏差、冗长偏差与自我偏好的机制,说明绝对分数、胜率和排行榜各自在哪一步失真,并给出一段可运行的重采样代码,教你把“赢了 56 次”翻译成带置信区间的结论。

是什么

大模型评测里的自动打分,通常指让一个强模型当裁判(LLM-as-a-judge):给它题目、参考答案或评分标准,让它给候选回答打一个分,或者在同一题的两个回答里选更好的那个。前者是 pointwise 打分,后者是 pairwise 比较;把大量成对胜负聚合起来,可以用 Bradley-Terry 这类模型拟合出统一排名,Chatbot Arena 的排行榜走的就是这条路。

一句话直觉:裁判不是一把尺子,而是另一个也会答题、也会偏心的考生。尺子量的是长度,裁判预测的是“人类大概会喜欢哪一个”。

典型场景是模型选型、prompt 迭代、RAG 改动前后的回归,以及上线前的红队检查。人工评测贵、慢、难复现,自动裁判能把一次回归从两周压到半天,所以它几乎成了 AI 工程的默认基础设施。问题也正出在“默认”上:很多人把它当成了不会出错的尺子。

核心原理

裁判给的是“像不像好答案”

裁判模型做的事,是在“题目 + 回答 + 评分指令”这个上下文里预测下一个 token。它没有一把内嵌的、以毫米为刻度的质量标尺;所谓 8 分,是它在训练数据里见过的“人类会给 8 分的文本”附近的条件概率。于是评分会随上下文变化,而不是随回答本身固定;裁判对“好”的先验,会把长度、格式、语气、作者风格这些与正确性无关的信号一起带进来。

位置偏差:先看到谁,就更容易选谁

把两个回答放进同一个 prompt,裁判的注意力会被顺序影响。MT-Bench 的论文把位置偏差列为主要局限之一;更直观的是《Large Language Models are not Fair Evaluators》里的实验:只改变两个回答的出现顺序,Vicuna-13B 就能在 80 道题中的 66 道上被 GPT-4 判为胜过 ChatGPT。回答没变,能力没变,变的是它出现在前面还是后面。

机制不神秘:自回归模型对开头锚点和最近内容都更敏感;当评分标准本身模糊时,“第一个看起来更完整”就成了廉价的判别依据。所以单次比较得到的胜负,更像“这个顺序下的胜负”,而不是“这两个回答的胜负”。

冗长偏差与自我偏好:文风和人缘也会加分

MT-Bench 还提到冗长偏差和自我增强偏差:更长、分点、语气笃定的回答更容易拿高分,哪怕信息量没变;裁判也可能偏爱与自己风格相近的输出。更麻烦的是“认出自己”:Panickssery 等人的实验发现,GPT-4、Llama 2 这类模型能以不低的准确率区分自己写的和别人写的,而且模型识别自身文本的能力越强,给自己打高分的倾向越明显。生成与评判同源时,风格相似会被误读成质量更高。

这解释了一个常见现象:用 A 模型当裁判,A 自己的输出往往整体上浮;换成 B 当裁判,排名又变一遍。不是谁在作弊,而是裁判的“口味”参与了测量。

从胜负到排名:还有一层统计噪声

即便每次比较都无偏,胜负也只是抽样。100 道题里赢 56 次,听起来是多数,但 95% 置信区间大约从 0.46 到 0.65,跨过了 0.5;换一批题,结论可能反过来。Bradley-Terry 或 Elo 能把成对胜负拟合成统一排名,但它们是相对偏好的模型:对手池变了、题目分布变了、样本量不够,名次就会动。排行榜给出的是带不确定性的估计,不是一张能力真值表。

import random
random.seed(7)

def bootstrap_ci(votes, n=10000):
    rates = []
    for _ in range(n):
        sample = [random.choice(votes) for _ in votes]
        rates.append(sum(sample) / len(sample))
    rates.sort()
    return rates[int(0.025 * n)], rates[int(0.975 * n)]

votes = [1] * 56 + [0] * 44      # 100 次成对比较,A 赢 56 次
lo, hi = bootstrap_ci(votes)
print(f"{sum(votes) / len(votes):.2f}  95% CI [{lo:.2f}, {hi:.2f}]")
# 0.56  95% CI [0.46, 0.65]:跨过 0.5,不能宣称 A 更强

能验证的,不要交给裁判

裁判的另一处边界是“它只能读,不能跑”。代码能不能过测试、SQL 能不能执行、抽取的字段是否与原文一致,这些都有确定性验证手段;让裁判去“看”代码判断正确性,本质是让它猜程序的行为。MT-Bench 也明确指出裁判在复杂推理上能力有限。可验证任务用执行结果,主观任务才用裁判,这条分界线比调 prompt 更重要。

常见考点与误区

  • “GPT-4 和人类一致率超过 80%,可以替代人工吗?” 不能直接这么推。80% 是特定任务分布上的聚合值,人类之间也只有约 80% 的一致率;更关键的是,聚合一致率会被类别不平衡抬高。若 90% 样本都该判“通过”,一个永远判通过的裁判也有 90% 一致率,但 Cohen's kappa 是 0。要看分任务、分类别的混淆矩阵。
  • “A 比 B 高 3 分,就是 A 更强?” 绝对分不是等距量尺,rubric 措辞、裁判版本、采样温度都会让分数漂移。成对胜率也要看样本量:56/100 的 95% 区间跨过 0.5,不能下结论。
  • “换个顺序只是小问题?” 它足以改写排名,前面 66/80 的实验就是证据。正确做法是正反各判一次、做位置平衡,并把两次结论不一致的样本单独统计,而不是只跑一个顺序。
  • “用同一个模型当裁判,它最懂自己?” 恰好相反。模型能识别自己的文本,识别能力越强,自我偏好越明显;生成与评判同源,会把风格相似误当成质量更高。至少换一个模型家族,并用人工标注集校准。
  • “让裁判写思维链就更可信?” 思维链能让理由更完整,也会给偏见补理由。G-Eval 用思维链加概率加权,在摘要任务上与人类的 Spearman 相关也只有 0.514;理由读起来合理,不等于判断正确。
  • “所有任务都该上 LLM 裁判?” 代码、数学、结构化抽取这类有确定性验证的任务,应该跑单测、执行和精确匹配;用裁判去“看”代码,等于让它猜程序能不能跑。裁判适合主观、开放、没有唯一答案的维度。

实践建议

  • 先定义“评什么”,再选裁判。 把质量拆成可判定的维度:事实是否正确、引用是否支持结论、指令是否遵循、格式是否合规。每个维度给二值或三级标准,附正例和反例;能自动验证的先自动验证,剩下的才交给模型。
  • 成对比较要做位置平衡。 A/B 和 B/A 各跑一次,只有两次结论一致才计胜负,不一致记平局并抽样人工复核;顺序随机化,不要固定把基线放前面。单轮打分则要给锚点样例,别只给一句“满分 10 分”。
  • 用人工集校准,而不是凭感觉。 每个任务留 200 到 500 条人工标注样本,算 Cohen's kappa、混淆矩阵和分维度一致率;裁判模型、prompt、temperature、最大 token 全部固定版本,换版本先跑回归再上线。
  • 把不确定性写进报告。 给出样本量和 bootstrap 置信区间,预先定好“至少差多少才值得上线”;不要用 20 条样本上的 5% 差异做发布决策,也不要把不同榜单的分数直接相减。
  • 防污染、防过拟合。 保留不公开的 holdout,定期换新题;对公开榜单题做近邻检查,训练集与评测集去重;prompt 里出现过的示例,不要和测试题像到“背答案”的程度。
  • 按成本分层。 能用规则、单测、小模型判的,不要调用强裁判;只把难例和分歧样本升级给强模型或人工。把裁判调用成本、延迟和人工复核量一起算进评测预算,否则“全量自动评测”很快会变成新的成本黑洞。

一句话总结:自动打分能规模化“偏好”,但替代不了“验证”;先问裁判偏不偏,再问分数稳不稳。

相关阅读

← 返回文章志