评估


文档摘要

评估 本节摘要:Goodhart 定律:当度量变成目标,它就不再是好度量。每个前沿实验室都在刷基准——MMLU 分数涨,模型却还数不清「strawberry」里有几个 r。唯一重要的评估是你的评估——在你的任务、你的数据上。本节带你搭一个自定义评估框架:理解为什么 MMLU、HumanEval 会饱和失效;实现精确匹配、token F1、LLM-as-judge、困惑度;用 ELO 评分(Chatbot Arena 那套)从两两比对给模型排名。你会学会数据污染、教应试、饱和这三个让基准失真的机制,以及为什么生产评估必须匹配部署条件。 学习目标 阅读完本节,你应当能够: 构建自定义评估框架,对语言模型跑多选与开放式基准。

评估

本节摘要:Goodhart 定律:当度量变成目标,它就不再是好度量。每个前沿实验室都在刷基准——MMLU 分数涨,模型却还数不清「strawberry」里有几个 r。唯一重要的评估是你的评估——在你的任务、你的数据上。本节带你搭一个自定义评估框架:理解为什么 MMLU、HumanEval 会饱和失效;实现精确匹配、token F1、LLM-as-judge、困惑度;用 ELO 评分(Chatbot Arena 那套)从两两比对给模型排名。你会学会数据污染、教应试、饱和这三个让基准失真的机制,以及为什么生产评估必须匹配部署条件。

学习目标

阅读完本节,你应当能够:

  1. 构建自定义评估框架,对语言模型跑多选与开放式基准。
  2. 解释为什么标准基准(MMLU、HumanEval)会饱和、无法区分前沿模型。
  3. 实现任务特定评估与正确指标:精确匹配、F1、BLEU、LLM-as-judge 评分。
  4. 设计针对具体用例的自定义评估套件,而非只依赖公开排行榜。

一、问题与直觉

MMLU 2020 年发表,57 科目 15,908 题。三年内前沿模型就饱和了——GPT-4 86.4%,Claude 3 Opus 86.8%,Llama 3 405B 88.6%。排行榜压缩到 3 分区间,差异是统计噪声而非真实能力差距。

同时,这些模型在 10 岁孩子毫不费力的任务上失败。Claude 3.5 Sonnet 在 MMLU 上 88.7%,起初却数不清「strawberry」里的字母——这任务零世界知识、零推理,只需字符级迭代。HumanEval 用 164 题测代码生成,模型 90%+ 得分却仍产出任何初级开发者都能抓住的边界崩溃代码。

基准性能与现实可靠性的鸿沟,是 LLM 评估的核心问题。基准告诉你模型在基准上表现如何,却几乎不说它在你具体任务、你具体数据、你具体失败模式下会怎样。做客服机器人,MMLU 无关;做代码助手,HumanEval 只覆盖函数级生成,不涉调试、重构、跨文件解释。你需要自定义评估——不是基准没用(粗选模型有用),而是最终评估必须精确匹配部署条件。

评估全景

三类评估,成本与信号质量各异。基准是标准化测试套件(MMLU、HumanEval、SWE-bench、MATH、ARC、HellaSwag),人人用同一测试可比模型,但模型与训练数据日益污染这些基准——实验室在含基准题的数据上训,分数涨能力未必涨。自定义评估是你为具体用例建的测试套件——定义输入、期望输出、打分函数;法律文档摘要在法律文档上评,SQL 生成器在你的库模式上评,贵但唯一能预测生产表现。人类评估用付费标注员判模型输出的有用性、正确性、流畅性、安全性——开放式任务自动打分失效时的金标准;Chatbot Arena 已收超 200 万人类偏好投票,100+ 模型;代价是成本(每次判断 0.10~2.00 美元)与速度(几小时到几天)。

基准为何失真

三个机制让基准分不再反映真实能力。数据污染:训练语料爬网,基准题在网上,模型训练时见过答案——不算传统作弊(实验室不故意含基准数据),但网规模爬取使排除几乎不可能。教应试:实验室为基准性能优化训练配比,若训练混合 5% 是 MMLU 风格多选,模型学格式和答案分布(MMLU 是四选一,模型学到答案大致均匀分布在 A/B/C/D,即使不知答案也有帮助)。饱和:当前沿模型都 8590% 时,基准停止区分,剩 1015% 的题可能含糊、错标或需冷门领域知识,从 87% 升到 89% 可能只是多背了两道冷门题,不是变聪明。

困惑度:快速健康检查

