“我们的模型在某榜单刷到了 SOTA”——这句话的信息量,往往远低于它听起来的样子。对工程师而言,比"哪个模型分高"更重要的是:这个分数是怎么测出来的,它能不能迁移到你的真实场景。这篇拆解大模型评测的三大支柱(自动基准、数据污染、人类评估)和它们各自的陷阱。

直觉:评测大模型为什么比想象中难

传统机器学习评测很干净:固定测试集、明确指标(准确率、F1)、确定性输出。大模型把这三点全打破了:

  • 输出是开放生成的自然语言,没有唯一正确答案,"对不对"本身就难以自动判定。
  • 输出有随机性(温度采样),同一题多次跑结果可能不同。
  • 能力是多维的:知识、推理、代码、安全、长上下文、指令遵循……单一分数无法概括。

所以"评测"不是一个指标,而是一套需要精心设计的测量系统。下面分三层看。

第一层:自动基准(automatic benchmarks)

最常见的是选择题或有标准答案的题库。评测流程看似简单,魔鬼全在细节:

1
2
3
4
5
6
7
8
def evaluate(model, dataset, prompt_template):
correct = 0
for q in dataset:
prompt = prompt_template.format(question=q.text, choices=q.choices)
output = model.generate(prompt)
pred = parse_answer(output) # ← 这一步极易出错
correct += (pred == q.gold)
return correct / len(dataset)

容易被忽视的变量,每一个都能让同一模型的分数浮动好几个百分点:

  • Prompt 格式与少样本数量(few-shot k):0-shot 还是 5-shot、示例怎么写、选项用 A/B/C/D 还是 1/2/3/4,都会改变结果。
  • 答案解析(parsing):模型可能回答"我认为是 B,因为……",正则没覆盖到就被判错。一个脆弱的 parser 能凭空"扣掉"几个点。
  • 打分方式:是看生成文本里出现哪个选项,还是比较各选项的对数似然(log-likelihood)?两种方式对同一模型给出的分可能差很多。
  • 指标本身的局限:BLEU、ROUGE 这类基于 n-gram 重叠的指标,对语义正确但措辞不同的答案严重低估,早已不适合评测现代生成质量。

关键结论:脱离了 prompt 设置、解析逻辑、采样温度,单看一个基准分数几乎没有可比性。复现别人结果时分数对不上,十有八九是这些设置不一致。

第二层:数据污染(contamination)

这是当前最严重、最难根除的问题。模型在海量网络数据上预训练,而公开基准的题目和答案也在网上。如果测试集泄漏进了训练集,模型就是在"考已经背过的题",高分是记忆而非能力。

为什么难根除:

  • 互联网上基准会以各种变体出现(论文附录、讨论帖、镜像数据集),去重很难做干净。
  • 即使没见过原题,见过高度相似的题也会虚高分数。
  • 训练数据通常不公开,外部无法直接审计是否污染。

几种检测/缓解思路:

1
2
3
4
5
n-gram 重叠检测   : 在训练语料里搜测试题的长 n-gram,命中即疑似污染
金丝雀字符串 : 在基准里埋唯一标识串,事后能检出它是否进了训练集
时间切分 : 用模型训练截止日期之后才出现的新题(如新考题/新事件)来测
私有/动态测试集 : 题目不公开、定期轮换,从根上断绝泄漏
扰动重测 : 把原题改数字/换表述,若分数显著下降,说明原来是靠记忆

最后那条"扰动重测"特别实用:一个真懂的模型,把题目里的数字一换,分数应该基本稳定;如果一改就崩,说明它记的是答案不是方法。评测一个模型时,自己动手改几道题再测,比盯着榜单有用得多。

第三层:人类评估与 LLM-as-judge

对开放式任务(写作、对话、复杂指令),没有标准答案,只能靠"判断"。两条路线:

人类评估。常用 pairwise 偏好对比:给评审两个模型对同一 prompt 的回答,问哪个更好,再用类似 Elo 或 Bradley-Terry 的模型把成对胜负聚合成排名。优点是贴近真实体验,缺点是:

  • 贵且慢,难以规模化和频繁回归。
  • 主观且有偏:评审会偏好更长的回答、格式漂亮的回答、语气自信的回答——哪怕内容并不更对。设计评测时要警惕这些系统性偏差,必要时做控制。
  • 一致性问题:评审之间分歧大时,需要用 inter-annotator agreement(如 Cohen’s Kappa)来量化标注质量,agreement 太低说明任务定义本身不清。

LLM-as-judge。用一个强模型当裁判给答案打分,便宜、快、可规模化,已成事实标准。但它有自己的系统性偏差:

  • 位置偏差:倾向选呈现在前面(或后面)的答案——缓解办法是交换顺序各测一次取平均。
  • 长度/冗长偏差:偏好更长的回答。
  • 自我偏好:裁判模型可能偏爱与自己风格相近的输出。

所以 LLM-judge 的结果必须经过与人类评分的相关性校准才可信,且不能用同一个模型既当选手又当裁判。

一套务实的评测心法

1
2
3
4
5
1. 别信单一榜单分:多基准 + 看清 prompt/采样/解析设置
2. 主动查污染:扰动重测、用训练截止后的新题
3. 开放任务用 pairwise,但控制长度/格式/位置偏差
4. LLM-judge 要做人类相关性校准,避免自我偏好
5. 最重要:建你自己的、贴近业务的私有评测集——别人的榜单不替你说话

小结

大模型评测的难点不在"算分",而在"这个分到底测了什么"。自动基准受 prompt 与解析设置摆布,污染让记忆冒充能力,人评和 LLM-judge 各有系统性偏差。真正可靠的评测,是多维度、查污染、控偏差、且用贴合自己场景的私有集做出来的。下次再看到"刷榜 SOTA",先问一句:换了 prompt、改了题目,它还行吗?