目录
1. AI 基准的重要性
标准化评估的必要性
该如何比较 AI 模型?有两个图像分类模型时,要判断哪一个更优秀,就需要一个共同的标准。基准数据集提供的正是这个共同标准。
如果没有标准化的基准,各个团队就可能只用对自己有利的数据集来评估,导致结果难以客观比较。ImageNet、GLUE、MMLU 这类标准基准,让 AI 研究社区能够在同一份试卷上竞争,从而衡量进展、设定方向。
排行榜与竞争
基准通过排行榜把 AI 的发展直观地展现出来。
- ImageNet LSVRC:2012 年 AlexNet 将 Top-5 错误率从 26% 降到 15.3%,由此拉开了深度学习革命的序幕。
- GLUE/SuperGLUE:记录了 BERT、RoBERTa、T5 等模型超越人类水平表现的过程。
- HumanEval:成为 GPT-4、Claude、Gemini 等最新 LLM 竞争代码生成能力的舞台。
- LMSYS Chatbot Arena:由真实人类用户对两个模型做盲测,据此评出 ELO 分数。
基准的局限与偏差
基准是强大的工具,但局限也很明显。
1. 数据集污染(Contamination)
LLM 是用互联网上海量的文本训练出来的。如果基准的测试数据混进了训练数据里,模型可能并非真正理解了问题,而只是背下了答案。GPT-4 技术报告也承认了这个问题。
2. 古德哈特定律(Goodhart's Law)
"一旦某个衡量指标变成了目标,它就不再是一个好的衡量指标。" 研究者如果只专注于提高某个基准分数,分数可能会在能力并未真正提升的情况下升高。
3. 偏差与代表性
许多基准都偏重于英语和西方文化圈的数据。在韩语、阿拉伯语、斯瓦希里语等语言上的表现,可能与英语基准分数有很大差异。
4. 静态的标准
基准一旦制定就不再变化,但 AI 模型却在持续进步。2023 年还很难的基准,到 2025 年可能已经接近饱和状态(near-saturation)。
5. 与实际表现的差距
基准分数高,并不能保证在实际使用环境中也有好的表现。用户体验、创造力、安全性等难以量化的因素同样重要。
2. 计算机视觉基准
ImageNet (ILSVRC)
ImageNet Large Scale Visual Recognition Challenge(ILSVRC)是计算机视觉史上影响力最大的基准。它起源于斯坦福大学 Fei-Fei Li 教授主导的 ImageNet 项目(2009),从 2010 年到 2017 年作为年度赛事举办。
数据集特点:
- 1,000 个类别(狗、猫、汽车等日常物体)
- 训练数据:约 120 万张
- 验证数据:50,000 张
- 测试数据:100,000 张
- 平均每个类别约 1,200 张
主要评估指标:
- Top-1 Accuracy:模型预测的第一名类别是真实答案的比例
- Top-5 Accuracy:模型预测的前 5 个类别中包含真实答案的比例
历史发展:
| 年份 | 模型 | Top-5 错误率 |
|---|---|---|
| 2010 | NEC-UIUC | 28.2% |
| 2012 | AlexNet | 15.3% |
| 2014 | VGG-16 | 7.3% |
| 2015 | ResNet-152 | 3.57% |
| 2017 | SENet | 2.25% |
| 2021 | CoAtNet | 0.95% |
| 2023 | ViT-22B | ~0.6% |
人类的 Top-5 错误率估计约为 5.1%。自 ResNet(2015 年)超越人类水平之后,研究进一步扩展到更难的变体基准(ImageNet-A、ImageNet-R、ImageNet-C)。
# 用 PyTorch 测量 ImageNet 验证精度
import torch
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import torchvision.models as models
from torch.utils.data import DataLoader
def evaluate_imagenet(model, val_dir, batch_size=256):
# 标准预处理(ImageNet 验证基准)
val_transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225]
)
])
val_dataset = datasets.ImageFolder(val_dir, transform=val_transform)
val_loader = DataLoader(
val_dataset,
batch_size=batch_size,
shuffle=False,
num_workers=8,
pin_memory=True
)
model.eval()
top1_correct = 0
top5_correct = 0
total = 0
with torch.no_grad():
for images, labels in val_loader:
images = images.cuda()
labels = labels.cuda()
outputs = model(images)
_, predicted = outputs.topk(5, 1, True, True)
predicted = predicted.t()
correct = predicted.eq(labels.view(1, -1).expand_as(predicted))
top1_correct += correct[:1].reshape(-1).float().sum(0)
top5_correct += correct[:5].reshape(-1).float().sum(0)
total += labels.size(0)
top1_acc = top1_correct / total * 100
top5_acc = top5_correct / total * 100
print(f"Top-1 Accuracy: {top1_acc:.2f}%")
print(f"Top-5 Accuracy: {top5_acc:.2f}%")
return top1_acc, top5_acc
# 示例:评估 ResNet-50
model = models.resnet50(pretrained=True).cuda()
evaluate_imagenet(model, '/path/to/imagenet/val')
COCO (Common Objects in Context)
COCO 是 Microsoft 于 2014 年发布的大规模目标检测、分割、图像描述基准。
数据集特点:
- 80 个日常物体类别
- 超过 330,000 张图像
- 超过 150 万个目标实例
- 每张图像配有 5 条描述(用于图像描述任务)
- 包含精细的分割掩码
主要评估指标:
mAP(mean Average Precision)是 COCO 的核心指标。根据 IoU(Intersection over Union)阈值的不同,存在多种细分指标。
from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval
import json
def evaluate_coco_detection(annotation_file, result_file):
# 加载 COCO GT
coco_gt = COCO(annotation_file)
# 加载预测结果
coco_dt = coco_gt.loadRes(result_file)
# bbox 评估
coco_eval = COCOeval(coco_gt, coco_dt, 'bbox')
coco_eval.evaluate()
coco_eval.accumulate()
coco_eval.summarize()
# 输出主要指标
stats = coco_eval.stats
print(f"\n=== COCO Detection Results ===")
print(f"AP @ IoU=0.50:0.95 (COCO primary): {stats[0]:.3f}")
print(f"AP @ IoU=0.50 (PASCAL VOC style): {stats[1]:.3f}")
print(f"AP @ IoU=0.75 (strict): {stats[2]:.3f}")
print(f"AP (small objects, area < 32^2): {stats[3]:.3f}")
print(f"AP (medium objects): {stats[4]:.3f}")
print(f"AP (large objects): {stats[5]:.3f}")
print(f"AR (max=1 det/image): {stats[6]:.3f}")
print(f"AR (max=10 det/image): {stats[7]:.3f}")
print(f"AR (max=100 det/image): {stats[8]:.3f}")
return stats
# 探索 COCO 数据集
coco = COCO('instances_val2017.json')
cat_ids = coco.getCatIds(catNms=['person', 'car', 'dog'])
img_ids = coco.getImgIds(catIds=cat_ids[:1])
# 查看特定图像的标注
img = coco.loadImgs(img_ids[0])[0]
ann_ids = coco.getAnnIds(imgIds=img['id'])
anns = coco.loadAnns(ann_ids)
print(f"图像: {img['file_name']}, 标注数: {len(anns)}")
for ann in anns[:3]:
cat = coco.loadCats(ann['category_id'])[0]
print(f" 类别: {cat['name']}, 面积: {ann['area']:.0f}px²")
最新 COCO 性能(截至 2025 年):
| 模型 | AP (box) | AP (mask) | 参数量 |
|---|---|---|---|
| YOLOv8x | 53.9 | - | 68M |
| DINO (Swin-L) | 63.3 | - | 218M |
| Co-DINO (Swin-L) | 64.1 | 54.0 | 218M |
| InternImage-H | 65.4 | 56.1 | 2.18B |
ADE20K - 语义分割
ADE20K 是 MIT CSAIL 构建的语义分割基准,覆盖 150 个类别,包含 25,000 张图像。
主要指标:
- mIoU (mean Intersection over Union):预测掩码与真实掩码之间的平均 IoU
- aAcc (allAcc):像素级整体精度
- mAcc:各类别平均精度
import numpy as np
def compute_iou(pred_mask, gt_mask, num_classes=150):
"""计算 mIoU"""
iou_list = []
for cls in range(num_classes):
pred_cls = (pred_mask == cls)
gt_cls = (gt_mask == cls)
intersection = np.logical_and(pred_cls, gt_cls).sum()
union = np.logical_or(pred_cls, gt_cls).sum()
if union == 0:
continue # 该类别不在图像中时跳过
iou = intersection / union
iou_list.append(iou)
return np.mean(iou_list) if iou_list else 0.0
# 用 mmsegmentation 评估 ADE20K
# pip install mmsegmentation
from mmseg.apis import inference_segmentor, init_segmentor
config_file = 'configs/segformer/segformer_mit-b5_8xb2-160k_ade20k-512x512.py'
checkpoint_file = 'segformer_mit-b5_8x2_512x512_160k_ade20k_20220617_203542-745f14da.pth'
model = init_segmentor(config_file, checkpoint_file, device='cuda:0')
result = inference_segmentor(model, 'test_image.jpg')
Kinetics - 视频分类
Kinetics 是 Google DeepMind 提供的视频动作识别基准。
- Kinetics-400:400 个动作类别,约 30 万个片段
- Kinetics-600:600 个类别,约 50 万个片段
- Kinetics-700:700 个类别
主要指标:Top-1、Top-5 精度(各片段的平均值)
CIFAR-10/100
小规模图像分类基准,常用于快速原型验证和论文验证。
import torch
import torchvision
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
# 加载并评估 CIFAR-10
def evaluate_cifar10(model, batch_size=128):
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010))
])
testset = torchvision.datasets.CIFAR10(
root='./data', train=False, download=True, transform=transform
)
testloader = DataLoader(testset, batch_size=batch_size, shuffle=False, num_workers=4)
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in testloader:
outputs = model(images)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100 * correct / total
print(f"CIFAR-10 精度: {accuracy:.2f}%")
return accuracy
3. NLP 基准
GLUE (General Language Understanding Evaluation)
GLUE 是纽约大学与 DeepMind 于 2018 年联合发布的 NLP 模型评估基准,由 9 个不同的语言理解任务组成。
GLUE 任务构成:
| 任务 | 说明 | 数据规模 | 指标 |
|---|---|---|---|
| CoLA | 语法性判断 | 8,551 | Matthews Corr. |
| SST-2 | 情感分类(正/负) | 67K | 精度 |
| MRPC | 句子语义等价性 | 3,700 | F1/精度 |
| STS-B | 句子相似度分数 | 7K | Pearson/Spearman |
| QQP | 问题相似性 | 400K | F1/精度 |
| MNLI | 自然语言推理(三分类) | 393K | 精度 |
| QNLI | 问答推理 | 105K | 精度 |
| RTE | 文本蕴含识别 | 2,500 | 精度 |
| WNLI | Winograd NLI | 634 | 精度 |
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import numpy as np
from sklearn.metrics import matthews_corrcoef, f1_score
def evaluate_glue_cola(model_name="bert-base-uncased"):
"""CoLA 任务评估(语法性判断)"""
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name, num_labels=2
)
dataset = load_dataset("glue", "cola")
val_data = dataset["validation"]
predictions = []
labels = []
model.eval()
import torch
for item in val_data:
inputs = tokenizer(
item['sentence'],
return_tensors='pt',
padding=True,
truncation=True,
max_length=128
)
with torch.no_grad():
outputs = model(**inputs)
pred = outputs.logits.argmax(dim=-1).item()
predictions.append(pred)
labels.append(item['label'])
mcc = matthews_corrcoef(labels, predictions)
print(f"CoLA Matthews Correlation: {mcc:.4f}")
return mcc
# SST-2(情感分类)
def evaluate_glue_sst2(model_name="textattack/bert-base-uncased-SST-2"):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
dataset = load_dataset("glue", "sst2")
val_data = dataset["validation"]
correct = 0
total = len(val_data)
model.eval()
import torch
for item in val_data:
inputs = tokenizer(
item['sentence'],
return_tensors='pt',
truncation=True,
max_length=128
)
with torch.no_grad():
outputs = model(**inputs)
pred = outputs.logits.argmax(dim=-1).item()
if pred == item['label']:
correct += 1
acc = correct / total
print(f"SST-2 精度: {acc:.4f}")
return acc
SuperGLUE
随着 GLUE 逐渐接近饱和状态(达到人类水平),2019 年出现了由更难任务组成的 SuperGLUE。
SuperGLUE 任务:
- BoolQ:是/否问答(9,427 条)
- CB:主张-前提蕴含(250 条,三分类)
- COPA:因果推理(1,000 条)
- MultiRC:多句阅读理解(9,693 条)
- ReCoRD:完形填空式阅读理解(120K 条)
- RTE:文本蕴含识别(5,749 条)
- WiC:词义消歧(9,600 条)
- WSC:Winograd 图式挑战(554 条)
人类基线:89.8 / GPT-4 级别模型:90+(超越人类水平)
SQuAD 1.1 & 2.0
SQuAD(Stanford Question Answering Dataset)是从维基百科段落中抽取问题答案的机器阅读理解基准。
- SQuAD 1.1:536 篇维基百科文章,107,785 个问答对。所有问题的答案都存在于段落之内
- SQuAD 2.0:SQuAD 1.1 + 新增 53,775 个无法回答的问题
评估指标:
- EM (Exact Match):预测答案与正确答案完全一致的比例
- F1 Score:词级别的部分匹配分数
from datasets import load_dataset
from transformers import pipeline
def evaluate_squad(model_name="deepset/roberta-base-squad2"):
"""SQuAD 2.0 评估"""
qa_pipeline = pipeline("question-answering", model=model_name)
dataset = load_dataset("squad_v2", split="validation")
em_scores = []
f1_scores = []
no_answer_correct = 0
no_answer_total = 0
for item in dataset.select(range(200)): # 为快速评估仅取 200 条
context = item['context']
question = item['question']
answers = item['answers']
result = qa_pipeline(question=question, context=context)
predicted = result['answer'].lower().strip()
has_answer = len(answers['text']) > 0
if not has_answer:
no_answer_total += 1
if result['score'] < 0.1: # 模型识别出无答案的情况
no_answer_correct += 1
em_scores.append(0)
f1_scores.append(0)
else:
gold_answers = [a.lower().strip() for a in answers['text']]
# 计算 EM
em = max(int(predicted == gold) for gold in gold_answers)
em_scores.append(em)
# 计算 F1
best_f1 = 0
for gold in gold_answers:
pred_tokens = set(predicted.split())
gold_tokens = set(gold.split())
common = pred_tokens & gold_tokens
if len(common) == 0:
f1 = 0
else:
precision = len(common) / len(pred_tokens)
recall = len(common) / len(gold_tokens)
f1 = 2 * precision * recall / (precision + recall)
best_f1 = max(best_f1, f1)
f1_scores.append(best_f1)
print(f"SQuAD 2.0 结果(样本 200 条):")
print(f" EM: {sum(em_scores)/len(em_scores)*100:.1f}%")
print(f" F1: {sum(f1_scores)/len(f1_scores)*100:.1f}%")
if no_answer_total > 0:
print(f" 无答案判断精度: {no_answer_correct/no_answer_total*100:.1f}%")
WMT - 机器翻译
WMT(Workshop on Machine Translation)是评估机器翻译模型的年度赛事,针对多个语言对(英-德、英-中、英-韩等)评估翻译质量。
主要评估指标:
- BLEU (Bilingual Evaluation Understudy):基于 n-gram 精度的自动评估
- COMET:与人类评估高度相关的神经网络指标
- chrF:字符级 n-gram F 分数
from datasets import load_dataset
import sacrebleu
def compute_bleu(predictions, references):
"""计算 BLEU 分数"""
bleu = sacrebleu.corpus_bleu(predictions, [references])
print(f"BLEU: {bleu.score:.2f}")
print(f"BP: {bleu.bp:.3f}")
print(f"Ratio: {bleu.sys_len/bleu.ref_len:.3f}")
return bleu.score
# 评估翻译模型
from transformers import MarianMTModel, MarianTokenizer
def evaluate_translation(src_texts, tgt_texts, model_name="Helsinki-NLP/opus-mt-en-ko"):
tokenizer = MarianTokenizer.from_pretrained(model_name)
model = MarianMTModel.from_pretrained(model_name)
predictions = []
for text in src_texts[:100]: # 100 条样本
inputs = tokenizer([text], return_tensors="pt", padding=True, truncation=True)
translated = model.generate(**inputs, max_length=512)
pred = tokenizer.decode(translated[0], skip_special_tokens=True)
predictions.append(pred)
bleu_score = compute_bleu(predictions, tgt_texts[:100])
return bleu_score
4. LLM 能力基准
MMLU (Massive Multitask Language Understanding)
MMLU 是加州大学伯克利分校的 Dan Hendrycks 于 2020 年发布的基准,通过涵盖 57 个学科领域的研究生水平选择题来评估 LLM 的知识与推理能力。
分领域构成:
- STEM:数学、物理、化学、计算机科学、工程学
- 人文学科:历史、哲学、法学、伦理学
- 社会科学:心理学、经济学、政治学、社会学
- 其他:医学、营养学、道德情景、专业会计
每道题均为四选一,总计约 14,000 道题。
各模型 MMLU 表现:
| 模型 | MMLU 分数 | 发布年份 |
|---|---|---|
| GPT-3 (175B) | 43.9% | 2020 |
| Gopher (280B) | 60.0% | 2021 |
| GPT-4 | 86.4% | 2023 |
| Claude 3 Opus | 86.8% | 2024 |
| Gemini Ultra | 90.0% | 2024 |
| GPT-4o | 88.7% | 2024 |
| 人类专家估计 | ~90% | - |
from datasets import load_dataset
import anthropic # 或 openai
def evaluate_mmlu(model_fn, subjects=None, num_few_shot=5):
"""MMLU 评估函数"""
if subjects is None:
subjects = ['abstract_algebra', 'anatomy', 'astronomy', 'college_mathematics']
results = {}
for subject in subjects:
dataset = load_dataset("lukaemon/mmlu", subject)
test_data = dataset['test']
dev_data = dataset['dev'] # 用于 few-shot 示例
correct = 0
total = 0
# 构建 Few-shot 提示词
few_shot_examples = ""
for i, item in enumerate(dev_data.select(range(num_few_shot))):
few_shot_examples += f"Q: {item['input']}\n"
few_shot_examples += f"(A) {item['A']} (B) {item['B']} (C) {item['C']} (D) {item['D']}\n"
few_shot_examples += f"Answer: {item['target']}\n\n"
for item in test_data:
prompt = few_shot_examples
prompt += f"Q: {item['input']}\n"
prompt += f"(A) {item['A']} (B) {item['B']} (C) {item['C']} (D) {item['D']}\n"
prompt += "Answer:"
response = model_fn(prompt)
# 从回答中提取 A/B/C/D
pred = response.strip()[0] if response.strip() else 'A'
if pred == item['target']:
correct += 1
total += 1
accuracy = correct / total
results[subject] = accuracy
print(f"{subject}: {accuracy:.3f} ({correct}/{total})")
overall = sum(results.values()) / len(results)
print(f"\n整体平均: {overall:.3f}")
return results
BIG-Bench (Beyond the Imitation Game Benchmark)
由 Google 主导的 BIG-Bench 由 204 个多样化任务组成,用于探索 LLM 的边界。它涵盖语言模型至今尚不擅长的创造性推理、常识、数学、代码等领域。
BIG-Bench Hard:23 个高难度任务,通过思维链(Chain-of-Thought)提示可大幅提升表现。
from lm_eval.api.task import Task
from lm_eval import evaluator
# 通过 lm-evaluation-harness 评估 BIG-Bench
results = evaluator.simple_evaluate(
model="hf",
model_args="pretrained=meta-llama/Llama-3.2-3B-Instruct",
tasks=["bigbench_causal_judgment", "bigbench_date_understanding"],
num_fewshot=3,
batch_size="auto"
)
print(results['results'])
HellaSwag - 常识推理
HellaSwag 是 2019 年发布的常识推理基准,要求从 4 个选项中选出故事的下一句最自然的续写。
from datasets import load_dataset
import torch
from transformers import AutoTokenizer, AutoModelForMultipleChoice
def evaluate_hellaswag(model_name="microsoft/deberta-v2-xxlarge"):
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForMultipleChoice.from_pretrained(model_name)
dataset = load_dataset("hellaswag", split="validation")
correct = 0
total = min(500, len(dataset)) # 快速评估
for item in dataset.select(range(total)):
context = item['ctx']
endings = item['endings']
label = int(item['label'])
# 将每个选项与上下文组合
choices = [context + " " + ending for ending in endings]
encoding = tokenizer(
[context] * 4,
choices,
return_tensors='pt',
padding=True,
truncation=True,
max_length=256
)
with torch.no_grad():
outputs = model(**{k: v.unsqueeze(0) for k, v in encoding.items()})
logits = outputs.logits
predicted = logits.argmax(dim=-1).item()
if predicted == label:
correct += 1
accuracy = correct / total
print(f"HellaSwag 精度: {accuracy:.4f}")
return accuracy
ARC (AI2 Reasoning Challenge)
ARC 是 AI2(Allen Institute for AI)发布的小学至高中水平科学问题基准。
- ARC-Easy:相对简单的问题(5,197 条)
- ARC-Challenge:连基于检索的模型也会答错的高难度问题(1,172 条)
TruthfulQA - 真实性评估
TruthfulQA 评估模型对广为流传的迷信、误解、偏见等问题回答的准确程度。
from datasets import load_dataset
from transformers import pipeline
def evaluate_truthfulqa(model_name="gpt2-xl"):
"""TruthfulQA MC1(单一正确答案选择)评估"""
dataset = load_dataset("truthful_qa", "multiple_choice")
val_data = dataset["validation"]
generator = pipeline("text-generation", model=model_name)
correct = 0
total = min(100, len(val_data))
for item in val_data.select(range(total)):
question = item['question']
choices = item['mc1_targets']['choices']
labels = item['mc1_targets']['labels']
correct_idx = labels.index(1)
# 构建提示词
prompt = f"Q: {question}\nOptions:\n"
for i, choice in enumerate(choices):
letter = chr(65 + i) # A, B, C, ...
prompt += f"{letter}. {choice}\n"
prompt += "Answer:"
response = generator(prompt, max_new_tokens=5, do_sample=False)
generated = response[0]['generated_text'][len(prompt):].strip()
pred_letter = generated[0] if generated else 'A'
pred_idx = ord(pred_letter) - 65
if pred_idx == correct_idx:
correct += 1
accuracy = correct / total
print(f"TruthfulQA MC1 精度: {accuracy:.4f}")
return accuracy
GSM8K - 小学数学
GSM8K(Grade School Math 8K)是 OpenAI 于 2021 年发布的基准,由 8,500 道小学水平数学题组成。每道题均以自然语言描述,用于评估模型分步进行数学推理的能力。
from datasets import load_dataset
import re
def extract_number(text):
"""从文本中提取最终的数字答案"""
numbers = re.findall(r'-?\d+\.?\d*', text)
return numbers[-1] if numbers else None
def evaluate_gsm8k_chain_of_thought(model_fn, num_shot=8):
"""用 Chain-of-Thought 评估 GSM8K"""
dataset = load_dataset("gsm8k", "main")
test_data = dataset['test']
few_shot_prompt = """Q: Roger has 5 tennis balls. He buys 2 more cans of tennis balls.
Each can has 3 tennis balls. How many tennis balls does he have now?
A: Roger started with 5 balls. 2 cans × 3 balls = 6 balls. 5 + 6 = 11 balls. The answer is 11.
Q: The cafeteria had 23 apples. If they used 20 to make lunch and bought 6 more, how many do they have?
A: They started with 23. Used 20: 23 - 20 = 3. Then bought 6: 3 + 6 = 9. The answer is 9.
"""
correct = 0
total = min(200, len(test_data))
for item in test_data.select(range(total)):
question = item['question']
gold_answer = item['answer'].split('####')[-1].strip()
prompt = few_shot_prompt + f"Q: {question}\nA:"
response = model_fn(prompt, max_tokens=256)
pred = extract_number(response)
gold = extract_number(gold_answer)
if pred and gold and abs(float(pred) - float(gold)) < 0.01:
correct += 1
accuracy = correct / total
print(f"GSM8K 精度(Chain-of-Thought): {accuracy:.4f}")
return accuracy
HumanEval - 代码生成评估
HumanEval 是 OpenAI 于 2021 年发布的代码生成基准,给出 164 个 Python 函数签名与文档字符串,要求模型补全完整的函数。
评估指标: pass@k
在 k 次尝试中,至少通过一次测试的概率。
from datasets import load_dataset
import subprocess
import tempfile
import os
def evaluate_humaneval(model_fn, k=1, n=10, temperature=0.8):
"""HumanEval pass@k 评估"""
dataset = load_dataset("openai_humaneval")
test_data = dataset['test']
task_results = {}
for item in test_data.select(range(20)): # 仅取 20 条快速评估
task_id = item['task_id']
prompt = item['prompt']
tests = item['test']
entry_point = item['entry_point']
passes = 0
for attempt in range(n):
code = model_fn(prompt, temperature=temperature)
# 执行代码并测试
full_code = prompt + code + "\n" + tests + f"\ncheck({entry_point})"
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
f.write(full_code)
tmp_path = f.name
try:
result = subprocess.run(
['python', tmp_path],
timeout=10,
capture_output=True,
text=True
)
if result.returncode == 0:
passes += 1
except subprocess.TimeoutExpired:
pass
finally:
os.unlink(tmp_path)
task_results[task_id] = passes / n
# 计算 pass@1
pass_at_1 = sum(task_results.values()) / len(task_results)
print(f"pass@1: {pass_at_1:.4f}")
return pass_at_1
# 主要模型 HumanEval 表现(截至 2025 年)
humaneval_scores = {
"GPT-3 (175B)": 0.0, # 以原始论文为准
"Codex (12B)": 0.288,
"GPT-4": 0.870,
"Claude 3.5 Sonnet": 0.900,
"DeepSeek-Coder-33B": 0.823,
"Llama 3.1 70B": 0.803,
}
MBPP - Python 编程
MBPP(Mostly Basic Python Problems)是 Google 发布的 974 道 Python 编程题,难度跨度比 HumanEval 更广。
from datasets import load_dataset
def evaluate_mbpp_sample():
"""探索 MBPP 数据集"""
dataset = load_dataset("mbpp")
test_data = dataset['test']
print("MBPP 样本问题:")
for item in test_data.select(range(3)):
print(f"\n任务 ID: {item['task_id']}")
print(f"问题: {item['text']}")
print(f"测试用例: {item['test_list'][:2]}")
print(f"参考代码:\n{item['code']}")
print("-" * 50)
5. LLM 综合评估
MT-Bench - 多轮对话评估
MT-Bench 是加州大学伯克利分校 LMSYS 团队开发的多轮对话评估基准,以 GPT-4 作为评判者,按 1-10 分打分。
8 个类别,每类 10 道题:
- Writing(写作)
- Roleplay(角色扮演)
- Reasoning(推理)
- Math(数学)
- Coding(编程)
- Extraction(信息提取)
- STEM
- Humanities
import json
from openai import OpenAI
def mt_bench_judge(question, answer, reference_answer=None):
"""用 GPT-4 评估 MT-Bench 答案"""
client = OpenAI()
system_prompt = """You are a helpful assistant that evaluates AI responses.
Rate the response on a scale of 1-10 based on: accuracy, relevance, completeness, and clarity.
Output format: Score: X/10\nRationale: [brief explanation]"""
user_prompt = f"""Question: {question}
AI Response: {answer}
{f'Reference Answer: {reference_answer}' if reference_answer else ''}
Please evaluate this response."""
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
temperature=0.0
)
judge_response = response.choices[0].message.content
print(f"评估结果:\n{judge_response}")
return judge_response
# FastChat 官方 MT-Bench 使用方法
# git clone https://github.com/lm-sys/FastChat
# python -m fastchat.llm_judge.gen_model_answer --model-path your-model
# python -m fastchat.llm_judge.gen_judgment --judge-model gpt-4
# python -m fastchat.llm_judge.show_result
LMSYS Chatbot Arena
Chatbot Arena 采用真实用户比较两个模型的回答、为更好的一方投票的方式。由于使用 ELO 评分系统,能够反映人类真实的偏好。
2025 年 3 月 ELO 排名前列的模型(仅供参考):
| 排名 | 模型 | ELO |
|---|---|---|
| 1 | GPT-4.5 | ~1370 |
| 2 | Gemini 2.0 Ultra | ~1360 |
| 3 | Claude 3.7 Sonnet | ~1350 |
| 4 | GPT-4o | ~1340 |
| 5 | Llama 3.3 70B | ~1250 |
HELM (Holistic Evaluation of Language Models)
由 Stanford CRFM 开发的 HELM,超越单纯的精度,综合评估以下 7 个维度:
- Accuracy(精度)
- Calibration(置信度校准)
- Robustness(鲁棒性)
- Fairness(公平性)
- Bias(偏见)
- Toxicity(毒性)
- Efficiency(效率)
# 运行 HELM 评估
pip install crfm-helm
# 基础评估(mmlu + summarization + qa)
helm-run \
--conf src/helm/benchmark/presentation/run_specs_lite.conf \
--local \
--max-eval-instances 1000 \
--num-train-trials 1
# 查看结果
helm-summarize --suite v1
helm-server
Open LLM Leaderboard (HuggingFace)
HuggingFace 的 Open LLM Leaderboard 是以统一标准评估开源 LLM 的公开排行榜。
评估任务:
- MMLU (5-shot)
- ARC Challenge (25-shot)
- HellaSwag (10-shot)
- TruthfulQA (0-shot)
- Winogrande (5-shot)
- GSM8K (5-shot)
# 用 huggingface_hub 获取排行榜数据
from huggingface_hub import HfApi
import pandas as pd
def fetch_leaderboard_data():
"""获取 Open LLM Leaderboard 数据"""
api = HfApi()
# 排行榜数据集
dataset_info = api.dataset_info("open-llm-leaderboard/results")
print(f"最后更新: {dataset_info.lastModified}")
# 结果文件列表
files = api.list_repo_files(
repo_id="open-llm-leaderboard/results",
repo_type="dataset"
)
model_results = []
for f in list(files)[:5]: # 仅取前 5 个
print(f"文件: {f}")
return model_results
6. 韩语基准
KLUE (Korean Language Understanding Evaluation)
KLUE 是韩国电子通信研究院(ETRI)等机构于 2021 年联合开发的韩语自然语言理解基准,由 8 个任务组成。
KLUE 任务:
| 任务 | 类型 | 数据规模 | 指标 |
|---|---|---|---|
| TC (Topic Classification) | 文档分类 | 60K | 精度 |
| STS (Semantic Textual Similarity) | 句子相似度 | 13K | Pearson |
| NLI (Natural Language Inference) | 自然语言推理 | 30K | 精度 |
| NER (Named Entity Recognition) | 命名实体识别 | 21K | Entity F1 |
| RE (Relation Extraction) | 关系抽取 | 32K | micro-F1 |
| DP (Dependency Parsing) | 依存句法分析 | 23K | UAS/LAS |
| MRC (Machine Reading Comprehension) | 机器阅读理解 | 24K | EM/F1 |
| DST (Dialogue State Tracking) | 对话状态跟踪 | 10K | JGA |
from datasets import load_dataset
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
def evaluate_klue_nli(model_name="klue/roberta-large"):
"""KLUE-NLI 评估"""
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name, num_labels=3
)
dataset = load_dataset("klue", "nli")
val_data = dataset['validation']
label_map = {0: "entailment", 1: "neutral", 2: "contradiction"}
correct = 0
total = min(500, len(val_data))
model.eval()
for item in val_data.select(range(total)):
premise = item['premise']
hypothesis = item['hypothesis']
gold_label = item['label']
inputs = tokenizer(
premise, hypothesis,
return_tensors='pt',
truncation=True,
max_length=512
)
with torch.no_grad():
outputs = model(**inputs)
pred = outputs.logits.argmax(dim=-1).item()
if pred == gold_label:
correct += 1
accuracy = correct / total
print(f"KLUE-NLI 精度: {accuracy:.4f}")
return accuracy
def evaluate_klue_mrc(model_name="klue/roberta-large"):
"""KLUE-MRC(机器阅读理解)评估"""
from transformers import AutoModelForQuestionAnswering, pipeline
qa_pipeline = pipeline(
"question-answering",
model=model_name,
tokenizer=model_name
)
dataset = load_dataset("klue", "mrc")
val_data = dataset['validation']
em_scores = []
f1_scores = []
for item in val_data.select(range(100)):
context = item['context']
question = item['question']
answers = item['answers']['text']
result = qa_pipeline(question=question, context=context)
predicted = result['answer'].strip()
# EM
em = max(int(predicted == a) for a in answers)
em_scores.append(em)
# F1
best_f1 = 0
for gold in answers:
pred_chars = set(predicted)
gold_chars = set(gold)
common = pred_chars & gold_chars
if common:
precision = len(common) / len(pred_chars)
recall = len(common) / len(gold_chars)
f1 = 2 * precision * recall / (precision + recall)
best_f1 = max(best_f1, f1)
f1_scores.append(best_f1)
print(f"KLUE-MRC EM: {sum(em_scores)/len(em_scores)*100:.1f}%")
print(f"KLUE-MRC F1: {sum(f1_scores)/len(f1_scores)*100:.1f}%")
KoBEST
KoBEST(Korean Balanced Evaluation of Significant Tasks)是 KAIST 开发的韩语基准,包含 5 个任务:
- BoolQ:是/否问答
- COPA:因果推理
- WiC:词义消歧
- HellaSwag:常识续写
- SentiNeg:负面情感理解
KMMLU (韩语版 MMLU)
KMMLU 是把 MMLU 扩展到韩语的基准,除了英语 MMLU 各科目的韩语译本外,还包含韩语特有科目(韩国历史、韩国法律、韩国医学)。
from datasets import load_dataset
def evaluate_kmmlu_sample():
"""探索 KMMLU 样本"""
# 加载 KMMLU(2024 年公开)
dataset = load_dataset("HAERAE-HUB/KMMLU")
test_data = dataset['test']
print(f"总题目数: {len(test_data)}")
subjects = set(test_data['subject'])
print(f"科目数: {len(subjects)}")
print(f"样本科目: {list(subjects)[:10]}")
# 输出第一道题
item = test_data[0]
print(f"\n科目: {item['subject']}")
print(f"问题: {item['question']}")
print(f"A: {item['A']}")
print(f"B: {item['B']}")
print(f"C: {item['C']}")
print(f"D: {item['D']}")
print(f"正确答案: {item['answer']}")
7. 多模态基准
VQA (Visual Question Answering)
VQA 是根据图像回答自然语言问题的任务。
- VQA v2:约 110 万个(图像、问题、答案)三元组。每张图像配有两个互补问题
- 评估指标:Accuracy = min(answers/3, 1) — 10 名标注者中有多少人意见一致
from datasets import load_dataset
from transformers import BlipProcessor, BlipForQuestionAnswering
import torch
from PIL import Image
def evaluate_vqa_blip():
"""用 BLIP 评估 VQA"""
processor = BlipProcessor.from_pretrained("Salesforce/blip-vqa-base")
model = BlipForQuestionAnswering.from_pretrained("Salesforce/blip-vqa-base")
model.eval()
# VQA v2 验证数据(需要本地图像路径)
questions = [
("What color is the car?", "test_car.jpg"),
("How many people are in the image?", "test_crowd.jpg"),
("Is it raining?", "test_outdoor.jpg")
]
for question, image_path in questions:
try:
image = Image.open(image_path).convert('RGB')
inputs = processor(image, question, return_tensors="pt")
with torch.no_grad():
out = model.generate(**inputs, max_length=20)
answer = processor.decode(out[0], skip_special_tokens=True)
print(f"Q: {question}")
print(f"A: {answer}\n")
except FileNotFoundError:
print(f"图像不存在: {image_path}")
MMBench
MMBench 是上海人工智能实验室发布的多模态 LLM 评估基准,覆盖 20 个能力维度,包含 3,000 道选择题。
评估维度(示例):
- Attribute Recognition(属性识别)
- Spatial Relationship(空间关系)
- Action Recognition(行为识别)
- OCR(光学字符识别)
- Commonsense Reasoning(常识推理)
MMMU (Massive Multidiscipline Multimodal Understanding)
MMMU 是评估大学水平多模态理解能力的基准,涵盖 6 个核心领域(Art、Science、Engineering、Medicine、Technology、Humanities)的 30 个科目,共 11,550 道题。
from datasets import load_dataset
def explore_mmmu():
"""探索 MMMU 数据集"""
dataset = load_dataset("MMMU/MMMU", "Accounting")
print(f"Accounting 任务验证数据: {len(dataset['validation'])} 道题")
item = dataset['validation'][0]
print(f"\n问题: {item['question']}")
print(f"选项 A: {item['option_A']}")
print(f"选项 B: {item['option_B']}")
print(f"正确答案: {item['answer']}")
# 检查是否含图像
if item['image_1']:
print("含图像题目")
# 评估多模态模型(例如 LLaVA)
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
def evaluate_mmmu_with_llava(model_name="llava-hf/llava-v1.6-mistral-7b-hf"):
processor = LlavaNextProcessor.from_pretrained(model_name)
model = LlavaNextForConditionalGeneration.from_pretrained(
model_name, torch_dtype="auto", device_map="auto"
)
dataset = load_dataset("MMMU/MMMU", "Accounting", split="validation")
correct = 0
total = min(50, len(dataset))
for item in dataset.select(range(total)):
question = item['question']
options = [item.get(f'option_{c}', '') for c in 'ABCDE' if item.get(f'option_{c}')]
gold = item['answer']
if item['image_1']:
image = item['image_1']
prompt = f"[INST] [IMG]\nQuestion: {question}\nOptions: {options}\nAnswer with only the option letter. [/INST]"
inputs = processor(prompt, image, return_tensors='pt').to(model.device)
else:
prompt = f"[INST] Question: {question}\nOptions: {options}\nAnswer with only the option letter. [/INST]"
inputs = processor(prompt, return_tensors='pt').to(model.device)
with torch.no_grad():
output = model.generate(**inputs, max_new_tokens=10)
response = processor.decode(output[0], skip_special_tokens=True)
pred = response[-1].upper() if response else 'A'
if pred == gold:
correct += 1
acc = correct / total
print(f"MMMU-Accounting 精度: {acc:.3f}")
return acc
8. LM-Evaluation-Harness 使用方法
EleutherAI 的 lm-evaluation-harness 是 LLM 评估的标准工具,支持 100 多个基准。
安装与基本用法
# 安装
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
# 评估 MMLU(GPT-2)
lm_eval --model hf \
--model_args pretrained=gpt2 \
--tasks mmlu \
--num_fewshot 5 \
--batch_size 8 \
--output_path results/gpt2_mmlu
# 同时评估多个任务
lm_eval --model hf \
--model_args pretrained=meta-llama/Llama-3.2-3B-Instruct \
--tasks mmlu,arc_challenge,hellaswag,truthfulqa_mc1,gsm8k \
--num_fewshot 5 \
--batch_size 4 \
--output_path results/llama3.2_3b
# HuggingFace 模型(以 4 比特量化运行)
lm_eval --model hf \
--model_args pretrained=meta-llama/Meta-Llama-3-8B,load_in_4bit=True \
--tasks mmlu \
--num_fewshot 5 \
--batch_size 1
使用 Python API
import lm_eval
from lm_eval import evaluator, utils
from lm_eval.models.huggingface import HFLM
def run_comprehensive_evaluation(model_path, output_dir="./results"):
"""LM-Evaluation-Harness 综合评估"""
import os
os.makedirs(output_dir, exist_ok=True)
# 定义要评估的任务
task_groups = {
"knowledge": ["mmlu", "arc_challenge", "arc_easy"],
"reasoning": ["hellaswag", "winogrande", "piqa"],
"truthfulness": ["truthfulqa_mc1"],
"math": ["gsm8k"],
"coding": ["humaneval"],
}
all_results = {}
for group, tasks in task_groups.items():
print(f"\n=== 正在评估 {group.upper()} ===")
results = evaluator.simple_evaluate(
model="hf",
model_args=f"pretrained={model_path}",
tasks=tasks,
num_fewshot={"mmlu": 5, "arc_challenge": 25, "hellaswag": 10,
"truthfulqa_mc1": 0, "gsm8k": 5, "winogrande": 5,
"piqa": 0, "humaneval": 0, "arc_easy": 25}.get(tasks[0], 0),
batch_size="auto",
device="cuda" if __import__("torch").cuda.is_available() else "cpu",
)
all_results[group] = results['results']
# 输出结果
for task, metrics in results['results'].items():
if 'acc,none' in metrics:
print(f" {task}: {metrics['acc,none']*100:.1f}%")
elif 'exact_match,strict-match' in metrics:
print(f" {task}: {metrics['exact_match,strict-match']*100:.1f}%")
# 保存综合结果
import json
with open(f"{output_dir}/evaluation_results.json", "w", encoding="utf-8") as f:
json.dump(all_results, f, ensure_ascii=False, indent=2)
print(f"\n结果已保存: {output_dir}/evaluation_results.json")
return all_results
def compare_models(model_paths, tasks=None):
"""比较多个模型"""
if tasks is None:
tasks = ["mmlu", "arc_challenge", "hellaswag", "gsm8k"]
comparison = {}
for model_path in model_paths:
print(f"\n正在评估: {model_path}")
results = evaluator.simple_evaluate(
model="hf",
model_args=f"pretrained={model_path}",
tasks=tasks,
num_fewshot=5,
batch_size="auto"
)
model_scores = {}
for task, metrics in results['results'].items():
for metric, value in metrics.items():
if isinstance(value, (int, float)) and not metric.endswith('_stderr'):
model_scores[f"{task}/{metric}"] = round(value * 100, 2)
comparison[model_path.split('/')[-1]] = model_scores
# 输出比较表
print("\n" + "="*80)
print("模型比较结果:")
print("="*80)
all_metrics = sorted(set().union(*[s.keys() for s in comparison.values()]))
header = f"{'指标':<40}" + "".join(f"{m[:15]:<18}" for m in comparison.keys())
print(header)
print("-" * 80)
for metric in all_metrics:
if 'acc,none' in metric or 'exact_match' in metric:
row = f"{metric:<40}"
for model_name in comparison:
score = comparison[model_name].get(metric, "N/A")
row += f"{score:<18}"
print(row)
return comparison
添加自定义任务
# custom_task.py
from lm_eval.api.task import Task, TaskConfig
from lm_eval.api.instance import Instance
class KoreanQATask(Task):
"""韩语 QA 自定义任务"""
VERSION = 1.0
DATASET_PATH = "your-org/korean-qa-dataset"
DATASET_NAME = None
def has_training_docs(self):
return False
def has_validation_docs(self):
return True
def has_test_docs(self):
return True
def validation_docs(self):
return self.dataset["validation"]
def test_docs(self):
return self.dataset["test"]
def doc_to_text(self, doc):
return f"질문: {doc['question']}\n답변:"
def doc_to_target(self, doc):
return " " + doc['answer']
def construct_requests(self, doc, ctx):
return [Instance(
request_type="generate_until",
doc=doc,
arguments=(ctx, {"until": ["\n", "질문:"]}),
idx=0
)]
def process_results(self, doc, results):
gold = doc['answer'].lower().strip()
pred = results[0].lower().strip()
return {"exact_match": int(gold == pred)}
def aggregation(self):
return {"exact_match": "mean"}
def higher_is_better(self):
return {"exact_match": True}
结语
AI 基准数据集在 AI 研究与开发中起到了指南针的作用。主要内容总结如下:
计算机视觉:
- ImageNet:1,000 类分类的黄金标准
- COCO:目标检测与分割的标准
- ADE20K:语义分割的主要基准
NLP:
- GLUE/SuperGLUE:语言理解能力综合评估
- SQuAD:机器阅读理解的标准基准
LLM 能力:
- MMLU:57 个领域的知识评估(覆盖范围最广)
- HumanEval:代码生成能力评估
- GSM8K:数学推理能力
综合评估:
- HELM:7 个维度的均衡评估
- Chatbot Arena:基于真实人类偏好的 ELO
- Open LLM Leaderboard:开源 LLM 比较
韩语:
- KLUE:8 个任务的韩语理解评估
- KMMLU:韩语知识能力评估
解读基准时,始终要记住数据集污染的可能性、测量偏差、以及与实际使用环境之间的差距。相比依赖单一基准,从多个维度进行综合评估,更能反映模型的真实能力。
参考资料
현재 단락 (1/965)
1. [AI 基准的重要性](#1-ai-基准的重要性)