CS336 · 第 12 课

语言模型评估

评估看似机械——扔一些 prompt 进去,算个平均分——但实际上是一个深刻而丰富的话题。评估决定了语言模型的未来发展方向,选择错误的指标会引导整个领域走偏。

授课:Percy Liang 预计用时:80 分钟 难度:中等 → 较高

Spring 2026 官方来源:Lecture 12 trace · 课程日程

本页是中文学习导读;讲次主题、教师与材料版本以 Stanford 官方页面和讲义为准。

本讲问题:一个模型在 benchmark 上得分更高,并不自动代表它更有用、更可靠或更安全;评估首先要明确希望测量哪种能力,以及 metric 是否真的对应使用场景。

30 秒知识地图

定义目标行为 → 选择 perplexity / task / judge / reasoning 指标 → 控制 contamination 与提示敏感性 → 检查真实性、实用性和安全边界。

本课问题与 prerequisite refresher

评估不是“找一个 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 probability 推 perplexity

若正确序列两个 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 分数表。这些数字看起来精确而权威。但这一课要告诉你:每个数字背后都有很多主观选择。

评估框架四问:

  1. 输入是什么?(哪些用例?难度分布?)
  2. 如何调用模型?(prompt?chain-of-thought?工具?)
  3. 如何评估输出?(ground truth?自动指标?人类?)
  4. 如何解释结果?(91% 意味着什么?能部署吗?)

评估的目的决定方法

目的评估方式关注点
采购决策Chatbot Arena用户满意度
测量能力MMLU, GPQA知识/推理
改进模型开发集 loss训练信号
安全评估HarmBench, AIR-Bench风险/伤害
政策制定标准化测试可比较性

一个数字不够

单一数字(如"MMLU 86.4%")隐藏了太多信息:

Karpathy 的"评估危机":很多 benchmark 已经饱和(最高分 > 90%),但模型在实际使用中仍然会犯明显错误。benchmark 分数和真实能力之间的鸿沟越来越大。


Perplexity

定义

语言模型是 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 越低越好

为什么用 Perplexity?

Perplexity 的局限

标准数据集

数据集来源大小特点
Penn TreebankWSJ 新闻1M words小,经典
WikiText-103Wikipedia103M words中等
One Billion Word新闻/WMT1B 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 Maximalist 观点

极端观点:如果我们能完美预测语言(perplexity = 英语的熵),就解决了所有 NLP 任务。推低 perplexity 是通往 AGI 的道路。

反驳:这可能不是最高效的路径——某些对 perplexity 影响小的能力(如推理)可能对下游任务至关重要。

Perplexity 的"精神亲戚"

有些任务本质上就是 perplexity 的变体:


知识 Benchmark

MMLU (Massive Multitask Language Understanding)

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-Pro

MMLU 的改进版:

GPQA (Graduate-Level Google-Proof Q&A)

更难的知识测试:

Humanity's Last Exam (HLE)

最新的"终极测试":


指令跟随评估

MMLU 等结构化任务之外,更现实的评估是"指令跟随"——像 ChatGPT 那样响应用户请求。问题是:如何自动评估开放式生成?

Chatbot Arena

目前最受信任的评估方式之一:

Chatbot Arena 的特点:
1. 输入来自真实用户(多样、长尾)
2. 评估者是真实人类(主观但真实)
3. 可以不断加入新模型
4. 结果接近真实用户偏好

局限性:
1. 用户群体有偏(英文、技术向)
2. 投票可能受风格而非内容影响
3. 无法复现(每次运行结果不同)

IFEval (Instruction-Following Eval)

自动化的指令跟随评估:

IFEval 约束示例:
1. 长度约束: "至少 5 句话"
2. 格式约束: "用 JSON 格式回答"
3. 关键词约束: "包含'综上所述'"
4. 语言约束: "用法语回答"
5. 编号约束: "用编号列表"

评估: 检查输出是否满足每个约束
优点: 自动化、可复现
缺点: 约束较简单,不能衡量真正质量

AlpacaEval

WildBench


LM-as-a-Judge

用语言模型评估语言模型的输出——这是目前最流行的自动评估方法。

基本框架

# 输入: prompt + model_output
# Judge prompt: "评估以下回答的质量,给出 1-10 分..."

judge_prompt = """
给定问题: {prompt}
模型回答: {response}

请评估回答的质量:
1. 准确性 (1-10):
2. 完整性 (1-10):
3. 清晰度 (1-10):
总分: """

Judge 的偏差

LM judge 有多种系统性偏差:

偏差表现缓解方法
位置偏差偏好先看到的回答交换位置取平均
长度偏差偏好更长的回答控制长度或使用 rubric
自我偏好偏好与自己风格一致的使用多个 judge
难度偏差对难题评分过松按难度分层

