【大模型】- 评估

算法

评估

衡量语言模型的性能

类型: 学习 | 语言: Python | 🏷 前置:《评估》(本系列第 9 篇)

学习目标

  • 了解 LLM 评估的主要基准
  • 实现常见的评估指标
  • 运行自动化评估流程
  • 分析评估结果
  • 理解评估的局限性

为什么评估很重要

评估对于以下方面至关重要:

  • 比较不同模型
  • 跟踪训练进度
  • 识别模型弱点
  • 指导模型改进

主要评估基准

知识和推理

基准 任务 类型
MMLU 57 个多选科目 知识
ARC 科学推理 推理
HellaSwag 常识推理 推理
TriviaQA 事实问答 知识

代码和数学

基准 任务 类型
HumanEval 代码生成 代码
MBPP 编程问题 代码
GSM8K 小学数学 数学
MATH 竞赛数学 数学

语言理解

基准 任务 类型
WinoGrande 常识推理 语言
BoolQ 阅读理解 语言
PIQA 物理直觉 语言

评估指标

准确率

1
2
3
4
def compute_accuracy(predictions, references):
"""计算准确率"""
correct = sum(1 for p, r in zip(predictions, references) if p == r)
return correct / len(predictions)

F1 分数

1
2
3
4
5
from sklearn.metrics import f1_score

def compute_f1(predictions, references):
"""计算 F1 分数"""
return f1_score(references, predictions, average="weighted")

BLEU 分数

1
2
3
4
5
from nltk.translate.bleu_score import sentence_bleu

def compute_bleu(prediction, reference):
"""计算 BLEU 分数"""
return sentence_bleu([reference.split()], prediction.split())

ROUGE 分数

1
2
3
4
5
6
from rouge_score import rouge_scorer

def compute_rouge(prediction, reference):
"""计算 ROUGE 分数"""
scorer = rouge_scorer.RougeScorer(["rouge1", "rouge2", "rougeL"], use_stemmer=True)
return scorer.score(reference, prediction)

运行评估

使用 lm-eval-harness

1
2
3
4
5
6
7
8
9
10
11
12
13
from lm_eval import evaluator, tasks

def run_evaluation(model, tokenizer, task_names):
"""使用 lm-eval-harness 运行评估"""
results = evaluator.simple_evaluate(
model="hf",
model_args=f"pretrained={model},tokenizer={tokenizer}",
tasks=task_names,
num_fewshot=0,
batch_size=32
)

return results

自定义评估

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
def evaluate_mmlu(model, tokenizer, dataset, num_samples=1000):
"""评估 MMLU 基准"""
correct = 0
total = 0

for sample in dataset[:num_samples]:
question = sample["question"]
choices = sample["choices"]
answer = sample["answer"]

# 构建提示
prompt = f"""问题:{question}

选项:
A. {choices[0]}
B. {choices[1]}
C. {choices[2]}
D. {choices[3]}

请回答(A/B/C/D):"""

# 生成回答
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=10,
temperature=0.0
)

response = tokenizer.decode(outputs[0], skip_special_tokens=True)

# 提取答案
predicted = response[-1].upper() if response else ""

if predicted == chr(65 + answer): # A=0, B=1, C=2, D=3
correct += 1
total += 1

return correct / total

评估流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def evaluation_pipeline(model, tokenizer, config):
"""完整的评估流程"""
results = {}

# 1. 知识评估
print("评估知识...")
results["mmlu"] = evaluate_mmlu(model, tokenizer, mmlu_dataset)
results["triviaqa"] = evaluate_triviaqa(model, tokenizer, triviaqa_dataset)

# 2. 推理评估
print("评估推理...")
results["arc"] = evaluate_arc(model, tokenizer, arc_dataset)
results["hellaswag"] = evaluate_hellaswag(model, tokenizer, hellaswag_dataset)

# 3. 代码评估
print("评估代码...")
results["humaneval"] = evaluate_humaneval(model, tokenizer, humaneval_dataset)
results["mbpp"] = evaluate_mbpp(model, tokenizer, mbpp_dataset)

# 4. 数学评估
print("评估数学...")
results["gsm8k"] = evaluate_gsm8k(model, tokenizer, gsm8k_dataset)

# 打印结果
print("\n评估结果:")
for metric, value in results.items():
print(f" {metric}: {value:.4f}")

return results

分析评估结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def analyze_results(results):
"""分析评估结果"""
# 找出强项和弱项
strengths = []
weaknesses = []

for metric, value in results.items():
if value > 0.7:
strengths.append((metric, value))
elif value < 0.5:
weaknesses.append((metric, value))

print("强项:")
for metric, value in strengths:
print(f" {metric}: {value:.4f}")

print("\n弱项:")
for metric, value in weaknesses:
print(f" {metric}: {value:.4f}")

return strengths, weaknesses

评估的局限性

数据泄漏

