Skip to content
Published on

AI 基准数据集完全指南:ImageNet、COCO、GLUE、MMLU、HumanEval

分享
Authors

目录

  1. AI 基准的重要性
  2. 计算机视觉基准
  3. NLP 基准
  4. LLM 能力基准
  5. LLM 综合评估
  6. 韩语基准
  7. 多模态基准
  8. LM-Evaluation-Harness 使用方法

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 错误率
2010NEC-UIUC28.2%
2012AlexNet15.3%
2014VGG-167.3%
2015ResNet-1523.57%
2017SENet2.25%
2021CoAtNet0.95%
2023ViT-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)参数量
YOLOv8x53.9-68M
DINO (Swin-L)63.3-218M
Co-DINO (Swin-L)64.154.0218M
InternImage-H65.456.12.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,551Matthews Corr.
SST-2情感分类(正/负)67K精度
MRPC句子语义等价性3,700F1/精度
STS-B句子相似度分数7KPearson/Spearman
QQP问题相似性400KF1/精度
MNLI自然语言推理(三分类)393K精度
QNLI问答推理105K精度
RTE文本蕴含识别2,500精度
WNLIWinograd NLI634精度
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-486.4%2023
Claude 3 Opus86.8%2024
Gemini Ultra90.0%2024
GPT-4o88.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
1GPT-4.5~1370
2Gemini 2.0 Ultra~1360
3Claude 3.7 Sonnet~1350
4GPT-4o~1340
5Llama 3.3 70B~1250

HELM (Holistic Evaluation of Language Models)

由 Stanford CRFM 开发的 HELM,超越单纯的精度,综合评估以下 7 个维度:

  1. Accuracy(精度)
  2. Calibration(置信度校准)
  3. Robustness(鲁棒性)
  4. Fairness(公平性)
  5. Bias(偏见)
  6. Toxicity(毒性)
  7. 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)句子相似度13KPearson
NLI (Natural Language Inference)自然语言推理30K精度
NER (Named Entity Recognition)命名实体识别21KEntity F1
RE (Relation Extraction)关系抽取32Kmicro-F1
DP (Dependency Parsing)依存句法分析23KUAS/LAS
MRC (Machine Reading Comprehension)机器阅读理解24KEM/F1
DST (Dialogue State Tracking)对话状态跟踪10KJGA
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:韩语知识能力评估

解读基准时,始终要记住数据集污染的可能性、测量偏差、以及与实际使用环境之间的差距。相比依赖单一基准,从多个维度进行综合评估,更能反映模型的真实能力。


参考资料