想象你走进一场“全能知识竞赛”:监考老师发下一本横跨 57 个学科的厚卷子,从历史、法律、医学,到物理、化学、计算机,每一道都是四选一的选择题。就在卷首,组委会贴心附上了五道“样例题”——题目、选项、标准答案一应俱全,但不计入总分。你扫了两眼,立刻明白了答题卡的涂法:哦,原来是要圈一个 A/B/C/D 啊。至于后面那几百道真题目能做对多少,就得看你脑子里平时积累了多少货了。 这正是 MMLU(Massive Multitask Language Understanding,大规模多任务语言理解)基准的玩法:它不给大模型任何“复习范围”,只丢几个带答案的样例演示作答格式,然后把 57 个学科的真题目摆在模型面前,看它凭自己的知识储备能答对多少。这种“给几个例子就上考场”的评测方式,就叫 few-shot 评测。样例题到底教会了模型什么?它又真正测出了模型什么?本文用这场竞赛当线索,把 MMLU 的 few-shot 机制从头拆到尾。
理解 MMLU 的 few-shot 评测机制,是读懂大模型能力报告、亲手设计模型对比实验的第一步,也是评测工程师与算法工程师日常对话的共同语言。
可视化演示
展示示例逐条注入提示构造提示的过程、0/1/5/k-shot准确率随示例数量提升的对比、以及温度缩放校准预测概率的可靠性曲线。
本节配有交互动效(进入视口后自动加载,约 3KB)。
示例注入提示构造 从开发集选取标注示例 示例按模板与测试问题组合 57科/14k题 MMLU采用5-shot标准设置
MMLU基准概述
组委会把 57 个学科的题目汇编成一本厚重的大考卷,这就是 MMLU 本身。2021 年,加州大学伯克利分校等机构的研究者发布了这份“全科竞赛试卷”:从幼儿园数学到专业法学,从天文地理到生化环材,共覆盖 57 个学科、约 1.4 万道四选一题目。小明推开考场大门的那一刻,这场考察“全科知识面”的比赛就正式开始了。
这份试卷最精妙的设计在于“封闭式”:每道题只有一个题干加四个选项,模型不用写小作文,只要给出一个字母。把开放式的文本生成变成可自动判卷的选择题,分数自然稳定、可复现——这也是 MMLU 能成为各大模型发布会“成绩单”的原因。想要量化一张卷子的作答水平,最直观的指标就是准确率:答对的题数占总题数的比例。
竞赛最终以“答对比例”发榜,MMLU 也以 Acc 一锤定音——57 门课一张卷,分数说话。理解了这个分母 N 和分子“答对数”,后面所有 few-shot 技巧都只是在想办法提高这个分子。
- 指示函数$\mathbb{1}(\hat{y}_i = y_i)$ 像一个盖章员——模型答案与标准答案一致就盖“对”,不一致就盖“错”。
- 逐题累加把每道题盖到的“对”加总,得到整个卷子的答对题数。
- 取平均除以题目总数 N,把整数换成 0 到 1 之间的比例,方便不同模型、不同学科横向比较。
few-shot设定基础
组委会在卷首附了五道带答案的样例题,这就是 few-shot 里的“shots“——示例的个数。小明翻开卷子,看到的不是复习提纲,而是几道”题目 + 选项 + 标准答案“的示范:哦,原来不用写过程,圈个字母就行。”5-shot”就意味着给他 5 条这样的示范;一条不给、直接做题,则叫 0-shot。
在技术层面,“k-shot“指的是在提示(prompt)里塞进 k 个由”题干、选项、正确答案“组成的三元组示例。MMLU 报告成绩时最常用的是 5-shot:5 条样例足以让模型看清答题协议,又不至于撑爆上下文窗口。0-shot 则作为对照基线,用来考察模型在没有任何格式提示时能不能自己”领会题意”。一条典型的 few-shot 提示长这样:
注意最后的“答案:”后面空着——这就是留给模型填空的“答题卡横线”。整段提示被喂进模型后,它在概率空间里慢慢“看出”规律:前面都是“题目→选项→答案”,所以接下来该输出一个字母。这个过程的数学本质,是求条件概率:
对小明来说,样例题不是“冲刺班资料”,而是“答题卡使用说明”。5-shot 评测的关键就在于:说明看得懂、格式能照抄,至于答案对不对,那是接下来要考察的知识储备问题。
- 目标题条件y 是待填的答案,x 是目标题的题干与选项,概率从 x 开始推算。
- 示例注入在竖线右侧追加 $e_1, e_2, \ldots, e_k$,表示模型作答时“眼前摆着 k 条样例题”。
- 分号的含义分号强调这些示例只是提示上下文,不是需要学习的统计权重——它们不在参数更新范围内。
题目:牛顿第一定律又被称为?选项:A.惯性定律 B.动量守恒 C.能量守恒 D.万有引力答案:A 题目:光在真空中的速度约为每秒多少公里?选项:A.30 B.30万 C.3万 D.300万答案:B 题目:DNA 的主要功能是?选项:A.储存遗传信息 B.运输氧气 C.催化反应 D.传递神经信号答案:
示例引导机制
小明看完样例题后的第一反应不是“哇我又学到了新知识”,而是“原来要圈字母”。示例引导机制的核心,就是让模型从样例中识别任务格式,并学会“把答案映射成 A/B/C/D 中的一个”。没有这些样例,模型可能洋洋洒洒写一段话,或者把四个选项原文照抄,判卷程序根本没法给分。
具体怎么从四个选项中挑一个?模型把 A、B、C、D 四个候选字母分别接到提示末尾的“答案:”后面,计算“接下来生成这个字母”的概率,谁的概率大就选谁。也就是对每个候选做一次打分,而不是让模型自由生成文本再去解析。这一步只需一次前向传播,没有任何训练过程——这正是“上下文学习”(In-Context Learning)的雏形。
就像小明不会因为看了答题说明就多掌握一条物理定律,示例引导也“只教格式、不教知识”。它保证模型答得“像模像样”,但答得对不对,拼的是下面要说的真本事。
- 候选集合$c \in \{A,B,C,D\}$ 限定比较范围——只有四个字母参赛,杜绝“自由发挥”。
- 条件概率打分在提示与 k 条示例条件下,计算模型生成“答案:c”的概率,取对数方便比较。
- 求最大值$\arg\max$ 表示“找出让这个值最大的那个 c”,即所有候选中 log 概率最高的字母。
- 与标准答案比对得到的 $\hat{y}$ 与人工标注的 $y_i$ 比对,一致则 $\mathbb{1}(·)=1$,计入准确率分子。
知识储备评估
格式看懂了,接下来拼“存量”。小明这十几年的百科积累,此刻全部派上用场:历史题想起朝代更迭,化学题记起元素性质,医学题回忆起人体结构。MMLU 的题目大多正是这类事实性知识——某定律的内容、某元素的性质、某个国家的首都,靠的是“有没有背过”,而不是现场推理。
模型也一样。它在预训练阶段从海量语料里“记”下了无数事实,评测时凭记忆作答:不开卷、不查资料、不联网。因此 MMLU 的 few-shot 成绩,本质上是模型知识储备的一次抽样体检。为了让“体检报告”有参照物,研究者引入了人类专家基线:让各领域的专家做对应学科的题目,平均正确率约 89.8%。把模型成绩与专家成绩摆在一起,差距一目了然。
竞赛发榜时,主办方总爱把冠军成绩与历史纪录对比——MMLU 报告把模型分数和人类专家分数并排印在表格里,也是在回答同一个问题:这台机器,知识量到底相当于一个普通人,还是半个专家?
- 专家基线$\text{Acc}_{\text{expert}}$ 是领域专家作答同类题目的正确率,数值约 0.898,是“满分参照系”。
- 模型成绩$\text{Acc}_{\text{model}}$ 是模型在同样题集、同样 5-shot 提示下的正确率,来自前面的 Acc 公式。
- 取差值相减得到“知识鸿沟”;差值越小,模型越接近专家水平。
上下文学习与泛化
few-shot 最迷人的地方,是“临时抱佛脚居然有效”。小明从没为这场竞赛做过专项复习,但五道样例题像开关一样激活了他已有的解题套路:原来要选字母,原来每个领域都是这么考。模型也展现出类似能力——仅凭提示中的几条示例,不更新任何参数,就能切换到“选择题答题模式”,这就是上下文学习(In-Context Learning)。
更妙的是,这套从样例中学到的答题协议可以跨学科迁移:物理学科的样例题,完全不影响模型去答历史题。五条样例“教”的是一种通用格式,而不是某道题的答案本身。因此,5-shot 相对 0-shot 的提升幅度,成了衡量模型“临场适应力”的重要指标:提升越大,说明模型越擅长从上下文中捕捉任务规律。
小明走出考场时可能会感慨:那五道样例题本身没让我多会一道题,却让我把会的全写在了答题卡的正确位置。MMLU 的 few-shot 评测,测的正是这种“会”与“写得对”之间的转化能力。
- 基线水平$\text{Acc}_{0\text{-shot}}$ 表示不给任何样例、直接作答的准确率,反映模型“裸考”水平。
- 引导水平$\text{Acc}_{5\text{-shot}}$ 表示给 5 条样例后再作答的准确率,反映“看过答题说明”后的水平。
- 差值含义$\Delta_{\text{shot}}$ 越大,说明模型越善于利用上下文示例,把“看懂格式”转化为“答对题目”。
评测局限与解读
再严谨的竞赛也有软肋:泄题、押题、运气成分。MMLU 的 few-shot 评测同样有三大隐患。第一,样例敏感:换掉五条样例题中的一两条,或调整它们的顺序,分数可能波动好几个点;第二,数据污染:如果预训练语料里混入了测试集原题,等于提前把卷子答案泄露给模型;第三,随机猜测下限:四选一的选择题,闭着眼睛蒙也有 25% 的正确率保底。
因此,解读分数时必须守几条规矩。横向对比要“同模板、同样例数、同评分脚本”,把提示模板和评测代码一起固定并公开;纵向追踪版本要控制变量,任何提示改动都会污染对比结果;看绝对数值要心怀敬畏——从 24.9% 涨到 26%,可能还不及随机误差;只有跨越数个百分点的差异,才值得写进发布会的 PPT。
竞赛组委会当然希望考试公平公正,但测评人必须时刻记得:任何分数都是“特定条件下”的分数。读懂 MMLU 的 few-shot 报告,既要看数字,更要看数字背后的条件与陷阱。
- 候选集合大小$|\mathcal{C}|$ 表示候选答案个数,四选一所以为 4。
- 均匀随机随机猜测时每个答案等概率被选中,正确率即 1 除以候选数。
- 数值结果0.25 就是评测的“地板值”——模型必须显著高于它,才谈得上“学会了作答”。
AI 应用场景
大模型版本的回归体检
阶段:模型评估与发布
解决的问题:新版本发布前,靠人工抽查案例既慢又不全面,还可能漏掉某个学科的能力回退。用固定 5-shot 模板在 MMLU 上跑分,一次覆盖 57 个学科,把准确率变化变成可追踪的数字。
具体案例:某大模型团队的评测工程师维护一个“提示模板仓库”,每次发版用同一套 5-shot 提示跑 MMLU;若总分较上一版下降超过 2 个百分点,触发回滚评审,并对照学科细项定位是数学能力衰退还是知识库更新引入的偏移。
提示词工程中的样例调试
阶段:推理与提示优化
解决的问题:业务应用中模型“答非所问”“格式混乱”是高频痛点。借鉴 MMLU few-shot 的思路,在业务提示里放入几条高质量问答样例,引导模型稳定输出指定格式,省去反复调参。
具体案例:开发智能客服时,工程师在系统提示中加入 5 条“标准问答样例”,模型按样例格式返回 JSON 结构化结果,解析成功率从 62% 提升到 91%;这与 MMLU 用 5 条选择题样例矫正答题格式,是同一个套路。
开源模型选型对比
阶段:模型选型与基准测试
解决的问题:团队选底座模型时,厂商宣传的数据口径不一、提示模板各异,难以直接比较。用统一的 MMLU 5-shot 标准流程给候选模型跑分,结合随机基线 25% 与专家基线 89.8% 判断真实水位。
具体案例:算法负责人在选型评审中,用同一套 5-shot 模板评测 Llama、Qwen、Mistral 三个候选,并额外查看金融、法律等学科的分项成绩,最终选定在业务相关学科上表现最稳的模型作为底座。
Python 演示
"""MMLU 5-shot 评测最小示例:构造带样例的提示并统计准确率。"""import random EXAMPLE_TEMPLATE = "题目:{question}\n选项:{options}\n答案:{answer}"TARGET_TEMPLATE = "题目:{question}\n选项:{options}\n答案:" def build_prompt(target, examples): """把 k 条样例题与目标题拼成模型输入,模拟 MMLU 的 few-shot 提示。""" parts = ["请按样例格式作答,从 A/B/C/D 中选一个字母。"] for ex in examples: parts.append(EXAMPLE_TEMPLATE.format(**ex)) parts.append(TARGET_TEMPLATE.format(**target)) return "\n\n".join(parts) class DummyModel: """离线伪模型:只会用题干关键词猜答案,用于验证评测流程而非模型质量。""" def __init__(self): self.gc_count = 0 # 生成调用次数 def complete(self, prompt): self.gc_count += 1 rules = [("牛顿", "A"), ("光速", "B"), ("细胞", "C"), ("欧姆", "D")] for keyword, letter in rules: if keyword in prompt: return letter return random.choice("ABCD") def top1_match(pred, answer): """判定模型预测是否正确:要求输出以标准答案字母开头。""" return pred.strip().upper().startswith(answer) def evaluate(test_set, examples, model): """跑完整个测试集,返回 0 到 1 的准确率。""" total = len(test_set) hits = 0 for q in test_set: prompt = build_prompt(q, examples) pred = model.complete(prompt) hits += int(top1_match(pred, q["answer"])) return hits / total if __name__ == "__main__": questions = [ {"question": "牛顿第一定律又被称为?", "options": "A.惯性定律 B.动量守恒 C.能量守恒 D.作用反作用", "answer": "A"}, {"question": "光在真空中的速度约为每秒?", "options": "A.30公里 B.30万公里 C.300万公里 D.3万公里", "answer": "B"}, {"question": "细胞的能量工厂主要是什么?", "options": "A.细胞核 B.线粒体 C.核糖体 D.高尔基体", "answer": "B"}, {"question": "欧姆定律中电压的符号是?", "options": "A.I B.P C.U D.R", "answer": "C"}, {"question": "牛顿第二定律的表达式是?", "options": "A.F=ma B.E=mc2 C.V=IR D.P=UI", "answer": "A"}, {"question": "牛顿第三定律也被称为?", "options": "A.作用力与反作用力 B.动量守恒 C.角动量守恒 D.能量守恒", "answer": "A"}, {"question": "细胞膜的主要成分是?", "options": "A.纤维素 B.脂质 C.无机盐 D.淀粉", "answer": "B"}, {"question": "欧姆定律电压符号是?", "options": "A.I B.P C.U D.R", "answer": "C"}, {"question": "光速约为每秒多少万公里?", "options": "A.3 B.30 C.300 D.3000", "answer": "B"}, {"question": "质数中唯一的偶数是?", "options": "A.0 B.2 C.4 D.6", "answer": "B"}, ] # 5-shot:前 5 题当作带答案的样例,后 5 题当作正式考题 examples = questions[:5] test_set = questions[5:] model = DummyModel() acc = evaluate(test_set, examples, model) print(f"MMLU 5-shot 模拟准确率: {acc * 100:.1f}%") print(f"模型被调用次数: {model.gc_count}")
parts.append(EXAMPLE_TEMPLATE.format(**ex))把每条样例按“题目/选项/答案”固定模板格式化后追加进提示。parts.append(TARGET_TEMPLATE.format(**target))目标题以“答案:”结尾,把填空位置留给模型补全。self.gc_count += 1记录模型调用次数,真实场景中用于核算 API 成本。rules = [("牛顿", "A"), ("光速", "B"), ...]模拟模型从预训练中“背”下的零散知识,对应正文的“知识储备”。if keyword in prompt: return letter伪模型根据题干关键词猜答案;真实模型则是计算四个候选字母的条件概率。return pred.strip().upper().startswith(answer)判定模型输出以标准答案字母开头即算对,对应正文的“答案匹配”。hits += int(top1_match(pred, q["answer"]))把答对题数累加进分子,最后除以总题数得到 Acc。
常见误区
误区“5-shot 评测不就是给模型 5 个训练样本,让它先学一下再考试吗?那和微调有什么区别?”
正解完全不是一回事。few-shot 的样例只出现在提示文本里,模型参数一步也不更新,一次前向传播直接出答案。它更像是考前看“答题卡使用说明”,而微调是上“冲刺班”——前者不改变大脑,后者改变大脑本身。判断标准很简单:数一下有没有梯度更新,没有就是 few-shot。
为何常见:机器学习里“训练”一词太深入人心,人们容易把“多给上下文”误当成“更新权重”。
误区“既然 5-shot 比 0-shot 好,那把 50 条样例全塞进提示里,分数岂不是要起飞?”
正解不一定。模型有上下文窗口上限,示例太多会挤占推理空间;低质量或与目标题无关的样例还会引入噪声,个别任务甚至出现“越给越差”的倒挂现象。业界经验是 5 条左右通常性价比最高,要系统找最优 k,应做 k = 0、1、5、10 的消融实验。
为何常见:直觉上“材料越多越好”,忽略了注意力机制会被稀释、上下文长度存在硬边界。
误区“我们模型 MMLU 生物考了 90%,说明它已经是生物学大师了,可以放心让它写医学报告。”
正解要清醒。选择题格式决定它测的是“识别正确选项”而非“主动推理生成”;四选一有 25% 的保底运气分;若数据被污染,更是提前泄题。高分只能说明模型在“知识识别”层面表现好。判断是否真正掌握,还要追问学科分布是否均衡、同题改写后的分数是否稳定。
为何常见:分数是唯一显眼的数字,人天然倾向把“成绩好”等同于“能力强”。
误区“大家论文里都写 5-shot,MMLU 分数直接横向对比肯定没问题。”
正解提示模板、样例选择、答案判定规则都会悄悄影响分数。有的模型会输出一段解释而不是字母,直接被评分脚本判错;有的模型对特定样例顺序特别敏感。规范的对比应当固定提示模板、固定评分脚本、固定解码参数,并开源评测代码,分数才有可比性。
为何常见:人们默认“5-shot“是唯一变量,忽略了提示工程中大量隐性差异——就像说”都考同一张卷子”,却没发现监考老师偷偷给了不同人不同的答卷说明。
面试题
Q1. MMLU 全称对应的评测范围是?
- A.大规模多任务语言理解← 正确答案
- B.大规模参数语言生成
- C.多模态图像文本检索
- D.分布式深度学习框架
答案:A。MMLU 是 Massive Multitask Language Understanding 的缩写,即“大规模多任务语言理解”,对应 57 学科综合评测。B 是生成模型的方向,C 是多模态检索,D 是训练框架,都与 MMLU 的“多任务理解”含义不符。
Q2. MMLU 共覆盖多少门学科?
- A.7 门
- B.17 门
- C.57 门← 正确答案
- D.570 门
答案:C。MMLU 覆盖 57 个学科,从人文社科到理工医学,题目量约 1.4 万道。7、17、570 都属于干扰项,记住“57 门全能竞赛”这个画面即可。
Q3. 5-shot 评测中的"5"指什么?
- A.提供 5 条带答案示例← 正确答案
- B.模型有 5 亿参数
- C.训练 5 轮迭代
- D.测试 5 次取平均
答案:A。shot 指提示中带答案的示例条数,5-shot 就是给模型 5 条“题目+选项+答案”样例。参数规模、训练轮数、测试次数都与 shot 无关,不要把"5"想成别的数字游戏。
Q4. few-shot 评测中模型参数如何变化?
- A.参数完全不更新← 正确答案
- B.只微调最后一层
- C.全量参数微调
- D.用梯度下降更新
答案:A。few-shot 是纯推理过程,样例只进入提示上下文,模型权重零更新。它像“看答题卡说明”而不是“上冲刺班”;微调(B/C/D)才涉及梯度更新。这也是 few-shot 与 fine-tuning 的本质分界。
Q5. 四选一选择题随机猜测的准确率基线是多少?
- A.10%
- B.25%← 正确答案
- C.50%
- D.75%
答案:B。四个候选答案等概率被选中,随机猜测正确率为 1/4 = 25%。这是 MMLU 评测的“地板”,任何低于 25% 的分数都说明模型连格式都没学会;解读高分时也要记得扣除这层保底运气分。
Q6. 示例引导对模型最主要的作用是?
- A.教会答题输出格式← 正确答案
- B.注入全新学科知识
- C.压缩模型参数量
- D.加快预训练收敛速度
答案:A。样例的核心作用是让模型识别“题目→选项→答案字母”的格式,并学会输出规范。它不会凭空注入知识(B),与参数压缩(C)、预训练收敛(D)更无关系——知识来自预训练储备,格式来自上下文引导。
Q7. 解读 MMLU 分数时最应警惕的问题是?
- A.测试集数据污染← 正确答案
- B.训练卡 GPU 不足
- C.提示长度太短
- D.开源协议争议
答案:A。数据污染意味着预训练语料里混入了测试集原题,等于提前泄题,分数虚高。GPU 不足、提示长短、开源协议属于工程或合规问题,不直接影响评测分数的可靠性——污染才是威胁评测公信力的头号风险。
Q8. 一条规范的 few-shot 提示中需要包含哪些内容?
- A.题干与四个选项← 正确答案
- B.正确答案字母← 正确答案
- C.示例的三元组← 正确答案
- D.模型超参数
答案:ABC。few-shot 提示由若干条“题干 + 选项 + 正确答案字母”的样例三元组加上目标题组成,模型据此学习格式。模型超参数(学习率等)属于训练配置,与推理时的提示内容无关,不应出现在提示里。
Q9. 相比 0-shot,5-shot 可能带来哪些改善?
- A.输出格式更稳定← 正确答案
- B.更遵循答题规范← 正确答案
- C.知识量必然增加
- D.无需理解题干
答案:AB。样例让模型看清答题协议,输出格式更稳、更遵守“只给字母”的规范。但知识量来自预训练储备,样例不新增知识(C 错);模型仍然需要理解题干才能答对(D 错),格式引导替代不了理解。
Q10. 用 MMLU few-shot 横向对比两个模型时,应保持哪些条件一致?
- A.提示模板与样例← 正确答案
- B.解码采样参数← 正确答案
- C.允许自由文本作答
- D.评分判定脚本← 正确答案
答案:ABD。公平对比要固定提示模板、样例选择、解码参数(温度等)和评分脚本,否则分数差异可能来自评测流程而非模型能力。允许自由文本作答(C)会引入解析不确定性,恰恰是应该统一规避的做法。