1
2
3
4
5
6
7
8
9
10
def check_data_leakage(eval_dataset, train_dataset):
"""检查评估数据是否泄漏到训练数据中"""
eval_samples = set(str(sample) for sample in eval_dataset)
train_samples = set(str(sample) for sample in train_dataset)

overlap = eval_samples.intersection(train_samples)
leakage_rate = len(overlap) / len(eval_samples)

print(f"数据泄漏率:{leasure_rate:.2%}")
return leakage_rate > 0.01 # 如果超过 1%,则存在泄漏

评估偏差

  1. 选择偏差:评估集可能不代表真实分布
  2. 格式偏差:模型可能学习了特定的格式
  3. 记忆偏差:模型可能记住了评估样本
  4. 评估者偏差:自动评估可能不准确

缓解策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def robust_evaluation(model, tokenizer, eval_dataset, num_runs=5):
"""稳健的评估,多次运行取平均"""
all_scores = []

for run in range(num_runs):
# 随机打乱评估集
shuffled_dataset = eval_dataset.shuffle(seed=run)

# 运行评估
score = evaluate_model(model, tokenizer, shuffled_dataset)
all_scores.append(score)

# 计算平均值和标准差
mean_score = sum(all_scores) / len(all_scores)
std_score = (sum((x - mean_score) ** 2 for x in all_scores) / len(all_scores)) ** 0.5

return mean_score, std_score

评估最佳实践

  1. 使用多个基准:不要只依赖一个基准
  2. 报告置信区间:多次运行并报告标准差
  3. 检查数据泄漏:确保评估数据未在训练中使用
  4. 人工评估:自动评估应与人工评估结合
  5. 透明报告:报告评估设置和限制

总结

评估是衡量 LLM 性能的关键环节。使用多个基准和指标可以全面了解模型能力。需要注意评估的局限性,如数据泄漏和偏差。

下一步

下一课将介绍量化,用于减少模型大小和加速推理。

📚 本文改编自 AI Engineering from Scratch(MIT License · 作者 Rohit Ghumare),中文内容来自官方中文镜像。原课程共 503 课 · 20 阶段 · 免费开源,教程网站见 aiengineeringfromscratch.com

📝 自我检查(课程配套测验)

Q1(学前) 为什么 LLM 评估不能只看 loss 或 perplexity?

A. 这些指标无法计算
B. 低 perplexity 不保证有用、安全或符合指令的输出——需要任务特定基准
C. Perplexity 只对小模型有效
D. Loss 在微调后会上升

答案: B 解析: Perplexity 衡量预测下一 token 的能力,不衡量指令遵循、推理、安全性或事实性。模型 perplexity 低仍可能幻觉、拒绝合理请求或产生有害内容。

Q2(学前) MMLU 基准测试什么?

A. 代码生成能力
B. 57 个学科的多选题知识,从初等数学到专业法律
C. 对话质量
D. token 生成速度

答案: B 解析: MMLU(大规模多任务语言理解)在 57 个学科约 16K 道多选题上测试模型,涵盖 STEM、人文、社科等,是衡量广泛知识的标准基准。

Q3(学后) LLM 评估中人工评估与自动指标如何配合?

A. 只需自动指标
B. 自动指标(MMLU、HumanEval)可扩展但可能无法捕捉细微质量;人工评估更准确但昂贵——两者结合
C. 只需人工评估
D. 两者互斥

答案: B 解析: 自动基准(MMLU、HumanEval、GSM8K)可大规模、可复现地运行,但可能无法反映真实效用。人工评估(Elo 排名、并排比较)捕捉质量但成本高。生产评估通常两者都用。

Q4(学后) 什么是 LLM-as-judge 评估?

A. 用人工逐条评估每条回答
B. 用强大 LLM(如 GPT-4)对较弱模型的输出打分或排名,作为人工评估的可扩展替代
C. 模型自评
D. 仅评估 judge 模型本身

答案: B 解析: LLM-as-judge 用能力强的模型评估其他模型的输出,比纯人工评估更可扩展。研究表明 GPT-4 等 judge 与人类判断相关性高,但存在 position bias 和 self-preference 等局限。

Q5(学后) 为什么评估应包含对抗性和安全测试?

A. 加快训练
B. 模型在标准基准上表现好仍可能在 jailbreak、有害请求或边缘情况下失败——安全评估发现这些漏洞
C. 减少 API 成本
D. 安全测试取代能力测试

答案: B 解析: MMLU 高分不意味着模型能抵抗 jailbreak 或拒绝有害请求。安全评估(HarmBench、AdvBench)专门测试对抗输入、prompt injection 和有害内容生成,对部署至关重要。

  • 标题: 【大模型】- 评估
  • 作者:
  • 创建于 : 2026-08-19 09:10:00
  • 更新于 : 2026-08-21 16:20:11
  • 链接: https://sxl-space.tk/2026/08/19/010_LLM/010_LLM-10-Evaluation/
  • 版权声明: 版权所有 © 宋,禁止转载。