通用知识评测
通用知识评测检验模型在跨领域事实、常识与语言理解任务上的表现。它覆盖历史、地理、法律、文学、自然科学常识等多个领域的记忆与理解,是衡量模型基础能力最常用的入口之一。
这一方向以 MMLU(Measuring Massive Multitask Language Understanding)为代表:它把 57 个学科的选择题汇总成一个大而全的知识面测试,覆盖人文、社科、STEM 等,用来回答「模型知道多少」的问题。与之互补的是常识推理类基准,例如考察小学科学常识的 ARC、考察句子完形常识的 HellaSwag 与开放知识问答的 TriviaQA。它们共同的挑战是:题目与答案极易在互联网上流传并被训练数据覆盖,因此「知识量」与「记忆量」在这里难以直接区分。
快速开始¶
固定题集版本、提示模板、采样参数和评分脚本,报告样本数与置信区间。
先选定一个封闭的公开题集,并锁定其版本与切分方式,避免不同时期下载的题集内容不一致。随后固定提示模板,包括是否使用少样本示例 (few-shot)、选项顺序、是否要求先给答案再给解释,以及采样的温度等参数,因为这些问题都会直接改变得分。
评分脚本要与题集配套,明确如何从模型输出中提取答案、如何处理「A) xxx」这类带选项标签的回答、以及无法解析时的处理方式。报告结果时除准确率外,还要给出样本数和置信区间,或至少给出无效输出率,否则一个在小样本上得到的均值没有统计意义。准确率 \(\hat{p}\) 的 95% 置信区间可用正态近似:
其中 \(n\) 为有效样本数;样本越少、\(\hat{p}\) 越接近 0.5,区间越宽,说明估计越不可靠。
验证方式可以是:用固定的随机种子重跑一次评分,确认结果一致;再手工抽查若干条被判定错误的样本,确认是模型答错而非解析脚本误判。以下是一个最小选项提取脚本:
import re
def extract_choice(text):
m = re.search(r"\b([A-D])\b[\).::]?\s", text)
if not m:
return None
return m.group(1)
# 输入 "The answer is B) Paris" -> "B"
assert extract_choice("The answer is B) Paris") == "B"
assert extract_choice("C. London") == "C"
验证成功的标准:用固定种子重跑评分得到完全一致的准确率;抽查错误样本时,绝大多数是「模型答错」而非「正则没匹配到答案」。
方法¶
可使用选择题、短答或开放问答。公开题集可能被训练数据污染,因此不能把分数直接视为新知识能力。
选择题 (multiple-choice) 最容易自动化评分,但会受到选项顺序、猜测概率和模型对「先给选项」格式偏好等因素影响。短答 (short answer) 需要更严格的答案解析与归一化,例如统一大小写、去除多余空格、处理同义表达。开放问答则常需要人工或模型辅助打分,成本高但更能反映真实表达能力。
数据污染是通用知识评测的核心风险。MMLU 原论文就在构造时做了去污染处理,剔除与训练语料存在显著 n-gram 重叠的题目,以降低「模型背过原题」的影响。许多公开题集在互联网上广泛流传,很可能已被用于模型训练,导致模型记住题目与答案而非具备相应知识。缓解手段包括使用去污染检测、在题集发布之后的时间节点上重新构造等价的同主题新题、以及报告训练数据时间窗口。
因此通用知识分数更适合用于横向比较同一污染程度下的模型,或在固定题目上的持续回归,而不是对模型「拥有多少新知识」下绝对结论。
案例¶
两个模型在同一封闭题集上以零样本方式回答,记录准确率与无效输出率;再用时间后新题验证污染风险。
以一道四选一的历史题为例,两个模型使用完全相同的提示模板、零样本设置,分别回答,评分脚本从输出中提取选项字母。统计两个模型各自的准确率,并单列「未给出可解析选项」的无效输出率,避免把格式失败混入正确率。
若模型 A 准确率显著高于模型 B,但 A 的训练数据明确覆盖了该题集来源,则这个差距可能只是记忆优势。为进一步验证,构造一批发布时间晚于两模型训练截止日期的同主题新题,再次评测:若 A 的优势消失或反转,说明此前的高分主要来自污染。
排查方向包括:检查无效输出是否集中在某种特定题型、选项是否因顺序偏置被系统忽略、以及评分脚本的正则是否漏掉了合法答案格式。可以在相同题目上打乱选项顺序再跑一次,若得分明显变化,说明模型存在选项位置偏好而非稳定掌握知识。