困惑度度量模型对一段 token 序列有多「意外」,形式上是指数化的平均负对数似然:PPL = exp(-1/N * sum(log P(token_i | 上下文)))。困惑度 10 意味模型平均每 token 位置像在 10 个选项里均匀选。越低越好:GPT-2 在 WikiText-103 约 30,GPT-3 约 20,Llama 3 8B 约 7。困惑度适合在同测试集上比模型,但有盲区——模型可凭善预测常见模式得低困惑度,却在罕见但重要的模式上糟糕;它也不涉指令遵循、推理、事实准确。当 sanity check 用,别当最终裁决。

LLM-as-judge

用强模型评估弱模型输出:让 GPT-4o 或 Claude Sonnet 给响应按正确性、有用性、安全性打 1~5 分。GPT-4o-mini 每次约 0.01 美元,与人类判断相关性惊人——多数任务约 80% 一致。打分提示比模型更重要:模糊提示(「给这响应打分」)产出噪声分;带评分细则的结构化提示(「5 分=事实正确且引来源,4=正确无源,3=部分正确...」)产出一致可复现分。失败模式:判官模型有位置偏见(配对比对里偏好第一个)、冗长偏见(偏好更长)、自偏好(GPT-4 给 GPT-4 输出打分高于等价 Claude 输出)。缓解:随机化顺序、按长度归一、用与被评模型不同的判官。

ELO 评分

Chatbot Arena 的方法:给同一提示的两个不同模型响应,让人(或 LLM 判官)挑更好的。从数千次比对算每个模型的 ELO 分(国际象棋那套)。ELO 优势:相对排名比绝对打分更可靠、优雅处理平手、收敛所需比对少于独立打分每个输出。2026 年初 Chatbot Arena 排名显示 GPT-4o、Claude 3.5 Sonnet、Gemini 1.5 Pro 顶部彼此在 20 ELO 分内。

构建自定义评估

唯一对生产重要的评估。流程:(1) 定义任务——精确说模型该做什么,「回答问题」太模糊,「给定客户投诉邮件,抽取产品名、问题类别、情感」是可评估的;(2) 造测试用例——原型至少 50 个,生产 200+,每个是(输入,期望输出)对,含边界(空输入、对抗输入、含糊输入、其他语言);(3) 定义打分——结构化输出用精确匹配,文本相似用 BLEU/ROUGE,开放式质量用 LLM-as-judge,抽取任务用 F1,多指标加权组合;(4) 自动化——一条命令跑完,无手动步骤;(5) 追踪——单个分无意义,要趋势线,提示改了分升了吗?换模型退步了吗?评估与提示一起版本化。

评估类型 每次判断成本 与人类一致率 最适合
精确匹配 ~0 100%(适用时) 结构化输出、分类
BLEU/ROUGE ~0 ~60% 翻译、摘要
LLM-as-judge ~0.01 ~80% 开放式生成
人类评估 0.10~2.00 不适用(是真理) 含糊、高风险任务

二、从零实现

Step 1:最小评估框架

定义核心抽象:评估用例有输入、期望输出、可选元信息;打分器取预测与参考返回 0~1 分。

class EvalCase: def __init__(self, input_text, expected, metadata=None): self.input_text, self.expected, self.metadata = input_text, expected, metadata or {} class EvalSuite: def __init__(self, name, cases, scorers): self.name, self.cases, self.scorers = name, cases, scorers def run(self, model_fn): results = [] for case in self.cases: pred = model_fn(case.input_text) scores = {n: f(pred, case.expected) for n, f in self.scorers.items()} results.append({"input":case.input_text,"expected":case.expected,"prediction":pred,"scores":scores}) return results

Step 2:打分函数

def exact_match(pred, exp): return 1.0 if pred.strip().lower()==exp.strip().lower() else 0.0 def token_f1(pred, exp): pt, et = set(pred.lower().split()), set(exp.lower().split()) if not pt or not et: return 0.0 common = pt & et p, r = len(common)/len(pt), len(common)/len(et) return 2*p*r/(p+r) if p+r else 0.0 def llm_judge_simulated(pred, exp): overlap = len(set(pred.lower().split()) & set(exp.lower().split())) / max(len(set(exp.lower().split())),1) length_pen = min(1.0, len(pred)/max(len(exp),1)) return round(overlap*0.7 + length_pen*0.3, 3)

Step 3:ELO 评分系统

实现配对比对与 ELO 更新,正是 Chatbot Arena 用来给模型排名的那套。

