评估框架
输入→调用→评估→解释,每步都有选择
CS336 · 第 12 课
评估看似机械——扔一些 prompt 进去,算个平均分——但实际上是一个深刻而丰富的话题。评估决定了语言模型的未来发展方向,选择错误的指标会引导整个领域走偏。
Spring 2026 官方来源:Lecture 12 trace · 课程日程
本页是中文学习导读;讲次主题、教师与材料版本以 Stanford 官方页面和讲义为准。
本讲问题:一个模型在 benchmark 上得分更高,并不自动代表它更有用、更可靠或更安全;评估首先要明确希望测量哪种能力,以及 metric 是否真的对应使用场景。
定义目标行为 → 选择 perplexity / task / judge / reasoning 指标 → 控制 contamination 与提示敏感性 → 检查真实性、实用性和安全边界。
评估不是“找一个 benchmark 数字”,而是把目标行为变成 observation protocol。先区分 construct(想测的能力)、item(题目)、scoring rule(怎样判分)与 aggregate(怎样汇总)。测量链任何一环变化,分数都可能变化。
target behavior
↓ operationalize
dataset items + prompt/template + decoding settings
↓ model responses
scorer / judge / reference
↓ per-item measurements
aggregation + uncertainty + subgroup analysis
↓ claim with validity boundary若正确序列两个 token 的概率分别为 0.5、0.25,平均 negative log-likelihood 是 \(-(\log0.5+\log0.25)/2\),perplexity 为其指数,即 \(\sqrt{1/(0.5×0.25)}\approx2.83\)。这是固定 tokenization 与 evaluation convention 下的 Exact identity。换 tokenizer 后 token 数和事件空间都变了,PPL 不再可直接横比。
模型若训练时见过 benchmark 答案,可高分却不具备可迁移能力;judge 偏爱更长、更自信的答案,也可让 verbosity 看起来像质量。反过来,prompt formatting 不匹配也可能低估真实能力。因此评估必须同时查 contamination、prompt sensitivity、judge bias 与真实任务代表性。
打开任何一个前沿模型的论文(DeepSeek-R1、Llama 4、OLMo 2),你会看到一张 benchmark 分数表。这些数字看起来精确而权威。但这一课要告诉你:每个数字背后都有很多主观选择。
评估框架四问:
| 目的 | 评估方式 | 关注点 |
|---|---|---|
| 采购决策 | Chatbot Arena | 用户满意度 |
| 测量能力 | MMLU, GPQA | 知识/推理 |
| 改进模型 | 开发集 loss | 训练信号 |
| 安全评估 | HarmBench, AIR-Bench | 风险/伤害 |
| 政策制定 | 标准化测试 | 可比较性 |
单一数字(如"MMLU 86.4%")隐藏了太多信息:
Karpathy 的"评估危机":很多 benchmark 已经饱和(最高分 > 90%),但模型在实际使用中仍然会犯明显错误。benchmark 分数和真实能力之间的鸿沟越来越大。
语言模型是 token 序列上的概率分布 p(x)。Perplexity 衡量模型对测试数据的"惊讶程度":
给定测试集 D = {x_1, x_2, ..., x_N}
Perplexity = exp(-1/N × Σ log p(x_i))
等价形式:
Perplexity = 1 / p(D)^(1/|D|)
直觉:
Perplexity = 1 → 完美预测(每个 token 概率 = 1)
Perplexity = V → 完全随机(V = 词表大小)
Perplexity 越低越好
| 数据集 | 来源 | 大小 | 特点 |
|---|---|---|---|
| Penn Treebank | WSJ 新闻 | 1M words | 小,经典 |
| WikiText-103 | Wikipedia | 103M words | 中等 |
| One Billion Word | 新闻/WMT | 1B words | 大规模 |
# GPT-2 的 perplexity 结果(zero-shot 迁移)
# 在 WebText 上训练,在其他数据集上评估
Perplexity on:
- Penn Treeband: 46.5 (LSTM SOTA was 51.3)
- WikiText-103: 17.3
- One Billion Word: 66.3 (在更大的数据集上迁移效果下降)
# 关键洞察: 在相似分布的数据上 perplexity 低
# 在 out-of-distribution 上 perplexity 更高
极端观点:如果我们能完美预测语言(perplexity = 英语的熵),就解决了所有 NLP 任务。推低 perplexity 是通往 AGI 的道路。
反驳:这可能不是最高效的路径——某些对 perplexity 影响小的能力(如推理)可能对下游任务至关重要。
有些任务本质上就是 perplexity 的变体:
MMLU 是最广泛使用的知识测试之一:
MMLU 示例问题 (抽象代数):
以下哪个是域 F 上的向量空间 V 的子空间 W 的必要条件?
A. W 非空
B. W 对加法封闭
C. W 对标量乘法封闭
D. 以上都是
答案: D
GPT-3 (175B) 5-shot: 43.9%
Chinchilla (70B): 67.6%
GPT-4: 86.4% (报告值)
MMLU 的改进版:
更难的知识测试:
最新的"终极测试":
MMLU 等结构化任务之外,更现实的评估是"指令跟随"——像 ChatGPT 那样响应用户请求。问题是:如何自动评估开放式生成?
目前最受信任的评估方式之一:
Chatbot Arena 的特点:
1. 输入来自真实用户(多样、长尾)
2. 评估者是真实人类(主观但真实)
3. 可以不断加入新模型
4. 结果接近真实用户偏好
局限性:
1. 用户群体有偏(英文、技术向)
2. 投票可能受风格而非内容影响
3. 无法复现(每次运行结果不同)
自动化的指令跟随评估:
IFEval 约束示例:
1. 长度约束: "至少 5 句话"
2. 格式约束: "用 JSON 格式回答"
3. 关键词约束: "包含'综上所述'"
4. 语言约束: "用法语回答"
5. 编号约束: "用编号列表"
评估: 检查输出是否满足每个约束
优点: 自动化、可复现
缺点: 约束较简单,不能衡量真正质量
用语言模型评估语言模型的输出——这是目前最流行的自动评估方法。
# 输入: prompt + model_output
# Judge prompt: "评估以下回答的质量,给出 1-10 分..."
judge_prompt = """
给定问题: {prompt}
模型回答: {response}
请评估回答的质量:
1. 准确性 (1-10):
2. 完整性 (1-10):
3. 清晰度 (1-10):
总分: """
LM judge 有多种系统性偏差:
| 偏差 | 表现 | 缓解方法 |
|---|---|---|
| 位置偏差 | 偏好先看到的回答 | 交换位置取平均 |
| 长度偏差 | 偏好更长的回答 | 控制长度或使用 rubric |
| 自我偏好 | 偏好与自己风格一致的 | 使用多个 judge |
| 难度偏差 | 对难题评分过松 | 按难度分层 |
| Benchmark | 内容 | 规模 | 难度 |
|---|---|---|---|
| GSM8K | 小学应用题 | 8.5K | 低-中 |
| MATH | 竞赛数学 | 12.5K | 高 |
| MATH-500 | MATH 子集 | 500 | 高 |
| AMC 22 | 竞赛题 | 44 | 很高 |
| AIME | 竞赛题 | 30 | 极高 |
GSM8K 示例:
Janet 的鸭子每天产 16 个蛋。她每天早上吃 2 个早餐,
用 3 个做午餐。她每天把剩余的蛋以每个 1.5 美元的价格卖掉。
她一周能赚多少钱?
解: 16 - 2 - 3 = 11 个蛋/天
11 × 1.5 = 16.5 美元/天
16.5 × 7 = 115.5 美元/周
答案: 115.5
| Benchmark | 内容 | 评估 |
|---|---|---|
| HumanEval | 164 编程题 | 单元测试 pass@k |
| MBPP | 基础编程 | 单元测试 |
| SWE-Bench | 真实 GitHub issues | PR 通过测试 |
| LiveCodeBench | 最新竞赛题 | 在线评测 |
# HumanEval 示例:
# 写一个函数检查一个数是否为质数
def is_prime(n):
"""Return True if n is a prime number."""
if n < 2:
return False
for i in range(2, int(n**0.5) + 1):
if n % i == 0:
return False
return True
# 评估: pass@k
# pass@1: 单次采样通过率
# pass@10: 10 次采样至少一次通过的概率
Agent = 语言模型 + 脚手架逻辑(决定如何使用模型):
| Benchmark | 任务 | 评估 |
|---|---|---|
| SWE-Bench | 修复 GitHub issues | 单元测试 |
| CyBench | CTF 安全挑战 | 首次解决时间 |
| MLEBench | Kaggle 竞赛 | 模型性能 |
| WebArena | 浏览器任务 | 任务完成 |
试图将推理与知识分离:
除了增加模型规模,另一种提升性能的方法是在推理时增加计算。
直接回答:
Q: 3 个苹果 + 2 个梨 = ?
A: 5
Chain-of-Thought:
Q: 3 个苹果 + 2 个梨 = ?
A: 让我想想。3 个苹果,加上 2 个梨,一共是 3 + 2 = 5 个水果。
答案是 5。
CoT 的优势:
- 让模型"说出"推理过程
- 对数学、逻辑、多步推理特别有效
- 不需要重新训练
# 思路: 多次采样,选出现最一致的答案
# 对同一问题采样 10 次,每次用不同的 temperature
answers = []
for i in range(10):
response = model.generate(prompt, temperature=0.7, seed=i)
answer = extract_answer(response)
answers.append(answer)
# 选出现频率最高的答案
final_answer = max(set(answers), key=answers.count)
# 例: 10 次采样得到 [5, 5, 5, 5, 5, 6, 5, 7, 5, 5]
# 最终答案: 5(出现 8 次)
OpenAI o1/o3 和 DeepSeek-R1 展示了 test-time compute 的 scaling:
关键洞察:存在一个 trade-off——把算力投入训练(更大的模型)vs 投入推理(更长的思考)。对于不频繁的任务,推理时计算更划算;对于高频任务,训练时计算更划算。
现代 LLM 在"整个互联网"上训练。测试集也来自互联网。所以测试集可能已经被模型"看过":
检测训练-测试重叠的方法:
方法 1: 直接检测
- 检查测试样本是否在训练数据中(精确匹配)
- 问题: 你不知道训练数据是什么(闭源模型)
方法 2: 利用数据的 exchangeability
- 如果模型记住了测试样本,它对相似样本的 loss 也会低
- 通过比较 loss 的分布来检测
方法 3: 时间分割
- 用"新"数据(训练截止日期之后)作为测试集
- 例: 用 2024 年数据测试 2023 年训练的模型
Benchmark 本身可能有质量问题:
| 时代 | 评估对象 | 规则 |
|---|---|---|
| 前基础模型 | 方法 | 固定 train/test split |
| 基础模型 | 模型/系统 | anything goes |
| 纳米 GPT speedrun | 训练效率 | 固定数据,目标 loss |
关键问题:现在我们评估的是"模型 + prompt + agent 脚手架"的整个系统,而不是模型本身。这导致不同论文的结果难以比较——每个团队使用不同的 prompt 和脚手架。
| 类型 | 用户知道答案? | 目的 | 例子 |
|---|---|---|---|
| Quizzing | 是 | 测试系统 | MMLU 问题 |
| Asking | 否 | 获取信息 | "帮我写一封邮件" |
Asking 更现实——用户真正使用 LLM 是为了获取他们不知道的信息。但现有 benchmark 主要是 Quizzing。
分析真实用户数据的尝试:
医学领域的现实评估:
安全不是一个单一维度:
自动化的安全绕过:
GCG (Greedy Coordinate Gradient):
- 自动优化对抗性 prompt
- 目标: 让模型输出被拒绝的内容
- 关键发现: 对抗性 prompt 可以从开源模型迁移到闭源模型
例: "生成恶意代码" → 被拒绝
"生成恶意代码 + [对抗性后缀]" → 可能被接受
这说明了安全评估的重要性:
- 不仅要测试"正常" prompt
- 还要测试对抗性 prompt
安全的两个维度:
| 能力 (Capabilities) | 倾向 (Propensity) | |
|---|---|---|
| 定义 | 模型能做什么 | 模型愿意做什么 |
| API 模型 | 重要 | 更重要(可以绕过) |
| 开放权重 | 更重要(可以微调掉安全) | 重要 |
问题 1:Perplexity 的定义是什么?
问题 2:为什么需要 GPQA 和 Humanity's Last Exam 这样的新 benchmark?
问题 3:LM-as-a-Judge 有哪些系统性偏差?
问题 4:如何检测 train-test overlap?
问题 5:Test-time compute scaling 的核心洞察是什么?
正确 token 概率依次为 0.5、0.25,PPL 是多少?换 tokenizer 后能否直接比较?
答案:\(\exp[-(\log0.5+\log0.25)/2]\approx2.83\);不同 token event space 下不能裸比。
若取 \(1/(0.5+0.25)\),你把序列概率的乘法/对数平均误当成概率算术平均。
评估暴露了模型会什么,也可能暴露训练数据泄漏;下一课回到源头,追踪数据从网页/书籍/代码到训练 mixture 的 provenance、许可与能力偏置。
输入→调用→评估→解释,每步都有选择
平滑通用但不代表下游能力
高效但有位置/长度/自我偏好
Train-test overlap 和数据质量是关键威胁