上一章《服务化与吞吐》保证了「快」,却回答不了「对不对」。 只有评测没有一把可信的尺子:分数≠能力。 这一章讲三件事:基准为什么骗你、分差里有多少噪声、幻觉到底是什么。
| 评测方式 | 怎么做 | 好处 | 问题 |
|---|---|---|---|
| 静态基准 MMLU / GSM8K / HumanEval |
固定一套题,跑分 | 可复现、便宜、能横向比 | 会被污染(训练集里见过题)、会饱和(分数到顶)、 会诱发 Goodhart 定律 |
| 人类偏好 Arena / Elo |
让真人盲测两个回答,投票 | 贴近真实感受;题目不固定所以难以针对性优化 | 贵、慢;标注者之间一致性低; 分数差异常常在噪声范围内 |
| 下游实测 你自己的任务 |
在你真实场景的数据上跑 | 唯一真正可信的 | 只对你自己的场景有效,没法和其他模型比 |
基准分数是"某个特定数据集上的某个特定指标",不是"这个模型有多强"。 不同论文的 MMLU 分数可能用了不同的 prompt 模板、不同的 few-shot 数量 (few-shot = 先给模型看几个示例再让它作答),答案提取规则也不一样—— 差 3 分完全可能是评测方法的差异。所以 MMLU 高了 5 分, 在你要做的那个任务上可能毫无差别。
互动 · 同一个模型,三把尺子量出三个分数
饱和是怎么回事:分数越高,区分度越低
互动 · 饱和之后,榜首其实是靠抽签定的
检测污染最常用的方法叫 n-gram 重叠检测:n 就是重叠的长度,
如果测试题里有一段连续 n 个 token 原封不动地出现在训练语料里,那这道题很可能被污染了。
行业里最常用的阈值是 13。
下面用的就是最长公共子串算法。为了看得清,这里每个汉字或字母都算一个 token。
互动 · 真实的 n-gram 污染检测
测试题(基准里的)
训练语料里被匹配到的那一段(高亮 = 与题目重合的字)
为什么阈值定在 13 个 token?因为短的重叠是正常的——常见短语、固定搭配、数学符号都会重复出现。
但连续 13 个以上的 token 完全一致,在自然语言里几乎不可能是巧合。
这个数字不是定理,是经验值,GPT-3 那篇论文用的就是这个阈值。
注意:检测到重叠 ≠ 一定污染。也可能是这道题的出处本身(比如一本教材)
被收录进了训练数据。但无论哪种情况,这道题的分数都已经不可信了。
互动 · 巧合最长能有多长(这决定了阈值为什么定 13)
Arena 类排行榜按 Elo 分数排名——Elo 原本是给棋手发明的评分, 只由胜负累积,不看回答内容。但Elo 分数是估计值,不是真值: 换一批对局重测,分数会变,所以它带着一个置信区间。 95% 置信区间的意思是:同样的实验重复很多次、每次算一个区间, 约 95% 的区间能盖住真值。而绝大多数榜单不显示这个区间。
互动 · Bradley-Terry 拟合(从胜负估分数)+ bootstrap 置信区间
互动 · bootstrap 的一次「重抽」:上面直方图的每一根柱子就是这么来的
两个模型在排行榜上差 20 分,可能完全在噪声范围内。
对局数只有几百场时,这根误差棒能长到 ±40 分——20 分的差距整个落在区间里,
根本读不出来。所以看到"A 比 B 高 15 分"时,正确的理解是:以现有数据,还分不出谁更好。
差距要大到 50 分才值得当真:50 分约对应 57% 胜率,不到这个数,排名常常会翻
(把「真实胜率」拖到约 57% 就能对上)。想稳稳分辨 20 分的差距,对局数要几千场:
拖到 3000 场,误差棒还有 ±12 分。
置信区间有解析公式,但它依赖"每场对局是独立的"这个假设——真实投票里 同一个问题会被很多人投、同一个用户会投很多场,独立性并不成立。 Bootstrap 的做法更粗暴:把已有的对局结果当成一个池子,有放回地随机重抽同样多的场次, 重新算一遍 Elo,重复几百次,看结果的分布。这样得到的区间不需要假设分布形状。
很多人把幻觉当成"模型还没训好"。这是个误解。 幻觉是语言模型训练目标的直接后果。
当模型不知道答案时,它面对一个选择:编一个听起来合理的,还是说"我不知道"。 在训练数据里,前者出现的频率高得多——所以从统计上看,编造是更优的策略。
像一个只学过"怎么把话说圆"、没学过任何事实的演讲者。
他被要求"接下来说一句最符合语境的话"。
当他知道事实时,他会说事实(因为事实在语料里最常出现)。
当他不知道时,他会说出最像事实的那句话——语法完美、语气笃定、格式规范,
但内容是空的。
他不是在骗你,他是在做他被训练要做的那件事。
这个类比管到"它为什么编"为止:真演讲者可能心里清楚自己在糊弄,模型没有"故意"这回事。
| 缓解手段 | 怎么起效 | 局限 |
|---|---|---|
| RAG 检索增强 | 把相关资料放进上下文,让模型"照着抄"而不是"凭记忆编" | 检索不到就还是会编;检索到的资料本身错的也会跟着错; 而且模型可能无视资料继续编 |
| 工具调用 | 让模型去算、去查,而不是自己回忆 | 只能解决"可计算、可查询"的那部分;决定调哪个工具本身还是靠模型判断 |
| 拒答训练 | 专门训练模型说"我不知道" | 会和"有用性"直接冲突——拒答太多用户会觉得模型没用。 而且模型不知道自己不知道什么,这个判断本身就不准 |
| 降低温度 | 减少随机性,让输出更集中 | 对幻觉基本无效——因为幻觉往往是模型"非常确定"的那个答案, 温度低反而让它更自信地重复错误 |
模型知道答案时,多次采样会给出同一个答案;不知道时,每次编的都不一样。 所以有个简单有效的检测信号叫自我一致性:同一个问题问 K 遍,看答案一致不一致。 一致率低 = 高风险幻觉。下面这个互动就是在算这个。
互动 · 真实的多次采样与一致率
互动 · 它知道 vs 它不知道:多次采样分别长什么样
| 基准 | 测什么 | 特点 / 现状 |
|---|---|---|
| MMLU | 57 个学科的多选题 | 最著名也最饱和。前沿模型已 88%+,区分度基本没了 |
| MMLU-Pro | MMLU 的加强版(10 选项、更难) | 为对抗饱和而设计,分数回落到 70% 区间,重新有了区分度 |
| GPQA | 研究生水平的科学问答 | 专门设计成"搜索引擎查不到",抗污染。博士专家也只有约 65% |
| GSM8K / MATH | 小学数学 / 竞赛数学 | 推理能力的经典指标。GSM8K 和 MATH 都已接近饱和 |
| HumanEval / MBPP | 写函数级代码 | 题目短、易污染、已饱和。"刷题"现象最严重的领域 |
| SWE-bench | 真实 GitHub issue 修复 | 目前最有说服力的代码基准——要在真实仓库里跑测试,很难作弊 |
| MT-Bench / Arena | 多轮对话质量 / 人类盲测 | MT-Bench 易被针对;Arena 难被针对但分差噪声大 |
| HELM | 多维度综合评测框架 | 不只看准确率,还看鲁棒性、公平性、效率。更全面但也更贵 |
| RULER / LongBench | 长上下文真实利用能力 | 揭穿了"支持 128K"的水分——很多模型宣称的支持长度, 实际有效利用远达不到 |
用大模型当裁判很流行(便宜、快),但它有已被反复验证的偏见:
① 长度偏好——更长的回答得分更高,哪怕内容更差。
② 自我偏好——模型倾向于给自己或同家族模型的输出打高分。
③ 位置偏好——在 A/B 对比里,排在前面或后面的那个会被系统性偏爱。
所以看到"用 GPT-4 当裁判"的评测结果时,至少要确认它有没有做位置交换、有没有控制长度。
互动 · LLM 当裁判:同一个回答,只换个位置,胜负就翻了
第 4 节说「排行榜差 20 分常常是噪声」。这不是感受,是算出来的,只有两步: ① 把胜率换算成分数,② 给这个分数配一根误差棒。 (§4 里那个 6.9 分是从「600 场观测到的胜率 51.0%」反推的点估计; 这里先把 52% 当成真值,看真值对应的真实分差 13.9。两者差的那 1 个百分点,本身就是抽样误差。)
核心大图 · 拖「对局数」:误差棒长到把 0 吞掉的那一刻,名次就没了
互动 · 每个符号管图上的哪一块
把「对局数」从 3000 拖回 50:ΔR 一点没变,变的只有那根误差棒。
再回第 4 节看那张 bootstrap 直方图——那是同一件事的另一种画法:
这边用公式直接算区间,那边用重抽样算区间,两个答案几乎一样。
它们都在说同一句话:能力没动,是尺子不够长。
| 根本困难 | 为什么绕不过去 | 什么时候真的会痛 → 换什么 |
|---|---|---|
| 没有一个"真值" | 图像分类有标签,翻译有参考译文,但"一个好的回答"没有唯一答案。 你连自己在测什么都说不清 | 要在几个模型间取舍时没有依据 → 换成你自己的场景数据 + 人工抽检 |
| 基准一旦公开就会被针对 | 这是结构性的:公开基准 → 有人刷 → 失去意义 → 建新基准 → 循环。 维持私有测试集能缓解,但又失去了可比性 | 榜上排第一、上线却不行 → 换成私有测试集 + 定期换新题 |
| 人类评测的主观性无法消除 | 标注者之间的一致性(Cohen's κ,扣掉"瞎蒙也能对上"之后的吻合度)落在 0.4~0.6, 按 Landis–Koch 的判读算"中等"(这是一个常用的判读尺:0.4~0.6 算"中等一致")——意味着相当一部分判断是分歧的 | 用众包投票定胜负时分歧大 → 固定题目 + 专家复核 + 交换位置 |
| 评测本身很贵 | 一次完整的人类盲测要募集大量投票人,成本很高。小团队根本做不起, 只能依赖别人的榜单——而那些榜单正好是最容易被针对的 | 小团队做不起盲测 → 先用公开榜单粗筛,再在小样本上自测 |
| 能力和"讨人喜欢"会混淆 | 人类偏好投票测的是"哪个回答更让人满意", 不是"哪个回答更正确"。一个会说漂亮话但内容错的回答,可能赢过正确答案。 | 选型选到"会说漂亮话"的 → 用客观可验证的任务(代码、数学)+ 失败模式抽检 |
互动 · 一次评测的账:钱花在生成上,不花在算力上
工业界怎么写 · 你的评测结果也要配一根误差棒
不要相信任何单一的公开分数。正确的流程是:
① 用公开基准做一个粗筛(去掉明显不行的)
② 然后一定在你自己的数据上测——哪怕只有 100 条,也比 MMLU 差 3 分有意义得多。
自己那 100 条上的分差也要配误差棒:100 条的 95% 区间大约有 ±10 个百分点
③ 关注失败模式而不是平均分:它在什么情况下会错?错得多离谱?
你想要的叫「能力」,你能拿到的叫「一个在你选的那道题上的分数」——这两样从来不是同一个。 中间隔的是一次有损压缩:把 N 个模型 × M 道题的答案表,逐行压成正确率,再压成名次。
互动 · 有损压缩:一张答案表压成一个分数,到底掉了什么
回到第 2 节那张「饱和是怎么回事」。把「这套题的天花板」滑块从 88% 往下拖到 50%—— 同样是能力从 60% 涨到 85%(非常大的一步),面板上的分差会从接近 2 个百分点 缩到 1 个百分点出头。
那个瞬间你看到的就是「分数不是能力」:能力一点没变,
只是把「什么算对」这条线挪了一下,区分度就消失了。
再回到第 4 节,把「对局数」滑块从 3000 拖回 50——
置信区间会宽到把两个模型吞进去。那一下你看到的是同一件事的另一半:
噪声也伪装成能力。如果你刚才没有想指着某个滑块说这句话,那这一节对你就是没用的——回去再拖一次。
七条线回答「深度学习为什么能行」,暗线回答「拆一个方法时该问哪几件事」——两套编号不是一回事。
| 暗线 | 这一章的回答 |
|---|---|
| C 参数账本 | 评测的账不在参数量,在 token 数和调用次数: · 跑一遍 1000 题的 MMLU ≈ 1000 次调用,每次连带题目与选项约 200 token 输入 → 20 万 token; 加上 LLM-as-judge 双评,直接翻倍。 · 这一章第 4 节那个 bootstrap:600 场 × 300 次重采样 = 18 万次重新拟合,只在本机循环。 模型本体是 8B~数百 B 参数,而一次评测花的是 API 钱和人类标注钱——两者不是同一种成本 |
| D 跑在什么上 | 带宽受限,不是算力受限。评测的重活是把答案一个一个生成出来, 而自回归生成逐 token 搬权重,最贵的动作是一次完整生成,不是一次矩阵乘。 人类盲测更极端:瓶颈在募集到多少投票人。完整的 Roofline 账见 《硬件与算力账本》。 |
| E 它假设了什么 | 四条,每一条都被现实打破过:① 这套题能代表能力;
② 题目没被模型见过(抗污染);③ 每场对局、每次投票相互独立;
④ 裁判中立。这四条就是这一章的 |
它接住上一章《服务化与吞吐》留下的「快不保证对」,把问题交给下一章《提示与上下文学习》。
分数不是能力:静态基准会被污染、会饱和、一旦成为目标就失效,Arena 类排行榜的 Elo 分差又常常整个落在误差棒里——差 20 分根本读不出来,幻觉也只是「预测下一个 token」这个训练目标的必然结果。
所以呢:不要相信任何单一公开分数,一定在你自己的数据上测,并且看失败模式而不只看平均分。
上面讲的都是「够用」的版本。想往下挖,这里有三个入口—— 它们不是必修内容,是给想再往前走一步的读者准备的。