想象一座「AI 高中」,每年都要举办一场全科大考。出卷人是一位神秘的老校长,他翻遍世界各地的历年真题,整理出 57 个学科的试卷——从美国历史到物理学,从经济学到计算机科学,全是四选一的单选题。老校长给考试起了个名字:MMLU(Massive Multitask Language Understanding,大规模多任务语言理解)。 这场考试有两种考法:一种叫「zero-shot(零样本)」,学生没有见过任何例题,拿到卷子就写;另一种叫「few-shot(少样本)」,考前发一本小册子,里面夹着几道「题目+答案」的示范,让学生先看懂答题格式再落笔。你作为 AI 高中的班主任,最关心的问题是:这两种考法到底差多少分?例题该发几道?成绩能不能反映学生真实水平? 这篇文章,就是带你以考生班主任的视角,把 MMLU 这套「AI 全科会考」的命题、答题、阅卷、刷分、看榜全流程拆解一遍。你会理解模型评测中最常见的 few-shot / zero-shot 机制,也知道如何用这套方法论去评价任何一个大语言模型。
MMLU 是业界衡量大模型综合能力的「金标准」之一。理解 few-shot / zero-shot 评测,等于拿到了一把看懂模型排行榜、读懂论文实验表格、设计自己评测方案的万能钥匙——这是每一位 LLM 工程师的基本功。
目录
可视化演示
展示LLM few-shot/zero-shot评测中提示构建过程、不同shot数量对准确率的影响与MMLU评测流程,交互调节shot数查看提示结构与效果变化。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Few-shot提示构建流程 Zero-shot: 直接提交问题,无示例 Few-shot: N个示例+目标题,模型学习格式 Prompt = [Q₁A₁] [Q₂A₂] ... [QₙAₙ] [Q_target] MMLU官方协议为5-shot,示例从dev集选取,覆盖STEM/人文/社科57个学科
基准库认知:认识老校长的 57 门试卷
老校长 M 是个执念很深的人。他坚信:真正聪明的学生不能只考一门课。于是他花了几年时间,从各类公开考试、网页教材、专业资料里搜罗题目,最终整理出一张 57 个学科的巨型试卷——这就是 MMLU。这份试卷覆盖人文(历史、法律、哲学)、社科(经济学、心理学)、理工(数学、物理、化学、计算机)以及专业知识(医学、法学),题目全部是四选一的单选形式。
MMLU 的题目规模约为 1.4 万道。为了控制知识的时效性,题目大多取材于更早年代的公开资料,使得这套试卷在发布时相对干净——模型在预训练阶段不容易「恰好背过」某道题。你可以把它想象成老校长从旧试卷库里翻出的陈年真题,绝不用刚考完的题来凑数。
在技术层面,MMLU 的设计理念是「多任务」。早期 NLP 评测往往只盯单一任务(比如问答或翻译),而 MMLU 用一张试卷同时测试 57 种能力,让「综合分」具有跨领域的代表性。对 AI 从业者而言,这是理解后续所有 LLM 榜单的基础:当你看到某个模型号称「MMLU 90 分」,实际上指的是它在 57 门学科上的平均正确率。
老校长的这套试卷之所以被业内奉为「金标准」,核心在于它足够难、足够广、足够干净。它给了我们一把尺子,去丈量一个大语言模型「到底懂多少」。
提示词设计:例题本怎么发,直接决定考分
确定了试卷,接下来是考试规则:要不要在开考前发例题本?zero-shot 的做法是,把题目直接甩给模型,不加任何示范。比如:
注意前面的学科前缀——这是 MMLU 评测的一个关键细节。每条题目都会附带一句「以下是关于某某学科的单选题」,相当于陈老师告诉学生「这道题属于历史卷」,帮模型快速切换到对应知识域。zero-shot 并不意味着「什么都不给」,而是「只给题目,不给答案示范」。
few-shot 则是在题目之前插入几个「例题+答案」的组合,像考前发的例题本。每个示例都是完整的问答对:先是 Question,接着列四个选项,最后给出 Answer。模型看到几个「别人怎么答」的例子后,会模仿同样的格式继续作答。评测中最常见的设置是 0-shot、1-shot、5-shot——也就是分别给 0、1、5 道例题。
从概率角度理解,few-shot 本质是让模型在「看到示范」的条件下去生成答案:
回到考场的比喻:例题本的价值不是「泄题」,而是「示范答题格式」。模型在预训练阶段见过无数问答数据,few-shot 只是帮它回忆「碰到 Question 应该怎么回应」。这就是为什么哪怕只给 1 道例题,效果也常常远好于 zero-shot——学生只要确认了题型,就能调动全部知识储备。
- 条件部分
examples(例题)+question(当前题目)共同构成模型的输入上下文,它们像考场上的「示范卷」,把模型的行为引导到格鲁克式的答题状态。 - 逐词生成答案由一个个 token 组成,模型每生成下一个 token 时,都会回看历史窗口中的所有内容。
- 联合概率最终答案的概率等于每个 token 条件概率的连乘——这一步在数学上等价于「这段答案出现在当前上下文之后有多自然」。
The following are multiple choice questions (with answers) about world history.Question: Who was the first president of the USA?A. Washington B. Lincoln C. Jefferson D. AdamsAnswer:
评测流程:阅卷时,只看四个选项谁的概率高
考完试怎么阅卷?你可能会想:让模型自己写出答案,然后看文字对不对。但 MMLU 的老校长很精明:他要求模型在四个选项中「表态」,然后用一种更数学的方式阅卷——计算模型认为每个选项是答案的概率大小。
具体做法是:把完整的 prompt(学科前缀 + 题目 + 四个选项)喂给模型,分别计算「如果在 A 后面接 Answer: A」这句话的对数概率,再算 B、C、D。谁的总分最高,谁就是模型的答案。用公式表示:
阅卷的最后一步是算平均分。对所有题目重复「算概率 → 选答案」的流程,然后统计正确率:
整个流程可以浓缩成一句话:逐题算概率、选最高、算平均。这也解释了为什么评测模型需要几小时甚至几天——上万道题 × 四个选项的概率计算,每一道都是一次完整的前向推理。如果你在实验中控制了 temperature=0,模型不会随机发挥,每次得分完全可复现。
1[条件] 是指示函数——条件成立时取 1,不成立时取 0。- 指示函数
1[...]像一个裁判的哨子,预测与标准答案一致就吹响(计 1),否则沉默(计 0)。 - 求和平均
1/N把总分缩放成 0 到 1 之间的比例,乘以 100% 就是常说的「MMLU 多少分」。
性能特性:为什么例题发到第 5 道就不再涨分
你批改完两个班的卷子,发现一个有趣现象:裸考班(zero-shot)和例题班(few-shot)的差距随学科而变。比如物理、数学这类逻辑推理密集的科目,例题班大幅领先,常常高出十几个百分点;而法律、历史等「记忆型」科目,两班几乎打平。这说明 few-shot 的核心价值是「格式引导」,而非「知识灌输」——理科题的答题格式更依赖推理步骤示范,文科题则重点在于「回忆知识本身」。
另一个重要规律是「示例饱和」:从 0 道例题增加到 1 道、5 道,分数明显上升;但继续增加到 10 道、20 道,收益微乎其微,甚至可能下降。原因很好理解:模型上下文长度有限,例题太多会挤占「思考空间」,同时过多的示例也会引入与当前题目无关的噪声。
MMLU few-shot 还有一个让人头疼的特性——「排列敏感」:同样 5 道例题,换一下先后顺序,得分可能波动 1-3 个百分点。这就像学生做题时,例题的顺序会影响他对答题格式的归纳。严谨的评测标准做法是固定示例顺序,或者在多次随机排列后取平均。
理解了这些性能特性,你再看到某模型「few-shot 比 zero-shot 高 8 分」的报道时,就不会觉得「8 分很多」——它高出的部分很大程度是「学会答题格式」带来的红利,而不是模型突然变聪明了。
优化策略:押题、对答案、刷题三条路
既然 few-shot 有这么多门道,能不能靠技巧把分数刷上去?答案是能,而且有三条常规路线。
路线一:少样本精选(Retrieval-based Prompting)。不再随机选例题,而是从题库中检索与当前题目最相似的几道题作为示例。这相当于考前押题——选最贴近考题的例题让模型模仿。数学上,这通常用向量检索(embedding 相似度)实现,评测中往往能带来 1-2 个点的提升。
路线二:多数投票(Self-Consistency)。同一道题让模型答 10 次(开启采样扰动),统计 10 次答案的众数。就像拿不准时找 10 个同学对答案,取出现频率最高的那个。这个技巧在推理类学科上特别有效,因为它抵消了单次采样的随机性。
路线三:指令微调(Instruction Tuning)。如果你想长期提升某个领域模型的 zero-shot 能力,最根本的做法是在训练阶段注入大量「指令-回答」数据,让模型天然适应「看到问题直接回答」的模式。这相当于平时多模拟考,考场裸考也不慌。
回到考场比喻:押题(检索)成本低见效快,对答案(投票)代价高但稳,而真正提升「内功」的还是平时训练(指令微调)。实际工程中,这三条路往往配合使用——先用检索挑例题,再投票取稳,最后用微调模型保下限。
工程实践:班主任的操作手册
读者走到这里,已经掌握了 MMLU 的理论,接下来是落地。业界复现 MMLU 的标准工具是开源评测框架 lm-evaluation-harness(简称 lm-eval),它内置了 MMLU 的全部 57 个学科。跑一次评测的基本流程是:加载模型 → 加载评测任务 → 指定 few-shot 数量 → 输出逐学科分数。
工程师在实际操作中要注意几条「考场纪律」:第一,temperature 必须设为 0,否则模型每次输出会随机波动,分数不可复现;第二,固定随机种子,保证示例采样顺序一致;第三,明确记录 prompt 模板——哪怕只改了一个标点,分数都可能变化。
参考基线也很重要。MMLU 发布时,GPT-3 的 few-shot 得分约为 43.9%(随机猜测是 25%);到了 GPT-4 时代,分数已超过 86%。Open LLM Leaderboard 等榜单持续滚动更新各类开源模型的 MMLU 分数。看榜时,请务必留意分数旁边标注的评测方式——同一模型 zero-shot 和 5-shot 的分数可能差出 5-10 分,不看清楚就会得出错误结论。
给班主任的建议:把 MMLU 当成「体检报告」,不要当成「期末排名」。用它定期观测模型能力变化,而不是用它一锤定音判断模型好坏。
局限认知:这套试卷也有“漏题”和“天花板”
老校长的试卷并非完美无缺。第一个问题叫「分数饱和」:当模型强到一定程度(比如超过 90 分),继续提升的难度指数级增加,分数的区分度急剧下降。就像学霸竞争到了 99 分和 98 分的差别,已经无法说明谁更优秀——此时 MMLU 已经「喂不饱」前沿模型了。
第二个问题是「数据泄露」:MMLU 的题目源自公开网页与考试资料,这些内容很可能已经进入模型的预训练语料。若模型在训练时「背过」某道题,评测分数就会虚高。学界已经观察到部分模型在 MMLU 上的表现与其在其他综合基准上不一致,原因之一就是训练数据与评测数据的重叠。
第三个问题是「提示脆弱性」:同一道题换一种问法,模型可能会给出不同的答案。比如给模型加上「让我们一步步思考」的指令,分数可能明显上升;而模板中语气词的改变也可能造成 1-2 个点的波动。这提醒我们:评测分数永远只是「特定 prompt 下」的分数,而不是模型的「真实智力」。
面对这些局限,成熟的工程师会组合多种评测手段:既看 MMLU,也看 MATH、GSM8K、BBH 等其他基准;既看 zero-shot,也看 few-shot;既看平均分,也看逐学科分解。老校长的试卷仍然有价值,但要配上放大镜和测谎仪一起使用。
AI 应用场景
场景一:基座模型选型
阶段:模型选型与采购评估
解决的问题:公司要选一个底座大模型做产品,传统方式是看官网宣传语和跑几个 demo,毫无量化依据。用 MMLU few-shot 分数做横向对比,就像家长拿各校会考平均分择校,能快速筛掉明显不合格的候选模型。
具体案例:某 AI 公司在选型时,对 5 个候选开源模型统一跑 lm-eval 的 MMLU 5-shot 评测(temperature=0、固定示例种子),得到 57 学科分数热力图。结果发现 A 模型平均分最高但理科薄弱,B 模型文科稍弱但各项均衡,最终结合业务场景选了 B。
场景二:领域模型验收
阶段:模型交付与验收
解决的问题:微调后的垂直领域模型(如法律咨询模型)到底变强了没有?只看业务 demo 难以量化。抽取 MMLU 中与领域相关的子集(如法学、经济学)作为验收考卷,对比微调前后的 few-shot 分数,客观评估专项能力提升。
具体案例:某法律科技团队微调出一个法律大模型,用 MMLU 中的 law 子集做 zero-shot 评测:基座模型得分 66%,微调后 74%;同时他们在真实法律问答集上做了人工评测,发现两者趋势一致,于是放心将模型送进产线。
Python 演示
"""模拟 MMLU few-shot / zero-shot 评测流程(玩具模型演示)"""import random class DummyLLM: """一个玩具模型:通过"关键词重合度"给选项打分。 真实评测中应替换为真实 LLM 的 logprob 输出。""" def __init__(self): self.tags = ["A", "B", "C", "D"] def logprob_of_option(self, question, option_text): overlap = len(set(question) & set(option_text)) return overlap * 0.5 + random.gauss(0, 0.2) def make_prompt(question, options, examples=None): lines = [] if examples: for ex_q, ex_opts, ex_ans in examples: lines.append("Question: " + ex_q) for tag, opt in zip("ABCD", ex_opts): lines.append(tag + ". " + opt) lines.append("Answer: " + ex_ans) lines.append("") lines.append("Question: " + question) for tag, opt in zip("ABCD", options): lines.append(tag + ". " + opt) lines.append("Answer:") return "\n".join(lines) def predict(model, prompt, options): scores = {} for tag, opt in zip("ABCD", options): scores[tag] = model.logprob_of_option(prompt, opt) return max(scores, key=scores.get) def evaluate(model, dataset, k_shot=0): correct = 0 for i, (q, opts, ans) in enumerate(dataset): examples = dataset[max(0, i - k_shot): i] prompt = make_prompt(q, opts, examples) if predict(model, prompt, opts) == ans: correct += 1 return correct / len(dataset) if __name__ == "__main__": random.seed(42) data = [ ("Which war ended in 1945?", ["WWI", "WWII", "Korean", "Vietnam"], "B"), ("What molecule carries genetic information?", ["ATP", "DNA", "RNA", "Protein"], "B"), ("What is the capital of France?", ["Rome", "Berlin", "Paris", "Madrid"], "C"), ] model = DummyLLM() print("zero-shot acc:", round(evaluate(model, data, 0), 3)) print("few-shot acc:", round(evaluate(model, data, 2), 3))
def logprob_of_option(...)模拟语言模型给某个选项打「对数概率分」,真实场景中这是模型前向传播的输出。examples = dataset[max(0, i - k_shot): i]取当前题前面的 k 道题作为「例题本」,这就是 few-shot 的示例拼接逻辑。make_prompt(q, opts, examples)把题目、选项、示例组装成标准问答 prompt,包含学科前缀相同的作用(引导答题格式)。max(scores, key=scores.get)遍历四个选项的分数,返回分数最高的选项标签,对应 MMLU 的 argmax 阅卷法。random.seed(42)固定随机种子,确保示例顺序和模型打分可复现,这是评测工程实践的关键纪律。
常见误区
误区我以为 zero-shot 评测就是直接把一句话丢给模型,不加任何格式和引导。结果同样的题目自己写的模板和官方模板跑出的分数差了很多,一度怀疑模型有问题。
正解zero-shot 指的是「不提供带答案的示例」,但 prompt 仍然包含学科前缀、题目、选项表、Answer: 引导符。这些结构信息会把模型引导到「回答选择题」的状态。模板模板,不是裸题;正确的做法是复刻官方 prompt,再谈零样本能力。
为何常见:「zero」这个词容易让人联想到「空白」,但它真正修饰的是「示例数量」,而非「上下文内容」。
误区我天真地认为,few-shot 就像给学生刷题,例题给得越多,模型学得越好。于是我把示例加到 20 道,训练上下文塞得满满当当,结果分数反而下降了。
正解MMLU 的 few-shot 得分通常在 5 道左右进入平台期,再多示例收益趋零甚至为负。原因有二:上下文长度有限,示例挤占「作答空间」;无关示例会引入噪声。示例的本质是「格式示范」,5 道足以让模型锁定答题模式,而非「知识复习」。
为何常见:人类学习中的「多刷题」直觉被迁移到了模型评测上,忽略了语言模型的上下文窗口和注意力稀释问题。
误区团队选型时只看 MMLU 分数,谁高就选谁,结果上线后模型在真实业务问答中表现平平,甚至闹出低级错误。
正解MMLU 只是 57 门学科的「开卷笔试」,它测的是知识广度与格式遵循能力,而非推理深度、安全性、指令遵从等维度。分数还受数据泄露和模板脆弱性的影响。更合理的做法是组合多基准:MMLU + MATH + GSM8K + 业务自建集,综合判断。
为何常见:榜单把复杂能力压缩成一个数字,大脑天然偏爱「一个分数定优劣」的简单决策。
误区我跑评测时图省事,直接从题库开头截取 5 道题当示例,结果某次改版后发现分数波动很大,浪费了整整一周的排查时间。
正解few-shot 的示例选择与排列都会显著影响结果——相关示例可以提高 1-2 个点,随机排列可能波动 1-3 个点。规范做法是固定示例生成逻辑(固定种子),或使用检索式选例。评测复现的第一要义:对同一模型,完全相同的输入,必然得到完全相同的输出。
为何常见:人们默认模型对「示例顺序」不敏感,忽略了注意力机制对位置的敏感性。
面试题
Q1. MMLU 的全称是什么?
- A.Massive Multitask Language Understanding← 正确答案
- B.Multi-Modal Language Understanding
- C.Masked Language Universal Benchmark
- D.Massive Machine Learning Utility
答案:A。MMLU 全称是 Massive Multitask Language Understanding(大规模多任务语言理解),它强调「多任务」「语言理解」双重含义。B 错在 Multi-Modal 是多模态,C 错在 Masked 是掩码,D 错在 Utility 是工具,均与基准测试的本意不符。
Q2. MMLU 基准一共包含多少个学科?
- A.32
- B.47
- C.57← 正确答案
- D.72
答案:C。MMLU 覆盖 57 门学科,涵盖人文、社科、理工、专业领域,这是它的标志性特征。如果记成 32、47 或 72,多半是与其他基准(如 32 个任务的 SuperGLUE)弄混了。
Q3. MMLU 的题目类型是什么?
- A.判断题
- B.四选一单选题← 正确答案
- C.填空题
- D.多选不定项
答案:B。MMLU 全部为四选一单选择题,候选答案固定为 A/B/C/D 四个选项。这个设计使阅卷可以使用「计算每个选项的对数概率,取最高分」的自动化流程。
Q4. 「zero-shot 评测」的正确理解是什么?
- A.完全不提供任何文本给模型
- B.提示词中不附带带答案的示例← 正确答案
- C.模型未经任何预训练
- D.只提供学科名称不提供题目
答案:B。zero-shot 指「示例数量为零」,即 prompt 中不含「题目+答案」示范,但学科前缀、选项表、Answer 引导符仍然存在,题目也完整给出。A 是空上下文,C 是随机初始化,D 说反了——只给学科名不给题无法评测。
Q5. MMLU 阅卷时,模型对选项的「得分」是如何计算的?
- A.直接输出选项字母的出现频率
- B.选项字符串各 token 对数概率之和← 正确答案
- C.选项字符串的平均词向量距离
- D.生成完整答案后与标准答案求 BLEU
答案:B。MMLU 将每个选项视为一串待生成的 token,累加每个 token 的条件对数概率,取总和最大的选项为答案。A 是统计无关项的频率,C 是语义相似度不是评定对错的依据,D 用文本生成再匹配的方式既慢又不稳定。
Q6. 为什么 MMLU 的 few-shot 分数通常在 5 道示例后趋于饱和?
- A.因为题目总共只有 5 道
- B.因为上下文变长后噪声增多← 正确答案
- C.因为模型只能记 5 个示例
- D.因为评分公式对 5 道以上截断
答案:B。示例的核心作用是「格式示范」,5 道足以让模型锁定答题模式;继续增加示例会挤占上下文空间并引入无关噪声,收益趋零甚至下降。A 说题目只有 5 道与 1.4 万道不符,C 是拟人化错误,D 的截断说法无任何依据。
Q7. 以下哪些因素会影响 MMLU few-shot 的评测分数?
- A.示例的排列顺序← 正确答案
- B.示例与当前题目的相似度← 正确答案
- C.prompt 中的标点符号← 正确答案
- D.服务器的 GPU 型号
答案:ABC。示例顺序(排列敏感)、示例相似度(检索式选例有效)、prompt 细节(标点、语气词)都会造成分数波动。GPU 型号只影响推理速度,不影响模型输出的 logprob 数值,因此不改变分数。
Q8. MMLU 作为评测基准有哪些已知局限性?
- A.分数存在饱和效应← 正确答案
- B.训练数据存在泄露风险← 正确答案
- C.结果对 prompt 模板脆弱← 正确答案
- D.题目数量太少无法区分模型
答案:ABC。MMLU 的三个主要局限是:高分饱和(90 分以上区分度下降)、数据泄露(公开题目可能进入预训练语料)、提示脆弱性(模板微调导致分数波动)。题目约 1.4 万道,数量充足,D 说法与事实相反。
Q9. 下列哪种做法最有助于提升 MMLU few-shot 评测中的鲁棒性?
- A.随机打乱示例并取多次平均← 正确答案
- B.固定使用同一道示例题
- C.删除学科前缀
- D.把 temperature 调高到 1
答案:A。示例顺序会导致分数波动,随机打乱多次评测取平均,可以抵消排列敏感造成的偏差,得到更稳健的估计。B 固定同一道示例会引入系统偏差;C 删除学科前缀反而降低引导效果;D 温度调高引入随机性,正是评测要避免的。
Q10. 关于 MMLU 的选项长度与 logprob 评分的关系,下列说法正确的是?
- A.长选项包含更多 token,概率连乘后数值更小← 正确答案
- B.直接累加 logprob 不归一化可能偏向短选项← 正确答案
- C.归一化后所有选项基准一致,比较更公平← 正确答案
- D.选项长度对评分完全没有影响
答案:ABC。每个 token 的概率小于 1,连乘会让长选项的联合概率更小;累加 logprob 同样会惩罚长选项。因此 MMLU 评测实践中通常对选项得分做长度归一化,让长短选项在同一基准上比较。D 说「完全没有影响」显然错误。