评测:把「好」变成一个数字
给定一个模型,它到底有多「好」?这一讲讲清楚:困惑度为什么既是全部又不够、多选题基准怎么被刷爆、开放生成怎么评、人类偏好怎么拟合成 Elo、Agent 任务怎么打分,以及为什么「训练集里混进了测试集」正在腐蚀整个领域的可信度。
0. 本讲导读
到上一讲为止,这门课已经把训练一个语言模型所需要的一切讲完了:分词与架构(Lecture 2–4)、训练与优化(Lecture 5)、GPU 与内核(Lecture 6)、并行化(Lecture 7–8)、推理(Lecture 9)、缩放定律(Lecture 10–11)。
还缺一块拼图:你到底拿什么数据去训练?
数据决定模型的行为——喂代码它就会写代码,喂多语言它就会翻译,喂 DNA 序列它就会建模基因组。但 Percy 在开场特意把数据这一讲往后推了一节,先讲评测,理由很直接:
在讨论「训练什么数据」之前,你必须先说清楚「你想要模型具备什么行为」。数据是手段,行为是目的,而评测就是把「想要的行为」写成可测量形式的那一步。没有评测,「数据配比调优」这句话本身就没有意义——你连往哪个方向调都不知道。
于是本讲的核心问题只有一句话:
给定一个模型,它有多「好」(good)?
表面上,评测像一套机械流程:
- 定义一批提示(prompts);
- 把提示喂给模型,拿回响应(responses);
- 算准确率。
但 Percy 的判断是:评测是一个远比它看起来更深、也更重要的话题——因为评测塑造了整个 AI 领域的发展方向。你度量什么,研究者就优化什么;你度量错了,整个领域就会花几年时间往错误的方向狂奔。在一个每年烧掉几百亿美元算力的领域里,评测是那个决定这些算力往哪儿流的方向盘。
- 不存在唯一正确的评测(there is no one true evaluation)。选哪个评测,取决于你想回答什么问题——是要做采购决策、要测原始智能、要评估风险,还是要给模型开发做反馈信号。
- 必须明确游戏规则:你是在评方法(method,固定数据比算法)、评模型(model,随便你怎么训)、还是评agent(模型 + 脚手架)?三者不可混为一谈。
- 三个横切维度贯穿所有评测:难度(difficulty)、真实性(realism / 生态效度)、有效性(validity,尤其是训练-测试重叠)。
本讲的结构是:先用六类基准把「评什么」的地图铺开(困惑度 → 考试题 → 对话 → Agent → 纯推理 → 安全),再回过头用真实性和有效性两把尺子去审视它们,最后回答「评测究竟是为了回答什么问题」。
1. 「好」到底是什么:抽象构念 → 具体指标
整个评测领域的根本困难,Percy 用一行字概括:
抽象构念(abstract construct) → 具体指标(concrete metric)
这是从心理测量学(psychometrics)借来的术语。「智力」「健康」「经济繁荣」都是构念:它们在概念上真实存在、我们都知道自己在说什么,但都无法直接观测。你只能设计一个可观测的代理量:IQ 测验、血压计读数、GDP。而构念与指标之间永远有缝隙——GDP 不等于繁荣,IQ 不等于智力。评测研究做的事,就是不断缩小这条缝、并且诚实地报告缝还有多大。
「模型好不好」正是这样一个构念。Percy 依次给出四种把它落成指标的方式,每一种都对应现实中一个真实存在的排行榜。
1.1 好 = 在基准上分数高
1.2 好 = 分数高而且便宜
1.3 好 = 人们更喜欢它的回答
1.4 好 = 人们真的选它、并且愿意付钱
「哪个指标是对的?」——这个问题本身问错了。上面四个指标度量的是四个不同的构念:基准分数 ≈ 受控条件下的能力上限;分数/成本 ≈ 工程经济性;人类偏好 ≈ 交互体验(含风格);使用量 ≈ 市场结果。它们互相之间会给出不同的排序,而且这不是 bug。正确的做法是先问「我要做什么决策」,再挑指标。
2. 评测的坐标系:六类基准 + 三把尺子
在钻进具体基准之前,先把整张地图摆出来。Percy 这一讲的主体是六类评测,它们大致按照「离真实使用有多远」排列——同时也大致是这个领域历史演进的顺序。
| 类别 | 评什么 | 代表基准 | 打分方式 | 主要弱点 |
|---|---|---|---|---|
| 困惑度 perplexity | 模型对真实文本分配概率的能力 | PTB、WikiText-103、1BW | $\left(1/p(D)\right)^{1/|D|}$ | 依赖 tokenizer,跨模型不可比;与下游能力不是一一对应 |
| 考试题 exams | 知识 + 受控难度的推理 | MMLU、MMLU-Pro、GPQA、HLE | 多选/短答,精确匹配 | 与真实使用相去甚远;容易饱和;容易被污染 |
| 对话 chat | 开放式响应的质量与有用性 | Chatbot Arena、AlpacaEval、WildBench | 人类或 LLM 做两两比较 | 没有标准答案;风格与正确性混淆;评委有偏 |
| Agent agentic | 模型做成了什么(工具使用、多轮迭代) | SWE-Bench、Terminal-Bench、Cybench、MLE-Bench | 单元测试 / 环境自动判定 | 评的是「脚手架 + 模型」的组合;环境搭建昂贵 |
| 纯推理 pure reasoning | 剥离知识后的抽象推理 | ARC-AGI-1/2/3 | 网格输出精确匹配 / 交互得分 | 「剥离知识」极难做到;只覆盖人类式推理 |
| 安全 safety | 有害行为、越狱鲁棒性、合规 | HarmBench、AIR-Bench、GCG | 分类器判定是否越界 | 强烈依赖语境(法律、政治、社会规范因国而异) |
然后是三把横切的尺子。它们不是基准类别,而是审视任何一个基准时都要问的问题:
- 难度(difficulty):题目够不够难?模型一旦刷到 90%+,这个基准就饱和(saturated)了,再也无法区分前沿模型——这直接解释了 MMLU → MMLU-Pro → GPQA → HLE 这条不断加难的演化链。
- 真实性(realism / ecological validity):这个评测和人们真实使用模型的方式有多接近?GPQA 的博士级化学题很难,但没有任何用户会那样提问。见第 11 节。
- 有效性(validity):这个分数可信吗?如果测试题早就出现在预训练语料里,分数只是在度量记忆。见第 7 节。
把题目做难是最容易的一件事——你总能找到人类专家都答不上来的题。但难度只解决「区分度」问题,不解决「相关性」问题。一个 100% 无法被当前模型解决、同时也和任何人的实际需求无关的基准,是没有价值的。难度、真实性、有效性必须同时成立,而这三者往往互相拉扯:越真实的任务越难自动打分,越难自动打分的任务越难保证有效性。
最后还有一个常被忽略、但 Percy 在结尾专门强调的维度:游戏规则。同一个基准,在「固定训练数据、只比算法」和「随便你用什么数据训、只比最终模型」两种规则下,含义完全不同。这个问题留到第 12 节。
3. 困惑度:既是全部,又不够
回忆最基本的定义:语言模型就是 token 序列上的一个概率分布 $p(x)$。困惑度(perplexity)度量的是 $p$ 有没有给某个数据集 $D$ 分配高概率:
$$ \text{ppl}(D) \;=\; \left(\frac{1}{p(D)}\right)^{1/|D|} \;=\; \left(\prod_{i=1}^{|D|}\frac{1}{p(x_i \mid x_{<i})}\right)^{1/|D|} \;=\; \exp\!\left(-\frac{1}{|D|}\sum_{i=1}^{|D|}\log p(x_i \mid x_{<i})\right) $$也就是「平均负对数似然」取指数。它有一个非常干净的直觉解释:困惑度 = 模型在每一步平均感到「有多少个等可能的选项」。ppl = 1 表示完全确定;ppl = 50000 表示模型等于在整个词表上瞎猜。
预训练时你最小化的就是训练集上的困惑度(等价地,交叉熵损失)。那么最自然的评测就是:在测试集上测困惑度。传统语言建模研究几十年来做的就是这件事。
3.1 经典范式:分布内评测
标准数据集有三个:
- Penn Treebank(PTB)——《华尔街日报》语料,约 100 万词,小到今天看来像玩具;
- WikiText-103——维基百科,约 1 亿词;
- One Billion Word Benchmark(1BW)——来自机器翻译评测 WMT11 的语料(EuroParl、联合国文件、新闻)。
经典范式是分布内评测(in-distribution evaluation):在某个数据集的 train split 上训练,在同一数据集的 test split 上评测。在这个范式下,纯 CNN+LSTM 的模型把 1BW 的困惑度从 51.3 推到了 30.0(Jozefowicz et al., 2016)——这是 Transformer 之前语言建模的最高水位线。
3.2 GPT-2 的范式转换:分布外零样本
GPT-2 做了一件当时很反直觉的事:它在 WebText(40GB 文本,来自 Reddit 上被链接过的网页)上训练,然后不做任何微调,直接在上面那些标准数据集上测困惑度——这是分布外(out-of-distribution)零样本评测。
Percy 点出了这个例外的原因:在小数据集(PTB)上,从大规模网页语料迁移过来的知识很有帮助;但在大数据集(1BW)上就不行了——1BW 本身的训练集已经足够大,专门训练的模型能直接拟合它的分布(新闻体裁、句子被打散且独立同分布),而 GPT-2 的通用先验反而是负担。这是「预训练迁移」价值随目标数据量增大而衰减的一个早期实证。
3.3 「困惑度就是你需要的一切」——信仰多于科学
设真实分布为 $t$,模型为 $p$。测试集困惑度的期望是
$$ \E_{x\sim t}\left[-\log p(x)\right] \;=\; H(t) + \KL(t \,\|\, p) \;\ge\; H(t), $$等号当且仅当 $p = t$。也就是说,最优可达困惑度是真实分布的熵 $H(t)$,且唯一的达成方式是模型完全等于真实分布。
而如果 $p = t$,那么对任何任务,你都可以直接读出答案:
$$ p(\text{solution} \mid \text{problem}) = t(\text{solution}\mid \text{problem}). $$问题和解答都是文本,条件概率就在模型里。所以——只要不断把困惑度往下压,我们最终就会「到达 AGI」。
Percy 对这个论证的评价是:more faith than science(信仰多于科学)。逻辑本身没错,但它是一个极限陈述,对「还差多远」「下降 0.01 nats 换来多少下游能力」一言不发。而实践中我们永远达不到 $p=t$。
3.4 困惑度可能比你需要的更多
反方向的问题同样存在。看这个句子:
Stanford was founded in 1885.
困惑度会惩罚每一个 token 的预测,包括 founded 这个词。但你真正关心的是模型知不知道 1885——至于这句话用 founded、established 还是 created,纯属文体选择,预测不准并不代表模型无知。困惑度把「知识」和「文体」混在同一个数里。
补救办法是改测条件困惑度,只在响应上求平均:
$$ \text{ppl}(\text{response} \mid \text{prompt}) \;=\; p(\text{response}\mid\text{prompt})^{-1/|\text{response}|} $$这样 prompt 部分的 token 只作为条件、不计入损失。这也是所有指令微调训练里的标准做法(loss masking)。
3.5 致命问题:困惑度依赖 tokenizer,跨模型不可比
公式里的 $|D|$ 是 token 数。同一段文本,用不同 tokenizer 切出来的 token 数不同,困惑度的分母就不同——两个用不同 tokenizer 的模型,困惑度数值根本不能直接比较。
而且方向是反直觉的:tokenizer 压缩率越高(每个 token 覆盖越多字节),困惑度看起来越差,因为每个 token 携带的信息更多、更难预测。一个把整个句子当作一个 token 的极端 tokenizer 会有天文数字的困惑度,但它并不比别人差。
标准解法是换成一个与分词无关的量:bits-per-byte(BPB)。把总的负对数似然换算成比特,再除以原始文本的字节数而不是 token 数:
$$ \text{BPB}(D) \;=\; \frac{1}{N_{\text{bytes}}}\sum_{i=1}^{N_{\text{tok}}} -\log_2 p(x_i\mid x_{<i}) \;=\; \frac{N_{\text{tok}}}{N_{\text{bytes}}}\cdot \log_2 \text{ppl}(D) $$分子是「模型编码这段文本需要多少比特」,分母是文本的物理长度——两者都与分词方案无关,于是 BPB 是可比的。它同时也是一个无损压缩率:BPB = 0.8 意味着这个模型作为算术编码器能把文本压到原大小的 10%($0.8/8$)。
模型 A 的 tokenizer 平均 4.0 bytes/token,测得 ppl = 10.0:
$$\text{BPB}_A = \frac{1}{4.0}\log_2 10.0 = \frac{3.32}{4.0} = 0.83$$模型 B 的 tokenizer 更「碎」,平均 3.0 bytes/token,测得 ppl = 6.5:
$$\text{BPB}_B = \frac{1}{3.0}\log_2 6.5 = \frac{2.70}{3.0} = 0.90$$光看困惑度,B(6.5)「远好于」A(10.0);换成 BPB,A 反而更好。这就是为什么现代的预训练缩放定律工作(如 Chinchilla 之后的复现、DCLM 的数据评测)几乎都报告 BPB 而不是 perplexity。
3.6 有些基准其实是伪装的困惑度
很多看起来是「任务」的基准,本质上只是在算条件概率并取 argmax,模型一个字都不用生成:
3.7 如果你要办一个困惑度排行榜
困惑度排行榜的运作方式是:参赛者提交一个 LM,你运行 log_prob = LM(test_data) 拿到分数。这里有一个隐含的信任假设:你必须相信这些概率是合法的(在整个 token 空间上求和为 1)。如果参赛者返回的是未归一化的分数、或者对测试集里出现的 token 偷偷加权,困惑度可以被任意压低而无法从外部检测。
相比之下,下游任务评测的接口是 response = LM(prompt),然后对 response 算准确率——只依赖模型的输出行为,不依赖模型自报的概率,因此天然更难作弊。这是一个被低估的、支持下游基准的理由。
小结:困惑度在语言模型开发中仍然被大量使用,核心原因是它平滑——缩放定律(Lecture 10–11)之所以能画出漂亮的直线,靠的正是困惑度这种连续、无阈值、低方差的指标;而准确率是阶跃的、噪声大的,小模型上常年贴着随机基线,根本拟合不出趋势。但对于「不信教的人」,你仍然需要能反映真实场景的基准。
4. 考试型基准:MMLU 到 HLE 的军备竞赛
考试是测试语言模型的一种有用方式,原因和它对人类有用是同一个:
- 你能控制学科和难度——想测化学就出化学题,想加难就出研究生题;
- 可以设计成有唯一正确答案,因此容易打分——不需要人来判卷,字符串比对就行。
4.1 MMLU:知识的广度测验
Massive Multitask Language Understanding(MMLU)(Hendrycks et al., 2021)是这一类基准的奠基者:
- 57 个学科:数学、美国历史、法律、道德、临床医学、计算机安全……全部为四选一的多选题;
- 题目「由研究生和本科生从网上免费可得的来源收集」——注意这句话,它在第 7 节讲数据污染时会变成一颗定时炸弹:题目本来就来自公开网页;
- 原论文用 GPT-3 以 few-shot 提示(标准是 5-shot)评测。
Percy 特别指出:尽管名字里写着 "Language Understanding",MMLU 真正测的是知识,不是语言理解。一道「以下哪种抗生素抑制细胞壁合成」的题,语言部分毫无难度,难的是你记不记得。这解释了为什么 MMLU 分数和预训练数据量/质量高度相关,而和架构改进关系不大——它基本是一个记忆容量的探针。
4.2 打分方式:一个被严重低估的自由度
「四选一,算准确率」听起来毫无歧义。实际上至少有四种打分方式,它们在同一个模型上能差出十几个百分点,甚至会改变排行榜的顺序。
| 打分方式 | 怎么算 | 问题 |
|---|---|---|
| ① 选项文本对数概率 | $\argmax_c \log p(\text{text}_c \mid \text{question})$ | 长度偏置:短选项天然概率高 |
| ② 长度归一化 | $\argmax_c \frac{1}{|c|}\log p(\text{text}_c\mid\text{question})$ | 过度补偿,偏向长而平庸的选项 |
| ③ 无条件归一化(PMI) | $\argmax_c \log \frac{p(\text{text}_c\mid \text{question})}{p(\text{text}_c\mid \text{"Answer:"})}$ | 需要两次前向;对 prompt 模板敏感 |
| ④ 字母 / 自由生成 | 比较 $p(\texttt{"A"}),\dots,p(\texttt{"D"})$,或直接生成后解析 | 要求模型会「按格式回答」,小模型/基座模型会崩 |
import torch
def score_choice(model, tok, question, choice, normalize="none"):
"""返回一个候选选项的得分。不同 normalize 会给出不同的排名。"""
prompt_ids = tok(question, return_tensors="pt").input_ids
full_ids = tok(question + choice, return_tensors="pt").input_ids
n_prompt = prompt_ids.shape[1]
logits = model(full_ids).logits[:, :-1] # 预测下一个 token
logp = torch.log_softmax(logits, dim=-1)
tgt = full_ids[:, 1:]
tok_lp = logp.gather(-1, tgt.unsqueeze(-1)).squeeze(-1) # [1, L-1]
ans_lp = tok_lp[:, n_prompt - 1:] # 只保留选项部分
total = ans_lp.sum().item()
if normalize == "none":
return total # ① 有长度偏置
if normalize == "token":
return total / ans_lp.shape[1] # ② 按 token 数归一化
if normalize == "unconditional":
base = score_choice(model, tok, "Answer:", choice)
return total - base # ③ PMI 风格
你在论文 A 里看到的 68.2 和论文 B 里看到的 71.5,很可能用的不是同一种打分方式,甚至不是同一套 prompt 模板、不是同样的 few-shot 例子数量、不是同样的选项排列顺序。已知的敏感性来源包括:
- 选项顺序:把正确答案从 A 换到 D,分数会变——模型对字母位置有先验偏好;
- few-shot 数量与示例选择:0-shot 与 5-shot 差距可以很大,尤其对未做指令微调的基座模型;
- 模板细节:有没有
Answer:、有没有学科名前缀、换行符怎么打。
这正是 HELM 之类工作坚持「统一 prompt 模板、统一打分方式、公开每一条预测」的原因(第 10 节)。你自己复现一个基准时,务必对齐 harness,否则你会花一周时间调试一个根本不存在的性能差距。
4.3 MMLU-Pro:把饱和的基准修好
到 2024 年,前沿模型在 MMLU 上都挤在 86–90% 这个区间,噪声和真实差距同量级——基准饱和(saturated)了。MMLU-Pro 做了三处改动:
- 删掉噪声题和 trivial 题(MMLU 里确实存在标注错误和答案自明的题);
- 把 4 个选项扩到 10 个选项——随机基线从 25% 降到 10%,同时大幅降低「猜对」的贡献;
- 用思维链(chain-of-thought)评测,给模型更多发挥空间(这是有意为之:目的是测能力上限,而不是测模型能不能一步猜出来)。
结果是模型准确率下降了 16 到 33 个百分点,基准重新获得了区分度。
4.4 GPQA:Google 都搜不到的研究生题
GPQA(Graduate-Level Google-Proof Q&A)换了一条路:不靠数量,靠题目本身的稀缺性。题目由 61 位在 Upwork 上雇来的 PhD 撰写(生物、物理、化学),并且经过一套精心设计的验证流程。
- 同领域 PhD 专家:65% —— 这是「人类专家水平」的锚点;
- 非专家 + 30 分钟不限次 Google 搜索:34% —— 这就是 "Google-Proof" 的操作化定义:能搜到就不算好题;
- GPT-4(论文发表时):39% —— 略高于会上网的外行,远低于专家。
「非专家 34%」这个设计非常聪明:它把「难度」这个模糊概念变成了一个可测量的、有对照组的量。此后所有严肃的难基准都会报告类似的人类基线。
4.5 Humanity's Last Exam:出到没题可出
当 GPQA 也被推理模型刷到 80%+ 之后,Humanity's Last Exam(HLE)把这条路线推到了极致:2500 道题,多模态,覆盖极多学科,多选题 + 简答题混合。
更有意思的是它的数据采集机制设计,这是评测工程里少见的、把激励机制做对了的案例:
- 50 万美元奖金池 + 论文共同作者身份发给出题人——用真金白银和学术信用去买稀缺的专家时间;
- 用前沿 LLM 做第一道过滤:如果当时最强的几个模型都能答对,这道题直接淘汰。这保证了基准在发布当天就是「未饱和」的;
- 随后是多阶段人工评审,剔除有歧义、答案有争议、或者其实能搜到的题。
- 趋势是题目越来越难:模型不断进步、把已有基准刷饱和,逼着评测方不断加码(MMLU → MMLU-Pro → GPQA → HLE)。
- 多选格式的难度可以任意高——它不是「简单题专用格式」,HLE 证明了这一点。
- 但它捕捉不到真实使用:真实的提问是开放式的,而且往往根本不存在唯一正确答案。下一节就从这里开始。
5. 开放生成怎么评:从 n-gram 指标到 LLM-as-a-judge
到目前为止我们评的都是定义良好的多选任务。但 Percy 提醒:大多数人不会拿多选题去问自己的 AI 助手。真实的对话长这样:
Prompt:I would like to make a beet salad with goat cheese. What kind of herbs would work well and what would not work well?(我想做一道甜菜根配山羊奶酪的沙拉。哪些香草搭配得好,哪些不好?)
Response:Here's a breakdown of herbs that work well (and some that don't) in a beet + goat cheese salad, based on how their flavors interact with the sweet-earthiness of beets and the tangy creaminess of goat cheese...
这里没有标准答案。挑战:如何评价一个开放式响应?
5.1 为什么 n-gram 重叠指标彻底失效
机器翻译和摘要领域的传统答案是 BLEU / ROUGE:准备一份参考答案,计算模型输出与它的 n-gram 重叠。这套方法在开放生成上崩得很彻底,原因有三层:
- 好答案的空间是无穷的。「莳萝、薄荷、龙蒿都不错,迷迭香会盖过味道」和「避免使用木质香草如迷迭香,选择清爽的莳萝或薄荷」是同一个答案,n-gram 重叠却接近零。参考答案数量再多也覆盖不了。
- 词面重叠与质量无关。一个把参考答案打乱重组的胡言乱语可以拿到很高的 BLEU;一个更好的、结构不同的答案可以拿到很低的 BLEU。
- 维度太多。用户关心的是正确性、有用性、组织结构、语气、长度是否合适——这些没有任何一个能被 n-gram 覆盖。
于是这个领域走向了两条路:让人来评(第 6 节的 Chatbot Arena),和让另一个语言模型来评(LLM-as-a-judge)。后者的动机很实际:人类评测每条几美元、几天出结果,而模型开发需要每天迭代。
5.2 AlpacaEval:把「好」定义成对基线的胜率
AlpacaEval(2023,来自本课另一位讲师 Tatsu 的组)的设计非常精简:
- 805 条指令,来自多个来源,覆盖典型的助手使用场景;
- 指标是「对基线模型的胜率(win rate)」:基线固定为 GPT-4 preview,评委也是 GPT-4 preview;
- 对每条指令,把待测模型和基线的两个回答给评委,问哪个更好;胜率就是最终分数。
用 GPT-4 去评判「GPT-4 的回答 vs 你的回答」,存在明显的自我偏好(self-preference)风险:LLM 评委倾向于偏好和自己风格相近的输出。这在实践中会系统性地压低风格迥异的模型的分数。
5.3 长度偏置与「刷榜」
AlpacaEval 暴露出的最著名问题是:LLM 评委偏好更长的回答。这直接导致了排行榜被博弈——你只要让模型多写几段、多加几个 bullet、多来一句总结,胜率就能上去,而实际有用性并没有提升。
AlpacaEval 2.0 的解法是用回归把长度这个混淆变量除掉,得到「长度受控胜率(length-controlled win rate)」。思路是拟合一个广义线性模型,把「模型身份」和「长度差」分开:
$$ \mathrm{logit}\;\Pr(\text{模型 } m \text{ 胜}) \;=\; \underbrace{\theta_m}_{\text{模型本身的质量}} \;+\; \underbrace{\gamma_m \cdot \phi(\Delta \text{len})}_{\text{长度带来的加成}} \;+\; \underbrace{\psi_m \cdot \delta_{\text{instr}}}_{\text{指令难度}} $$其中 $\phi(\Delta\text{len})$ 是对「待测回答与基线回答的长度差」做的一个有界变换(论文用 $\tanh$ 之类的压缩,避免极端值主导)。拟合完之后,把长度项强行置零再算胜率——相当于问「如果两个回答一样长,你还会赢吗」。
长度既影响评委判断,也和模型身份相关,是典型的混淆变量(confounder)。你不能简单地把长回答删短(那会破坏内容),但你可以在统计模型里把它的贡献分离出来再剔除。同样的技巧后来被 Chatbot Arena 采纳,用来做「风格控制(style control)」——除了长度,还控制 markdown 标题数、列表数、加粗数量。
5.4 除了长度,还有位置偏置
另一个必须处理的系统性偏差是位置偏置(position bias):把同样两个回答交换 A/B 顺序,LLM 评委相当一部分情况下会改变判断——它对「第一个出现的」或「第二个出现的」有偏好。标准补救是双向评测:
def judge_pair(judge, prompt, resp_a, resp_b):
"""两个方向各评一次,消掉位置偏置。返回 A 的得分 in {0, 0.5, 1}。"""
v1 = judge(prompt, first=resp_a, second=resp_b) # 返回 "first" / "second"
v2 = judge(prompt, first=resp_b, second=resp_a) # 顺序反过来
a_wins = (v1 == "first") + (v2 == "second")
b_wins = (v1 == "second") + (v2 == "first")
if a_wins == b_wins:
return 0.5 # 两次判断不一致 -> 记平局(这本身是有用的信号)
return 1.0 if a_wins > b_wins else 0.0
顺带一提,「两个方向判断不一致的比例」是一个很好的评委可靠性诊断量:如果它超过 20–30%,说明你的评委在这类任务上基本是在掷硬币。
5.5 怎么评价一个评测指标?
Percy 在这里抛出一个关键的元问题:How do we evaluate the metric?(我们怎么评价这个指标本身?)
答案是:看它和人类判断的相关性。AlpacaEval 论文报告的正是它与 Chatbot Arena(真人投票)的排名相关性——而且相关性很高。这确立了一个此后被广泛沿用的范式:
人类偏好(Chatbot Arena)→ 作为「金标准」→ 用来验证自动评委(AlpacaEval / WildBench)→ 自动评委因为便宜快速而被用于日常迭代。
注意这条链条的脆弱之处:金标准本身有偏(第 6 节会讲 Arena 的问题),而自动评委被优化去拟合这个有偏的金标准,于是偏差被固化并放大。这也是为什么 Percy 反复强调「没有唯一正确的评测」——你必须知道自己站在哪条验证链上。
5.6 WildBench:真实分布 + 检查清单
WildBench 在两个方向上做了改进:
- 更真实的 prompt 分布:从 100 万条真实人机对话中筛出 1024 个样例,而不是人工编写指令。这直接提升了生态效度(第 11 节);
- 带检查清单的评判:用 GPT-4-turbo 作评委,但先为每道题生成一份checklist(这道题的好答案应该满足哪几条),再逐条核对。这相当于评判版的思维链——先把评价标准显式写出来,再打分,而不是让评委凭「感觉」直接给一个数。
- 开放式响应的评测核心难题:没有唯一正确答案,词面匹配类指标全部失效。
- 两两比较(pairwise comparison)比绝对打分提供更高的信号——尤其当两个回答质量接近时,人和模型都更擅长说「哪个更好」而不是「打几分」。
- 当心偏差:长度偏置、位置偏置、自我偏好、讨好倾向——人类评委和 LLM 评委都有。
- 检查清单 / 评分细则(rubric)能显著提升可靠性,无论评委是人还是模型。这是本节最可迁移的实践建议。
6. 人类偏好:Chatbot Arena 与 Bradley–Terry / Elo
Chatbot Arena(现在叫 Arena AI)是目前影响力最大的人类偏好评测。它的数据采集流程简单到可以用三句话说完:
- 互联网上一个随机的人,输入一个 prompt;
- 他拿到两个随机的、匿名化的模型给出的回答;
- 他给出评价:哪个更好(或平局 / 都很差)。
6.1 从两两比较到一个分数
现在你手上有几百万条形如「在 prompt $x$ 上,模型 $A$ 胜过模型 $B$」的记录。怎么变成一个排行榜?Percy 给出的模型是:
$$ \Pr(A \text{ beats } B) \;=\; \frac{1}{1 + 10^{(\mathrm{ELO}_B - \mathrm{ELO}_A)/400}} $$然后拟合这个模型,使得观测到的两两比较结果的概率最大。这就是全部——但值得把它拆开看,因为这个公式的每一部分都有来历。
Bradley–Terry 模型假设每个选手 $i$ 有一个正的「强度」 $\pi_i > 0$,则
$$ \Pr(i \text{ beats } j) = \frac{\pi_i}{\pi_i + \pi_j}. $$令 $\pi_i = e^{\beta_i}$,分子分母同除 $e^{\beta_j}$:
$$ \Pr(i \succ j) = \frac{e^{\beta_i}}{e^{\beta_i}+e^{\beta_j}} = \frac{1}{1+e^{-(\beta_i - \beta_j)}} = \sigma(\beta_i - \beta_j). $$也就是说,胜率只依赖于两个隐含分数之差,且通过 logistic 函数联系。
Elo 公式只是把底数从 $e$ 换成 10、并把尺度乘上 400:
$$ \sigma\!\left(\frac{\ln 10}{400}(R_i - R_j)\right) = \frac{1}{1+10^{-(R_i-R_j)/400}}. $$对照可得 $\beta = \dfrac{\ln 10}{400} R$,即 $R = \dfrac{400}{\ln 10}\beta \approx 173.7\,\beta$。400 分的差距对应 10 倍的胜率比(约 91% 胜率),这就是 Elo 那个魔法数字 400 的全部含义。
6.2 拟合:这其实是一个逻辑回归
给定 $N$ 条比较记录 $\{(w_n, l_n)\}$($w$ 胜 $l$ 败),最大似然等价于最小化
$$ \mathcal{L}(\beta) = -\sum_{n=1}^{N} \log \sigma\!\left(\beta_{w_n} - \beta_{l_n}\right) \;+\; \lambda\|\beta\|^2 $$这是凸问题,而且形式上就是一个特征为「one-hot 差向量」的逻辑回归:第 $n$ 条样本的特征向量 $z_n \in \R^{M}$($M$ 为模型数)满足 $z_n[w_n]=1,\; z_n[l_n]=-1$,其余为 0,标签恒为 1。于是可以直接调库:
import numpy as np
from sklearn.linear_model import LogisticRegression
def fit_bt(battles, models):
"""battles: [(winner, loser), ...] -> {model: elo}"""
idx = {m: i for i, m in enumerate(models)}
X = np.zeros((len(battles), len(models)))
for n, (w, l) in enumerate(battles):
X[n, idx[w]] = +1.0
X[n, idx[l]] = -1.0
y = np.ones(len(battles)) # 每条样本都是「第一个赢」
lr = LogisticRegression(fit_intercept=False, C=1.0)
lr.fit(np.vstack([X, -X]), np.concatenate([y, 1 - y])) # 加负样本保证可辨识
beta = lr.coef_[0]
beta -= beta.mean() # 只有差有意义,固定一个零点
elo = 400.0 / np.log(10) * beta + 1000.0
return dict(zip(models, elo))
国际象棋里的 Elo 是在线增量的:$R \leftarrow R + K(S - \hat{S})$,每下完一局更新一次。它的设计目的是追踪随时间变化的棋手水平。但语言模型的水平在评测期间是固定的,在线更新只会引入对「比赛顺序」的依赖——同样一批数据换个顺序喂进去,排名会变。
所以 Arena 实际用的是上面这个批量最大似然(Bradley–Terry MLE),并用 bootstrap 重采样给出置信区间。排行榜上那些 $\pm 5$ 的误差棒就是这么来的——看排行榜时永远先看置信区间,相邻几名往往在统计上无法区分。
6.3 Arena 的优点
- 真实世界的 prompt:用户是来免费用模型的,他们输入的是自己真正想问的东西,动机真实。
- 不需要把同一批 prompt 喂给所有模型。Percy 特别把这一点点出来当作一个 feature:因为打分的是人,你没法要求每个人把所有模型的回答都读一遍。Bradley–Terry 天然处理稀疏、不平衡的对战图——只要对战图是连通的,所有模型的相对分数就都可辨识。这是它相对于「固定测试集 × 所有模型」范式的巨大工程优势。
- 动态:新 prompt 和新模型随时可以加入,不需要重跑历史。
6.4 Arena 的问题(Percy 逐条点名)
- 这些人是谁?投票者是自选样本(self-selected)——上网、懂英语、对 AI 感兴趣、有闲。他们的偏好未必代表企业采购者、医生、或者非英语用户。还有刷票者(spammers)和有组织的拉票问题。
- 二元偏好混淆了风格与正确性。用户点的那一下同时包含了「更对」「更好看」「更长」「语气更讨喜」,你无法从一个比特里把它们分开。
- 人类根本无法评估正确性。如果你问的是一道你不会做的题,你怎么判断哪个答案对?实际发生的是:你会选那个看起来更自信、更有条理的答案。
- 容易招致讨好(sycophancy)。模型只要学会附和用户、多夸几句、多用 markdown 排版,就能在 Arena 上涨分——而这些行为对实际任务毫无帮助,甚至有害。这是「优化排行榜」与「优化真实有用性」之间最典型的一个背离。
针对风格污染,Arena 后来引入了风格控制(style control):在 Bradley–Terry 的回归里额外加入回答长度、markdown 标题数、列表条数、加粗数等特征,拟合后把这些系数置零,得到「去风格化」的分数。思路和第 5.3 节 AlpacaEval 的长度去偏完全一致:
$$ \mathrm{logit}\,\Pr(A \succ B) = (\beta_A - \beta_B) + \sum_{k} \gamma_k \cdot \left(s_k^{(A)} - s_k^{(B)}\right) $$其中 $s_k$ 是第 $k$ 个风格特征。加上风格控制后,排行榜上一部分模型的名次会明显下滑——那部分排名就是靠排版和篇幅换来的。
Arena 度量的构念是「在开放对话中,一个自选的互联网人群更喜欢谁的回答」。这是个真实且重要的构念,但它不是「智能」,也不是「在你的业务场景下更有用」。一个在 Arena 上排第一的模型,在你的代码库上、在你的医疗文档上、在你的成本预算下,完全可能是错误选择。第 11 节讲的 GDPVal、MedHELM 就是为了补上这个缺口。
7. 有效性危机:数据污染与数据集质量
前面所有基准都建立在一个假设上:分数反映的是能力。这一节问的是:我们凭什么相信这一点?Percy 把这个问题叫做 validity(有效性),它有两个主要威胁:训练-测试重叠,和数据集本身的质量。
7.1 训练-测试重叠:机器学习 101 崩塌了
机器学习第一课就是:不要在测试集上训练。在基础模型之前,这条规矩很好守——ImageNet、SQuAD 都有明确定义的 train/test 划分,你用了哪些数据是公开的、可审计的。
今天的情况是:在整个互联网上训练,并且不告诉任何人自己的数据。
回想第 4.1 节 MMLU 的自述:题目「由学生从网上免费可得的来源收集」。也就是说,MMLU 的题目在被收集成基准之前就已经在网上了。任何在网页快照上训练的模型,都有很大概率见过其中相当一部分。GPQA、HLE 之所以要花大价钱雇专家原创题目,一半原因是难度,另一半原因正是避免污染。
更麻烦的是二次污染:基准一旦发布,就会被人搬到 GitHub、博客、Hugging Face、Reddit 讨论、以及各种「刷题网站」上,然后被下一轮爬虫收进语料。基准的有效性会随时间单调衰减。
检测手段一:n-gram 重叠
最直接的方法:把测试题拿去和训练语料做字符串匹配。GPT-3 论文用的是 13-gram 重叠,Llama 系列用过 8-gram,具体阈值各家不同。做法是把训练语料建成 n-gram 索引,然后统计每道测试题有多大比例的 n-gram 命中。
局限:只有训练数据的持有者才能做这件事——外部研究者拿不到语料。而且它对改写、翻译、格式变化完全无能为力:把题目换个说法、翻译成中文再翻回来,n-gram 重叠归零,但记忆效应还在。
检测手段二:canary 字符串
BIG-bench 开创的做法:在数据集文件里嵌入一段全局唯一的随机 GUID(canary,「金丝雀」),并明确要求「训练时请排除包含此字符串的文档」。之后只要问模型「请补全这个 GUID」,如果它能背出来,就证明它见过这份数据。
局限:这是自愿合规机制。它只能抓住诚实的人,抓不住有意或无意忽略它的人;而且经过清洗流水线(去重、切分、格式转换)后 canary 常常会丢失。
检测手段三:成员推断攻击
成员推断(membership inference)的思路是:模型对见过的文本会给出异常高的概率。最简单的版本是看整段的困惑度;更稳健的是 Min-K% Prob——只看这段文本里概率最低的那 $K\%$ 个 token 的平均对数概率:
$$ \text{Min-K\%}(x) \;=\; \frac{1}{|S_K|}\sum_{x_i \in S_K} \log p(x_i \mid x_{<i}),\qquad S_K = \text{概率最低的 } K\% \text{ 个 token} $$直觉是:没见过的文本总会有几个「意外」的 token 把分数拉下来;见过的文本连最难的 token 都很顺。但整体而言,单条文本的成员推断在大模型上信噪比很差——因为大语料上每条数据只被见过一两次,记忆信号非常弱。
检测手段四:可交换性检验(这是最漂亮的一个)
Percy 重点介绍的是 Oren et al., "Proving Test Set Contamination in Black Box Language Models"。它的洞察是:不要检测单条样本,要检测整个数据集的顺序。
一个基准数据集 $D = (d_1, d_2, \dots, d_n)$ 里,各条样本之间是可交换的(exchangeable)——第 7 题排在第 3 题前面还是后面,没有任何语义意义。
零假设 $H_0$(没有污染):模型没见过这份文件,那么它对「按原顺序拼接的 $D$」和「随机打乱后拼接的 $D_\pi$」应该给出同分布的对数似然:
$$ \log p(D) \;\overset{d}{=}\; \log p(D_{\pi}),\qquad \pi \sim \text{Uniform}(S_n). $$如果模型训练时见过这份文件,它记住的是那个特定的顺序,于是 $\log p(D) \gg \log p(D_\pi)$。
于是构造一个置换检验(permutation test):采样 $m$ 个随机置换,计算
$$ \hat{p} = \frac{1 + \#\{\pi : \log p(D_\pi) \ge \log p(D)\}}{1 + m}. $$这个 $\hat p$ 是一个严格有效的 p 值——不需要访问训练数据,只需要黑盒地拿到 log-prob。$\hat p < 0.05$ 就是「该基准被训练过」的统计证据。
7.2 四条应对路线
| 路线 | 做法 | 代价 / 局限 |
|---|---|---|
| ① 从模型反推重叠 | 可交换性检验、成员推断、canary | 只能事后检测;对「改写后的污染」无效;需要 log-prob 访问权限 |
| ② 建立报告规范 | 模型提供方主动报告训练-测试重叠率(Singh et al., 2024),就像今天大家都会报告置信区间一样 | 纯靠自律;商业上没有动机 |
| ③ 用新鲜评测 | LiveCodeBench、UncheatableEval:持续爬取训练截止日之后的新网页/新题目 | 时间戳并不总是安全的——新页面的内容可能是老内容的复制/改写 |
| ④ 用私有评测 | 公司用自己不在互联网上的内部代码库;个人用自己的私人写作 | 不可复现、不可比较、不可公开;对困惑度最容易实现(不需要标注答案) |
路线 ④ 对困惑度特别友好:你只需要一堆没被公开过的文本,不需要出题、不需要标答案、不需要设计打分规则。把你自己的邮件、内部文档、私有代码仓拿来算 bits-per-byte,就得到了一个零污染、贴合你自身分布的评测。它无法告诉你模型的绝对能力,但对「模型 A 还是模型 B 更懂我的领域」这个采购问题,往往比任何公开榜单都准。
7.3 另一半问题:数据集本身有多脏
就算完全没有污染,基准也可能是错的——因为题目和标准答案本身有问题。这是评测领域长期被忽视的一块。
- SWE-Bench → SWE-Bench Verified:OpenAI 请专业软件工程师逐条审查 SWE-Bench,发现相当一部分任务根本无法从 issue 描述中推断出预期行为,或者单元测试过于严苛(要求实现细节完全一致)。清洗后剩下 500 个经人工确认可解的任务——模型分数因此显著上升,但那不是模型变强了,是尺子被修直了。
- Platinum Benchmarks:对一批经典基准做逐题人工核查,剔除标注错误。结论很扎心:前沿模型在这些「简单」基准上剩下的错误,有很大比例其实是基准本身标错了——真实的剩余错误率比报告的低得多,我们一直在测量噪声。
- Agent 基准的特有问题:测试用例覆盖不足(agent 写了个假实现也能过测)、任务实际上被trivial agent(什么都不做、或只做一步的基线)就能解决。这类问题会让「agent 能力提升」的结论完全站不住。
- Docent:用语言模型去审查 agent 的执行轨迹,自动发现「它是不是靠作弊过的关」「它是不是卡在一个环境 bug 上」。这是一种很务实的方向——用模型来给评测本身做质检。
如果你只从这一节带走一件事:看到任何基准分数,先问两个问题——「这些题在网上吗?」和「有人逐条看过模型的输出吗?」。前者决定分数是不是记忆,后者决定分数是不是噪声。HELM 之所以坚持把每一条预测都公开可浏览,正是为了让第二个问题有答案。
8. Agent 与真实任务:从「说了什么」到「做成了什么」
Percy 用一句话概括这个转折:
- 之前:评测语言模型说了什么(chat);
- 现在:评测语言模型做了什么(agents)。
这里必须先把定义钉死:
Agent = 语言模型 + Agent 脚手架(scaffold,决定如何使用这个 LM 的逻辑)
我们关心的是那些需要使用工具(比如运行代码)、并且需要在一段时间内反复迭代的任务。这类任务有一个巨大的评测优势:结果往往可以被环境自动判定——单元测试过不过、flag 拿到没拿到、提交的分数是多少。不需要人评,也不需要 LLM 评委。
8.1 SWE-Bench:修真实仓库里的真实 issue
它同时满足了三个通常互相冲突的要求:客观(二值、无歧义)、自动(零人力)、真实(这是人类工程师本来就在用的验收标准)。这也是为什么代码类任务成了 agent 评测的主战场——在别的领域你很难找到这样一个天然存在的、可执行的 oracle。
但注意它的软肋(第 7.3 节已经提过):测试覆盖不足时,一个投机取巧的补丁也能通过;测试过严时,一个正确但实现不同的补丁会被判错。
8.2 Terminal-Bench:把终端当作通用环境
规模:229 个任务,来自 93 位贡献者众包;其中经过筛选的 89 个任务构成 Terminal-Bench 2.0。
8.3 Cybench:网络安全夺旗赛
Cybench 一个特别值得学习的设计是用「首次解出时间(first-solve time)」作为难度度量——即在原始比赛中,全球最快的人类战队花了多久解出这道题。于是可以画出「模型能解决人类需要多久的题」这条曲线:
8.4 MLE-Bench:让 agent 去打 Kaggle
8.5 脚手架:你到底在评什么?
Percy 引用了 Deep Agents 一文,把当代 agent 脚手架的四个关键组件列了出来:
| 组件 | 做法 | 解决什么问题 |
|---|---|---|
| 显式规划 explicit planning | 维护一份 todo 列表,完成一项勾掉一项 | 长任务中模型会「忘记」原始目标、漏做子任务 |
| 层级委派 hierarchical delegation | 主 agent 调用子 agent,子 agent 有干净的上下文,只返回结论 | 上下文窗口被中间过程塞满;无关信息干扰主线推理 |
| 持久记忆 persistent memory | 把状态写进文件,需要时再读回来 | 上下文是易失的、有限的;文件系统是无限且持久的 |
| 极致上下文工程 context engineering | 在系统提示里对「流程」给出大量显式指令 | 模型不知道这个具体环境的规范做法、边界与陷阱 |
- Agent 极大地扩展了语言模型的能力面——同一个模型,加上能跑代码、能读文件、能迭代的脚手架,可解决的任务范围完全不是一个量级。
- 脚手架非常重要,重要到它经常是分数差异的主要来源。
- 因此你永远无法单独评测「模型」:SWE-Bench 上的 65% 是「某模型 + 某脚手架 + 某预算」的联合结果。看到 agent 榜单时,先找脚手架是哪一个、token 预算多少、允许几次尝试。
这正是第 0 节 takeaway 里「明确游戏规则」的具体含义——第 12 节会把这条线收尾。
9. 纯推理:ARC-AGI 与推理模型时代
到目前为止的所有任务,都同时需要语言能力和世界知识。SWE-Bench 要懂 Python 生态,GPQA 要懂有机化学,Arena 要懂英语表达习惯。于是有一个自然的问题:
能不能把「推理」从「知识」里分离出来?
Percy 的表述是:可以说,推理捕捉了一种更纯粹的智能形式——它不只是记住事实。如果一个系统能在完全没见过的规则体系里推出正确答案,那比它记住了多少化学式更能说明问题。
9.1 ARC-AGI 的设计哲学
ARC-AGI(Abstraction and Reasoning Corpus)由 François Chollet 提出,两条设计原则决定了一切:
- 人类 100% 可解,但对 AI 极具挑战——每道题都是彩色网格上的几个「输入→输出」示例,你要推断出隐含的变换规则,然后应用到新的输入上。规则本身(对称、计数、填充、重力、包含关系)都是人类幼儿就具备的核心先验知识,不需要任何专业知识。
- 每个任务都是独一无二的,所以记忆没用——这是它对抗第 7 节数据污染问题的根本方式:你没法通过背题来解题,因为每道题的规则都不一样。
每道 ARC 题只给 2–4 个示例,你要从中归纳出一个程序,再执行它。这和语言模型平时做的「在海量数据上插值」是根本不同的操作:它要求从极少样本中提取抽象规则。这也是为什么纯预训练模型在上面长期毫无进展——你无法通过见得更多来解决一个「见得少也要会」的问题。
ARC-AGI-1(2019)是第一版;ARC-AGI-2(2025 年 3 月)加入了更多需要多步组合推理的题目——单条规则不够,你得把几个规则串起来用。
9.2 结果:推理模型让曲线突然抬头
推理模型的分数随思考 token 预算单调上升。同一个模型,让它想 1K token 和想 100K token,是两个完全不同的系统。ARC Prize 在公布 o3 成绩时,特意同时报告了每道题的推理成本,低算力配置和高算力配置之间差了大约两个数量级——高算力下分数大幅提升,但单题成本高到无法实际部署。
于是「准确率 X%」这个数字在推理模型时代本身已经不构成一个完整的陈述。正确的报告方式是一条曲线:准确率 vs. 每题算力(或美元)。这也让第 1.2 节那张「分数—成本」帕累托图从一个商业视角,变成了一个科学必需品。
同样的逻辑适用于数学竞赛类基准(AIME、HMMT、IMO 级别题目):这些基准在 2024 年之后成为推理模型的主战场,而它们的分数同样对采样次数(pass@k、多数投票的样本数)和思考预算极其敏感。报告 "AIME 90%" 而不说采样策略,等于什么都没说。
9.3 ARC-AGI-3:从静态谜题到交互环境
- 「把推理从知识中解耦」极其困难。ARC 用彩色网格来规避语言和领域知识,但网格本身就编码了视觉先验(物体、连通性、对称性)。你只是换了一套知识,不是消除了知识。
- 它被约束在人类推理上,而不是超人推理。「100% 人类可解」这条设计原则保证了公平的人类基线,但也意味着ARC 永远无法度量超越人类的能力。当模型在 ARC 上达到 100% 时,我们只知道它在这类问题上不比人差,不知道它能否发现人类想不到的东西。
尽管如此,Percy 的评价是正面的:ARC 清晰地暴露了当前模型的缺陷。在一个所有基准都在被刷爆的时代,一个能稳定让最强模型难堪的基准,本身就是稀缺资源。
10. 安全评测与红队
Percy 开场用了一个类比:汽车的碰撞测试评级。汽车行业有成熟的、标准化的、由第三方执行的安全评级体系,消费者看得懂,监管者用得上。AI 有什么?——先得回答一个更基础的问题:对 AI 来说,「安全」到底是什么意思?
10.1 两种构建安全基准的路线
路线一:从行为出发。HarmBench 基于 510 种违反法律或社会规范的有害行为——制造武器、网络犯罪、骚扰、虚假信息等。每条对应一个请求,用分类器判断模型是否实际执行了该行为(而不只是说了些什么)。HELM 上有完整榜单,并且可以逐条查看真实的失败案例——这一点很重要,安全评测尤其不能只看聚合数字。
路线二:从规则出发。AIR-Bench 不自己定义什么是有害,而是直接从各国监管框架和各公司的使用政策中抽取,整理成一个 314 个风险类别的分类体系,配 5694 条 prompt。
安全评测最容易被质疑的一点是:凭什么是你来定义什么算有害?AIR-Bench 把这个问题外包给了已经存在的、有合法性来源的文本——欧盟 AI 法案、美国行政令、以及 OpenAI/Anthropic/Google 自己公布的使用政策。于是评测结论变成了一句无法反驳的陈述:「按照贵公司自己写的政策,你的模型在这 N 个类别上违反了自己的规定。」AIR-Bench 榜单。
10.2 越狱:对抗性攻击
语言模型被训练成拒绝有害指令。问题是这层防护有多结实?
GCG(Greedy Coordinate Gradient)(Zou et al., 2023)证明了:不结实。它自动优化出一段对抗性后缀,拼在任何有害请求后面就能绕过安全对齐。方法本身很直接:
- 把目标设为最大化模型以肯定语气开头的概率,比如 $p(\text{"Sure, here is how to..."} \mid \text{prompt} + \text{suffix})$。一旦模型开了这个头,后面的内容就会顺着生成下去。
- token 是离散的,没法直接梯度下降。GCG 用梯度作为候选提议:对后缀的每个位置,用 one-hot 嵌入上的梯度挑出 top-$k$ 个最有希望的替换 token。
- 然后实际前向计算这些候选,贪心地选损失最小的那个,替换、迭代。
10.3 安全为什么难以标准化
- 安全的很多方面是强烈依赖语境的。政治、法律、社会规范因国家而异:在一个国家属于合法言论的内容,在另一个国家可能违法;在一种文化里正常的表达,在另一种文化里冒犯。不存在一个全球通用的安全基准,这是原理性的,不是技术不够好。
- 风险的种类极其多样。Percy 列举的清单跨度惊人:幻觉(hallucination)、谄媚(sycophancy)、协助犯罪(abetting crimes)、加剧不平等(inequality)、以及人类丧失批判性思维能力。这些风险的度量方式毫无共同点——测幻觉要事实核查,测谄媚要设计诱导实验,测「丧失批判性思维」需要纵向的人类研究。把它们压进一个「安全分数」是没有意义的。
10.4 双重用途
最后一个根本性困难:双重用途(dual-use)。Percy 举的例子正是第 8.3 节的 Cybench——一个有能力的网络安全 agent,既可以被用来入侵系统,也可以被用来做渗透测试、发现并修补漏洞。
这两件事在能力层面是同一件事。你无法通过限制能力来只保留好的一面;能区分它们的只有使用者的意图和部署的语境——而这两样东西都不在模型里,因此也不在任何模型评测的范围内。这是为什么安全评测最终必然要延伸到部署层面的治理,而不能只停留在基准分数上。
11. 生态效度:让评测贴近真实使用
Percy 用心理学的术语给这一维度命名:生态效度(ecological validity)——一个评测在多大程度上捕捉了真实世界的使用。
把前面讲过的基准放到这把尺子上:
- 考试型基准(如 GPQA)离真实使用非常远。没有用户会拿博士资格考试题去问客服机器人。它们测的是能力上限,不是使用场景。
- Chatbot Arena 的 prompt 来自真人,但分布是不受控的。你得到了真实性,却失去了覆盖度——你不知道这些 prompt 代表了哪些人群、哪些职业、哪些真正有经济价值的任务。
下面三个工作代表了三种补救思路。
11.1 GDPVal:按经济结构去采样任务
「什么任务重要」是个没有客观答案的问题。GDPVal 的回答是:让经济结构来决定权重。这既解决了「凭什么选这些任务」的合法性问题,也让评测结论可以直接对接一个所有人都关心的问题——AI 能替代或加速多少经济产出。代价是它偏向可数字化交付的白领工作,且完全是美国视角。
11.2 MedHELM:从标准化考试转向真实临床任务
MedHELM 针对的是一个具体病灶:此前的医疗基准都基于标准化考试(USMLE 之类的执照题)。「模型通过了美国医师执照考试」这个新闻标题传播极广,但医生的日常工作并不是做选择题——而是写病历摘要、做鉴别诊断、回复患者消息、核对用药冲突、整理出院小结。
MedHELM 的做法是:从 29 位临床医生那里采集 121 个真实临床任务,并且混合使用公开数据集和私有数据集(后者同时也缓解了第 7 节的污染问题)。MedHELM 榜单。
11.3 Clio:直接分析真实用户数据
Percy 在这里给出了本节最重要的一句判断:不幸的是,真实性和隐私有时是互相冲突的。
最真实的评测数据,就是用户真实的对话、真实的代码库、真实的病历——而这些恰恰是最不能公开的。于是这个领域被推向两个不理想的极端:公开但不真实的基准(考试题、合成指令),和真实但不可复现的私有评测(各家公司内部的评估集)。Clio 这类「只发布聚合统计」的做法,是目前在这条张力上找到的少数可行折中之一。
11.4 HELM 的整体性评测哲学
贯穿本讲的一条暗线是 HELM(Holistic Evaluation of Language Models)——Percy 自己在 Stanford CRFM 主持的评测框架。前面几乎每个基准都出现过一个 "on HELM" 的链接,这不是偶然,而是一套明确的方法论主张:
| 主张 | 具体做法 | 解决什么问题 |
|---|---|---|
| 多场景覆盖 | 把大量场景(scenario)系统性地列成一个分类体系,明确标出哪些格子是空的 | 避免「只测有基准的地方」,让覆盖缺口本身变得可见 |
| 多指标并行 | 对每个场景同时测准确率、校准度、鲁棒性、公平性、偏见、毒性、效率 | 单一准确率会掩盖代价:一个更准但更慢、更有偏见的模型不一定更好 |
| 标准化 prompt 与打分 | 所有模型走同一套模板、同一种打分方式 | 第 4.2 节讲的那些自由度不再污染横向比较 |
| 完全透明 | 公开每一条 prompt 和每一条模型输出,任何人可以点进去逐条看 | 让「聚合分数背后到底发生了什么」可被审计——这是发现基准质量问题(第 7.3 节)的唯一途径 |
后面的 MedHELM、AIR-Bench、HELM Capabilities、HELM Safety 都是这套框架在具体领域的实例化。核心信念只有一句:评测应该像做实验一样可复现、像做审计一样可追溯。
12. 评测究竟是为了回答什么问题
最后 Percy 把整讲收束到两个元问题上。
12.1 评测的目的是什么
不存在唯一正确的评测;一切取决于你想回答什么问题。他列了四种典型的提问者,它们对评测的要求几乎完全不同:
| # | 谁在问 | 想回答什么 | 因此需要什么样的评测 |
|---|---|---|---|
| 1 | 用户 / 公司 | 为我的用例(如客服机器人)该买模型 A 还是模型 B | 贴近自己场景的私有评测 + 成本维度;绝对分数无所谓,只要排序对 |
| 2 | 研究者 | 模型的原始能力(比如「智能」)到底到哪了 | 难、干净、抗污染、有人类基线的基准(GPQA、HLE、ARC-AGI) |
| 3 | 政策 / 商业分析者 | 这个模型带来的收益与危害分别是什么 | 覆盖广、多指标、透明可审计(HELM、AIR-Bench、GDPVal) |
| 4 | 模型开发者 | 怎么改进模型 | 信号密集、低方差、快的指标(困惑度、bits-per-byte、小规模自动评测) |
「困惑度根本不能反映能力」和「困惑度是最有用的指标」这两句话可以同时成立——前者站在第 2 类提问者的立场,后者站在第 4 类。同理,「Arena 榜单毫无意义」和「Arena 是最真实的信号」也可以同时成立。大多数关于评测的争吵,本质是双方在回答不同的问题而不自知。
12.2 我们到底在评什么:方法、模型,还是 Agent
这是本讲第二条 takeaway 的正题:必须明确游戏规则。
- 基础模型之前,我们评的是「方法」(methods)。ImageNet、SQuAD 有标准化的 train/test 划分,所有人在同一份训练数据上比算法。分数的差异只能来自方法本身。
- 今天,我们(大多)评的是「模型/系统」(models/systems)。怎么训、用什么数据、多少算力,全都随意(anything goes)。分数的差异可能来自算法,也可能来自你多花了十倍的钱、或者偷偷用了测试集。
也有例外。Percy 举了一个漂亮的反例:
| 规则 | 固定什么 | 比什么 | 鼓励什么 | 典型例子 |
|---|---|---|---|---|
| 评方法 | 数据、算力预算、目标指标 | 算法 | 研究者的算法创新 | nanoGPT speedrun、经典 ML 基准 |
| 评模型 | 只固定测试集 | 最终模型的能力 | 对下游用户有用的信息 | MMLU、GPQA、Arena |
| 评 Agent | 测试环境、时间/token 预算、允许尝试次数 | 模型 + 脚手架的组合 | 系统工程与产品化 | SWE-Bench、Terminal-Bench |
Percy 的判断是:评方法鼓励研究者做算法创新;评模型/系统对下游用户更有用。两者都需要,但绝不能混着来——把一个「随便你怎么训」的分数当成「这个算法更好」的证据,是当前论文里最常见的推理错误。
无论走哪条路,你都必须先把游戏规则定义清楚。
本讲小结
Percy 给的三条 takeaway,现在应该都能读懂了:
- 不存在唯一正确的评测——根据你想度量什么来选择评测。
- 清楚地陈述游戏规则——你在评方法、评模型,还是评 agent?
- 三个考量维度:难度(difficulty)、真实性(realism)、有效性(validity)。
一页速查表
| 问题 | 一句话答案 | 见 |
|---|---|---|
| 困惑度怎么算 | $\text{ppl}=\exp\!\big(-\frac{1}{|D|}\sum_i \log p(x_i\mid x_{<i})\big)$,即平均 NLL 取指数 | §3 |
| 为什么困惑度不能跨模型比 | 分母是 token 数,依赖 tokenizer;改用 $\text{BPB}=\frac{N_{\text{tok}}}{N_{\text{bytes}}}\log_2\text{ppl}$ | §3.5 |
| 为什么缩放定律都用困惑度 | 它平滑、连续、低方差;准确率是阶跃的,小模型上贴着随机基线 | §3.7 |
| 多选题为什么分数不可比 | 至少 4 种打分方式(原始 logprob / 长度归一 / PMI / 字母),加上 prompt 与 few-shot 敏感性 | §4.2 |
| 基准饱和了怎么办 | 加选项数、上 CoT、请专家原创题、用当前模型过滤(MMLU→MMLU-Pro→GPQA→HLE) | §4.3–4.5 |
| 怎么评开放式回答 | 两两比较 + 人类或 LLM 评委;用 checklist/rubric 提升可靠性 | §5 |
| LLM 评委有哪些偏差 | 长度偏置(回归去偏)、位置偏置(双向评测)、自我偏好 | §5.3–5.4 |
| Elo 是怎么来的 | Bradley–Terry:$\Pr(i\succ j)=\sigma(\beta_i-\beta_j)$;Elo 换底 10、尺度 400,$R\approx173.7\beta$ | §6.1 |
| Arena 的结构性问题 | 投票者自选样本;一个比特混淆风格与正确性;人无法判断正确性;奖励谄媚 | §6.4 |
| 怎么查数据污染 | n-gram 重叠 / canary / 成员推断(Min-K%)/ 可交换性置换检验(有严格 p 值) | §7.1 |
| 怎么防数据污染 | 报告规范、新鲜评测(LiveCodeBench)、私有评测(对困惑度最容易) | §7.2 |
| Agent 基准评的是什么 | 模型 + 脚手架 + 预算的联合结果,不是模型本身 | §8.5 |
| 推理模型时代怎么报分 | 必须给出「准确率 vs 每题算力/成本」的曲线,而不是单个数字 | §9.2 |
| 安全能不能标准化 | 不能全局标准化:强烈依赖语境,风险种类异质,且存在双重用途 | §10.3–10.4 |
| 真实性的代价 | 最真实的数据最不能公开;真实性与隐私天然对立 | §11.3 |
- 我想回答的是哪一类问题(采购 / 研究 / 政策 / 开发反馈)?
- 我固定了什么、放开了什么——规则写下来了吗?
- 这些题在互联网上吗?有没有做过污染检查?
- 打分方式是什么?换一种打分方式,排名会变吗?
- 我逐条看过模型的输出吗?错的那些,是模型错了还是标注错了?
- 报告里有置信区间吗?相邻名次在统计上可区分吗?
- 成本/算力/尝试次数报告了吗?
- 这个指标和我真正关心的构念之间,还剩多大的缝?
下一讲进入被这一讲推迟的主题:数据——去哪里搞数据、怎么清洗、怎么配比。有了本讲的评测框架,那些「加了这批数据模型变好了」的说法才有了可以被检验的含义。
延伸阅读
困惑度与经典语言建模
- Exploring the Limits of Language Modeling (2016) —— Transformer 之前 1BW 上的最高水位(51.3 → 30.0),理解「分布内评测」范式长什么样。
- LAMBADA (2016) —— 完形填空基准,刻意构造成必须读完整段才能填对,是「伪装成任务的困惑度」的典型。
- HellaSwag (2019) —— 对抗过滤(adversarial filtering)如何把一个简单任务变成难题,方法本身比数据集更值得学。
考试型基准
- MMLU (2021) —— 这一代基准的奠基者;读它的数据收集方式,你会立刻明白为什么污染问题无法回避。
- MMLU-Pro (2024) —— 「如何修复一个饱和的基准」的标准操作手册:删噪声题、扩选项、上 CoT。
- GPQA (2023) —— 「Google-Proof」的操作化定义,以及如何用对照组把难度变成可测量的量。
- Humanity's Last Exam (2025) —— 值得读的是它的激励机制与流水线设计(奖金 + 共同作者 + 模型过滤 + 多轮评审)。
开放生成与人类偏好
- Chatbot Arena (2024) —— 完整讲清楚 Bradley–Terry 拟合、采样策略与置信区间,是理解所有偏好榜单的必读。
- Length-Controlled AlpacaEval (2024) —— 用回归剔除混淆变量的范本,思路可以直接迁移到你自己的评测里。
- WildBench (2024) —— 真实对话采样 + checklist 评判;「评判也要 CoT」这个想法很实用。
Agent 与真实任务
- SWE-Bench (2023) —— 用单元测试做 oracle 的开创性设计,读它如何从 GitHub 自动挖掘任务。
- Terminal-Bench —— 「终端作为通用环境」这个选择大幅降低了造环境的成本,值得借鉴。
- Cybench (2024) —— 用「人类首次解出时间」标定难度,把能力分数翻译成可理解的人类参照。
- MLE-Bench (2024) —— 75 个 Kaggle 竞赛;也是理解「预算如何影响 agent 分数」的好材料。
- Deep Agents 综述 —— 显式规划、层级委派、持久记忆、上下文工程四件套。
有效性:污染与数据集质量
- Proving Test Set Contamination in Black Box Language Models (2023) —— 本讲最优雅的方法:用可交换性构造置换检验,黑盒地给出严格 p 值。
- 报告训练-测试重叠 (2024) —— 呼吁把重叠率变成和置信区间一样的标准报告项。
- Platinum Benchmarks (2025) —— 逐题人工核查后发现:前沿模型的剩余错误里有很大比例是基准标错了。
- Agent 基准的系统性缺陷 (2025) —— 测试覆盖不足、trivial agent 就能过关,读完你会对 agent 榜单更谨慎。
- SWE-Bench Verified / Docent —— 两种「给评测做质检」的实践路径。
安全
- HarmBench (2024) —— 从「有害行为」出发构建基准,并配套自动化红队评估。
- AIR-Bench (2024) —— 从监管框架与企业政策反推风险分类体系,解决「凭什么由你定义有害」的合法性问题。
- GCG: Universal and Transferable Adversarial Attacks (2023) —— 离散 token 上的梯度引导搜索,以及攻击从开源权重模型向闭源模型的迁移。
真实性
- GDPVal (2025) —— 用 GDP 结构决定任务采样权重,把评测和经济价值直接挂钩。
- MedHELM (2025) —— 从执照考试转向 121 个真实临床任务,是「领域评测该怎么做」的模板。
- Clio (2024) —— 用模型分析真实用户数据、只发布聚合模式,是隐私与真实性之间的可行折中。
- ARC Prize —— ARC-AGI 三代的设计文档与结果,理解「推理 vs 知识」这条线的最佳入口。