跳到主要内容

第24章:评测的局限性

前一章我们介绍了各类 benchmark 和评测体系,似乎有了 MMLU、HumanEval、MT-Bench,我们就能客观地比较不同模型的能力。然而现实并不如此美好——评测本身也是一个充满陷阱的游戏。本章我们来拆解这些陷阱:数据污染、排行榜刷分、评判者的偏见,以及如何在这些局限中找到真正有用的评测方式。


24.1 数据污染问题

问题的根源

训练一个大语言模型需要爬取互联网上的海量文本——CommonCrawl、GitHub、Wikipedia、书籍……而这些来源中,往往也包含了各种公开 benchmark 的题目和答案。

想象一道 GSM8K(小学数学应用题)题目:

"Tom 有 5 个苹果,给了 Jerry 2 个,又从超市买了 4 个,请问 Tom 现在有几个苹果?"

这道题在公开数据集里,在各种评测博客里,在 Hugging Face 讨论帖里,可能以数百种形式出现。模型在训练时"见过"这道题,本质上等于提前做过考试——测试分数自然虚高。

:::warning 核心问题 数据污染(Data Contamination)不是模型作弊,而是训练流程的结构性问题。没有任何一个训练团队能保证"完全未见过"某个 benchmark 的题目。 :::

难以检测

检测污染的常用方法是 n-gram 重叠率:计算训练数据与 benchmark 题目之间有多少连续词片段相同。

Overlap(Dtrain,Q)={gngrams(Q):gDtrain}ngrams(Q)\text{Overlap}(D_{\text{train}}, Q) = \frac{|\{g \in \text{ngrams}(Q) : g \in D_{\text{train}}\}|}{|\text{ngrams}(Q)|}

但这个指标存在明显局限:

情况n-gram 重叠实际是否污染
题目原文出现在训练集
答案出现但题目改写可能是
同类题目大量存在(非原题)难以判断
翻译版本出现极低可能是

更隐蔽的污染形式是语义污染:训练集里没有原题,但有大量"结构相似"的题目,导致模型实际上在做模式匹配而非真正推理。

解决思路

动态 Benchmark(Dynamic Benchmark)

每次评测时即时生成新题目,而不使用固定题库。例如:

  • LiveBench:每月更新题目,利用近期新闻、最新论文生成问题,确保训练数据截止日期之后才存在
  • DynaEval:对抗性数据收集,人类标注者专门构造模型答错的样本

时间切割(Temporal Cutoff)

选用模型训练数据截止日期之后发布的测试集。如果某模型的训练截止于 2024 年 1 月,那么 2024 年 3 月发布的新 benchmark 原则上不在污染范围内。

案例:GSM8K 的困境

研究人员发现,部分模型在 GSM8K 上能达到 90%+ 的准确率,但当研究者用相同难度、相同题型但全新生成的 GSM-SymbolicGSM1k 测试时,同一批模型的分数普遍下降 8-15 个百分点。这说明部分"能力"来自于见过类似题目,而非真正的数学推理。

:::info 小测试 下次看到模型在某 benchmark 上得高分,不妨问一句:这个测试集是什么时候发布的?模型训练数据截止到什么时候? :::


24.2 Benchmark 饱和与刷榜现象

区分度消失

2020 年,BERT 在 GLUE 上得分远低于人类水平,GLUE 是衡量 NLP 进步的重要标尺。到 2021 年,多个模型已经超越人类基线。研究者不得不推出 SuperGLUE,而 SuperGLUE 也在两年内被刷穿。

类似的故事在 MMLU 上重演:

2022 年:GPT-3 ~ 43%,人类专家 ~ 89%
2023 年:GPT-4 ~ 86%,Claude 2 ~ 79%
2024 年:多个开源模型 ~ 85%+

当多个模型都聚集在 85-90% 这个区间,区分度(Discriminability) 趋近于零——我们无法从分数上分辨哪个模型"更好"。

Benchmark Gaming(刷榜)

更严重的问题是刻意优化:训练团队会对特定 benchmark 的题型、选项分布、措辞风格进行针对性训练(Fine-tuning)。这叫 Benchmark GamingGoodhart's Law 在 AI 评测中的体现:

"当一个指标成为目标,它就不再是好指标。" —— Charles Goodhart

具体表现:

  • 收集某 benchmark 的练习题构造相似训练数据
  • 分析 benchmark 的答案分布(如 MMLU 选 C 的概率),调整解码策略
  • 针对评分 rubric 的措辞倾向训练输出风格

军备竞赛

:::warning 恶性循环 更难的 benchmark 出现 → 模型刷分 → 区分度降低 → 更难的 benchmark 出现…… :::

这催生了一批更硬核的 benchmark:

Benchmark领域难度定位
MMLU-Pro多学科MMLU 困难版,更长推理链
GPQA研究生物理/化学/生物即使 PhD 正确率也只有 ~65%
ARC-Challenge科学推理需要多步推理
FrontierMath竞赛数学2024 年 GPT-4o 正确率 <2%

但历史证明,这些新标尺很快也会被攻破。评测的根本矛盾在于:公开的 benchmark 必然成为训练目标


24.3 人类评测 vs 模型评测(LLM-as-Judge)

人类评测的困境

对于开放式生成任务(写文章、总结、对话),没有标准答案可以比对。传统方法是请人类标注者打分。

优点:真实反映用户偏好,覆盖细粒度语义质量
缺点

  • 成本高昂:大规模评测需要数百小时人工
  • 一致性低:不同标注者的标准差异大(inter-annotator agreement 通常在 60-70%)
  • 难以复现:随着时间推移,人的偏好本身也在变化

LLM-as-Judge:用模型评价模型

一个自然的想法:用更强的模型(如 GPT-4、Claude 3 Opus)来评价其他模型的输出。这就是 LLM-as-Judge 范式。