Pairwise vs Pointwise


推理 Benchmark

数学推理

Benchmark内容规模难度
GSM8K小学应用题8.5K低-中
MATH竞赛数学12.5K高
MATH-500MATH 子集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内容评估
HumanEval164 编程题单元测试 pass@k
MBPP基础编程单元测试
SWE-Bench真实 GitHub issuesPR 通过测试
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 评估

Agent = 语言模型 + 脚手架逻辑(决定如何使用模型):

Benchmark任务评估
SWE-Bench修复 GitHub issues单元测试
CyBenchCTF 安全挑战首次解决时间
MLEBenchKaggle 竞赛模型性能
WebArena浏览器任务任务完成

纯推理:ARC-AGI

试图将推理与知识分离:


Test-Time Compute Scaling

除了增加模型规模,另一种提升性能的方法是在推理时增加计算。

Chain-of-Thought (CoT)

直接回答:
Q: 3 个苹果 + 2 个梨 = ?
A: 5

Chain-of-Thought:
Q: 3 个苹果 + 2 个梨 = ?
A: 让我想想。3 个苹果,加上 2 个梨,一共是 3 + 2 = 5 个水果。
答案是 5。

CoT 的优势:
- 让模型"说出"推理过程
- 对数学、逻辑、多步推理特别有效
- 不需要重新训练

Self-Consistency

# 思路: 多次采样,选出现最一致的答案

# 对同一问题采样 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 投入推理(更长的思考)。对于不频繁的任务,推理时计算更划算;对于高频任务,训练时计算更划算。


评估的有效性

Train-Test Overlap

现代 LLM 在"整个互联网"上训练。测试集也来自互联网。所以测试集可能已经被模型"看过":

检测训练-测试重叠的方法:

方法 1: 直接检测
- 检查测试样本是否在训练数据中(精确匹配)
- 问题: 你不知道训练数据是什么(闭源模型)

方法 2: 利用数据的 exchangeability
- 如果模型记住了测试样本,它对相似样本的 loss 也会低
- 通过比较 loss 的分布来检测

方法 3: 时间分割
- 用"新"数据(训练截止日期之后)作为测试集
- 例: 用 2024 年数据测试 2023 年训练的模型

Dataset Quality

Benchmark 本身可能有质量问题:

我们在评估什么?方法还是模型?

时代评估对象规则
前基础模型方法固定 train/test split
基础模型模型/系统anything goes
纳米 GPT speedrun训练效率固定数据,目标 loss

关键问题:现在我们评估的是"模型 + prompt + agent 脚手架"的整个系统,而不是模型本身。这导致不同论文的结果难以比较——每个团队使用不同的 prompt 和脚手架。


真实性与实用性

两种 Prompt

类型用户知道答案?目的例子
Quizzing是测试系统MMLU 问题
Asking否获取信息"帮我写一封邮件"

Asking 更现实——用户真正使用 LLM 是为了获取他们不知道的信息。但现有 benchmark 主要是 Quizzing。

Clio (Anthropic)

分析真实用户数据的尝试:

MedHELM

医学领域的现实评估:


安全评估

什么是安全?

安全不是一个单一维度:

HarmBench

AIR-Bench

Jailbreaking

自动化的安全绕过:

GCG (Greedy Coordinate Gradient):
- 自动优化对抗性 prompt
- 目标: 让模型输出被拒绝的内容
- 关键发现: 对抗性 prompt 可以从开源模型迁移到闭源模型

例: "生成恶意代码" → 被拒绝
"生成恶意代码 + [对抗性后缀]" → 可能被接受

这说明了安全评估的重要性:
- 不仅要测试"正常" prompt
- 还要测试对抗性 prompt

Capabilities vs Propensity

安全的两个维度:

能力 (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 的核心洞察是什么?


Concept Check · 两 token perplexity

正确 token 概率依次为 0.5、0.25,PPL 是多少?换 tokenizer 后能否直接比较?

答案:\(\exp[-(\log0.5+\log0.25)/2]\approx2.83\);不同 token event space 下不能裸比。

若取 \(1/(0.5+0.25)\),你把序列概率的乘法/对数平均误当成概率算术平均。

你现在应该能够解释

通往第 13 课

评估暴露了模型会什么,也可能暴露训练数据泄漏;下一课回到源头,追踪数据从网页/书籍/代码到训练 mixture 的 provenance、许可与能力偏置。

如果只能记住 5 件事

评估框架

输入→调用→评估→解释,每步都有选择

Perplexity

平滑通用但不代表下游能力

LM-as-Judge

高效但有位置/长度/自我偏好

有效性

Train-test overlap 和数据质量是关键威胁


延伸阅读

Reference · 延伸阅读与一手资料