Chapter 08

推理模型评估:基准与自定义测试

不会评估的模型选型是瞎猜。理解主流基准的含义,构建贴近业务的自定义评估体系。

主流推理基准解读

MATH(Hendrycks et al.)
12500 道竞赛数学题,覆盖代数、几何、概率、数论等 7 个子领域,难度分 5 级。MATH-500 是精选的 500 题子集,是目前最标准的数学推理基准。
AIME(美国数学邀请赛)
美国高中数学竞赛,每题答案为 0-999 的整数。极高难度,人类平均分约 5/15。o1 在 AIME 2024 上达到 83%,是标志性突破指标。
GSM8K(小学数学)
8500 道小学水平数学应用题,较简单。现代大模型基本接近满分,不再有区分度,主要用于基础能力验证。
HumanEval / MBPP
164 / 374 道 Python 编程题,用单元测试验证答案正确性。HumanEval+ 是更严格的扩展版。代码推理能力的核心基准。
GPQA Diamond
448 道博士级科学题(物理、化学、生物),由领域专家设计,普通人准确率约 34%。推理模型在此基准上首次超越专家(~74%)。

pass@k 采样策略

对于有确定性答案的任务,pass@k 是评估"在 k 次机会内至少答对一次"的概率:

import numpy as np

def estimate_pass_at_k(n: int, c: int, k: int) -> float:
    """
    n: 总采样次数
    c: 正确答案数量
    k: 给定的机会数
    返回: pass@k 估计值
    """
    if n - c < k:
        return 1.0
    return 1.0 - np.prod(1.0 - k / np.arange(n - c + 1, n + 1))

# 示例:10 次采样中 4 次正确
print(f"pass@1: {estimate_pass_at_k(10, 4, 1):.2%}")  # 40%
print(f"pass@3: {estimate_pass_at_k(10, 4, 3):.2%}")  # 约 73.3%

# 实际评估流程
def evaluate_with_pass_at_k(problems: list, model_fn, n_samples=8, k=1):
    results = []
    for problem in problems:
        outputs = [model_fn(problem) for _ in range(n_samples)]
        correct = sum(verify_answer(problem, o) for o in outputs)
        results.append(estimate_pass_at_k(n_samples, correct, k))
    return sum(results) / len(results)

LLM-as-Judge:评估开放性回答

def llm_judge(
    question: str,
    reference_answer: str,
    model_answer: str
) -> dict:
    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=512,
        system="""你是一个客观的 AI 答案评判者。
评估标准:1-10 分。输出 JSON:
{"score": 分数, "correctness": 0-10, "completeness": 0-10, "reason": "评分理由"}""",
        messages=[{"role": "user", "content": f"""
问题:{question}
参考答案:{reference_answer}
被评估的答案:{model_answer}"""}]
    )
    return json.loads(response.content[0].text)

# 批量评估
def batch_evaluate(test_cases: list, model_fn) -> dict:
    scores = []
    for case in test_cases:
        answer = model_fn(case["question"])
        judgment = llm_judge(case["question"], case["reference"], answer)
        scores.append(judgment["score"])
    return {
        "mean_score": sum(scores) / len(scores),
        "median_score": sorted(scores)[len(scores) // 2],
        "scores": scores
    }

构建业务自定义评估集

  • 收集真实案例 — 从生产环境收集 100-200 个典型查询(涵盖简单/中等/困难)
  • 人工标注标准答案 — 由领域专家撰写"理想回答"作为 reference
  • 定义评估维度 — 准确性、完整性、格式规范性、安全性(根据业务定制)
  • 版本化测试集 — 将评估集纳入版本控制,每次模型更新都跑全量评估
  • 设置阈值警报 — 关键指标低于阈值时阻止部署
  • 基准污染风险 公开基准(GSM8K、HumanEval)的训练数据泄露问题严重。当你看到模型在这些基准上得高分时,不代表实际业务性能也同样优秀。始终以自己的业务评估集为最终判断标准。
    本章小结 公开基准了解模型相对能力,业务自定义评估集决定实际价值。pass@k 用于代码/数学,LLM-as-Judge 用于开放性回答。下一章进入成本控制策略。