典型流程:

用户问题 Q

模型 A 生成回答 A_out
模型 B 生成回答 B_out

Judge 模型(GPT-4)收到 [Q, A_out, B_out]

Judge 输出:A 更好 / B 更好 / 平局 + 理由

与人类评测相比,LLM-as-Judge 的成本低了 100 倍以上,且可以 24 小时运行。

偏差来源

然而 LLM-as-Judge 存在系统性偏差(Bias):

1. 风格偏好偏差(Style Bias)

评判模型会偏好与自身训练风格相似的回答。用 GPT-4 作为 Judge,往往会给 GPT 系列模型的回答打更高分——不是因为内容更好,而是"措辞更熟悉"。

2. 长度偏差(Length Bias)

大量研究表明,LLM Judge 倾向于给更长、结构更丰富(多用标题、列表)的回答打高分,即使内容质量并不更高。

P(prefer A)ifABP(\text{prefer } A) \uparrow \quad \text{if} \quad |A| \gg |B|

3. Position Bias(位置偏差)

当两个回答同时呈现给 Judge 时,Judge 倾向于偏好第一个出现的回答,无论内容如何。实验表明这种偏差可以造成 5-10% 的系统性误差。

:::info 实验验证 研究者将同一对回答 (A, B) 先后以 [A, B] 和 [B, A] 两种顺序喂给 Judge,发现约 20% 的情况下判断结果相反。这意味着排列顺序影响了"客观"评价。 :::

MT-Bench 的缓解策略

MT-Bench 是由 LMSYS 团队提出的多轮对话评测框架,针对上述偏差设计了以下缓解措施:

  1. 评分 + 理由:Judge 不只给出胜负,还要输出评分(1-10 分)和文字理由,迫使其做更细致的分析
  2. Swap 测试:同一对回答以两种顺序各评一次,取平均分
  3. 参考答案辅助:对于有标准答案的问题,提供参考答案降低 Judge 的自由裁量空间
# MT-Bench 评分示例(伪代码)
def mt_bench_score(question, answer_a, answer_b, judge_model):
score_ab = judge_model.evaluate(question, answer_a, answer_b)
score_ba = judge_model.evaluate(question, answer_b, answer_a)

# 交换顺序,消除 position bias
final_a = (score_ab["a"] + score_ba["a"]) / 2
final_b = (score_ab["b"] + score_ba["b"]) / 2
return final_a, final_b

即便如此,LLM-as-Judge 的结论仍应被视为近似参考,而非绝对真理。


24.4 如何看待排行榜

排行榜是参考,不是真理

综合以上问题,我们应该如何解读 Chatbot Arena、Open LLM Leaderboard 这些广受关注的排行榜?

排行榜能告诉你的

  • 在大量通用任务上,各模型的相对水平
  • 某个模型在某类任务(代码、数学、推理)上的专项能力
  • 领域进展的大致趋势

排行榜不能告诉你的

  • 在你的具体业务场景下,哪个模型更好
  • 成本效益比(榜单第一不代表最划算)
  • 模型是否对这些 benchmark 过拟合

多维度能力分布

不同模型在不同任务上的表现可以差异显著。下表是一个简化的示意:

模型数学推理代码生成创意写作多语言指令遵循
模型 A★★★★★★★★★☆★★★☆☆★★★☆☆★★★★☆
模型 B★★★☆☆★★★★★★★★★☆★★★★★★★★★★
模型 C★★★★☆★★★☆☆★★★★★★★★☆☆★★★☆☆

综合排名相近的模型,在具体任务上可能天差地别。选择模型不能只看总分。

推荐实践:自建评测集

真正有价值的评测是在你自己的任务上测试。推荐流程:

:::tip 构建业务评测集的步骤

  1. 梳理核心任务:列出你的产品/系统中最重要的 3-5 类请求类型
  2. 收集真实样本:从历史日志中抽取 50-200 个代表性输入(注意数据脱敏)
  3. 定义评分标准:为每类任务写明什么是"好回答"(可以是规则、rubric 或参考答案)
  4. 建立基线:先用当前系统跑一遍,建立基准分
  5. 持续对比:新模型上线前,在这个集合上做 A/B 比较 :::

一个实用的自评框架:

class TaskEvaluator:
def __init__(self, task_name, samples, scorer):
self.task_name = task_name
self.samples = samples # [(input, expected_output), ...]
self.scorer = scorer # 评分函数:(output, expected) -> float

def evaluate(self, model):
scores = []
for inp, expected in self.samples:
output = model.generate(inp)
score = self.scorer(output, expected)
scores.append(score)
return {
"task": self.task_name,
"mean_score": sum(scores) / len(scores),
"min_score": min(scores),
"samples": len(scores)
}

本章小结

问题成因应对思路
数据污染训练数据包含 benchmark 题目动态 benchmark、时间切割
Benchmark 饱和模型能力逼近天花板,区分度消失持续更新更难的测试集
Benchmark Gaming针对特定测试集优化训练私有/动态测试集,多样化评测
人类评测不一致标注者主观差异大明确 rubric,多人交叉标注
LLM-as-Judge 偏差风格、长度、位置偏差Swap 测试,评分+理由,多 Judge
排行榜误导通用分数遮盖任务差异自建业务相关评测集

评测的核心矛盾是:任何公开的、固定的 benchmark,最终都会成为被优化的目标,而不再是能力的真实镜子。这不是悲观主义,而是提醒我们:评测应该是一个持续演进的过程,而非一次性的排名。

理解了评测的局限性,下一章我们将进入实践层面——当你真的要把一个 LLM 集成进产品时,面临哪些工程挑战?推理速度、上下文长度、成本控制……这些才是真正决定一个系统能否落地的关键变量。