class ELOTracker: def __init__(self, k=32, initial=1500): self.ratings, self.k, self.initial = {}, k, initial def expected_score(self, ra, rb): return 1/(1+10**((rb-ra)/400)) def record_match(self, a, b, outcome): # outcome: "a"/"b"/"tie" self.ratings.setdefault(a, self.initial); self.ratings.setdefault(b, self.initial) ea = self.expected_score(self.ratings[a], self.ratings[b]) sa = {"a":1.0,"b":0.0,"tie":0.5}[outcome] self.ratings[a] += self.k*(sa-ea); self.ratings[b] += self.k*((1-sa)-(1-ea)) def leaderboard(self): return sorted(self.ratings.items(), key=lambda x:-x[1])

Step 4:困惑度计算

用 token 概率算困惑度(实践中从模型 logits 取),这里用概率分布模拟。

def perplexity(log_probs): return float(np.exp(-np.mean(log_probs))) if log_probs else float("inf")

Step 5:汇总结果

算跨评估运行的汇总统计:均值、中位、阈值通过率、各指标细分。

三、框架对比

lm-evaluation-harness(EleutherAI)

标准开源评估框架,200+ 基准,一行命令跑任意 HF 模型:

# lm_eval --model hf --model_args pretrained=meta-llama/Llama-3.1-8B --tasks mmlu --batch_size 8

Open LLM Leaderboard 用它。

promptfoo

配置驱动的提示工程评估,YAML 定义测试,跨多 provider 跑,适合提示回归测试。

providers: [openai:gpt-4o-mini, anthropic:claude-3-haiku] tests: - vars: {question: "法国首都?"} assert: [{type: contains, value: "巴黎"}]

RAGAS

RAG 专用,测忠实度(答案是否基于检索上下文)、相关性(检索上下文是否相关)、答案正确性——抓通用评估漏掉的东西。

四、可复用产物

本节产出两个文件:outputs/prompt-eval-designer.md(为任意任务设计自定义评估套件的提示)和 outputs/skill-llm-evaluation.md(按任务类型、预算、延迟要求选评估策略的决策框架)。

五、练习

  1. (Easy) 加一个「一致性」打分器:同一输入跑模型 5 次,度量输出匹配频率。确定性输入上不一致揭示脆弱提示或高温度。

  2. (Medium) 扩展 ELO 跟踪器支持多判官函数(精确匹配、F1、LLM-judge)并加权,对比重精确匹配 vs 重 F1 时排行榜如何变。

  3. (Medium) 为具体任务(邮件分 5 类)建评估套件:100 测试用例含边界(多类别邮件、空邮件、外语邮件),测不同「模型」(规则、关键词、模拟 LLM)表现。

  4. (Hard) 实现污染检测:给定评估题与训练语料,查多少评估题(或近似改写)出现在训练数据里——这是研究者审计基准有效性的方法。

  5. (Hard) 构建「模型 diff」工具:给定两版模型的评估结果,高亮哪些测试用例改善、退步、不变——评估版代码 diff,理解改动利弊的关键。

本节要点回顾

  1. Goodhart 定律:度量变目标就失效,前沿模型刷 MMLU 却数不清 strawberry 的 r。
  2. 三类评估:基准(便宜、可比、可污染)、自定义(最贵、最高信号)、人类(金标准、慢贵)。
  3. 基准失真三机制:数据污染(爬网带到训练集)、教应试(优化训练配比)、饱和(都 85~90% 失区分力)。
  4. 困惑度是 sanity check:exp(平均负对数似然),越低越好,但不涉指令遵循/推理/事实,别当裁决。
  5. LLM-as-judge 提示比模型重要:带评分细则的结构化提示产一致分,模糊提示产噪声。
  6. 判官有偏见:位置偏见、冗长偏见、自偏好;随机化顺序、长度归一、异模型判官缓解。
  7. ELO 优于绝对打分:相对排名更可靠,Chatbot Arena 用它排 100+ 模型。
  8. 自定义评估五步:定义任务→造用例(50+ 起)→定义打分→自动化→追踪趋势。
  9. 指标选择影响巨大:同一模型,精确匹配看着糟,F1 看着好;按任务选指标。
  10. lm-evaluation-harness/promptfoo/RAGAS:标准工具覆盖通用基准、提示回归、RAG 评估。

下一节,量化:70B 模型 FP16 要 140GB,两张 A100 光装权重——量化到 INT4,一台 MacBook 就能跑。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U