比较两个模型时,公开榜单可以提供线索,却不能直接回答哪个更适合你的客服或论文检索任务。输入长度、语言、工具调用和错误代价都可能不同。这里把评测拆为公开基准阅读、裁判校准和任务测试集建设,让模型选型有可复查的依据。
前置阅读:建议先读 Prompt Engineering 实战、LLM 对齐技术。
公开基准:能力地图与阅读纪律
主流基准各测什么,一张表建立坐标系:
| 基准 | 测什么 | 现状 |
|---|---|---|
| MMLU | 57 学科知识选择题 | 饱和(头部模型 88%+),区分度下降 |
| GPQA | 研究生级科学推理 | 还有区分度,专家级难题 |
| HumanEval/MBPP | 代码生成 | 老牌但偏简单,SWE-bench 更真实 |
| MATH/GSM8K | 数学推理 | GSM8K 已饱和,MATH 尚可 |
| C-Eval/CMMLU | 中文知识 | 中文场景必看 |
| MT-Bench/Arena | 开放式对话质量 | 人类偏好的代理 |
读榜单的四条纪律:
- 饱和的榜别看:大家都 90% 附近时,2 分差距是噪声不是能力。看还没饱和的(GPQA、前沿数学)。
- 警惕污染:基准题早就在互联网上了,训练数据「见过题」的模型分数虚高——MMLU 刷分的灰色地带。看「污染控制后」的复测(有些独立机构做)比官方分可信。
- 选择题 ≠ 生成能力:MMLU 测的是「选对」,你的场景是「写对」——生成质量要另外测。
- LMSYS Arena(人类对战投票)是当前最接近「真实好用」的公共信号:盲测两模型回答,真人投票——Elo 排名的生态位类似围棋 rating。
LLM-as-Judge:可扩展的裁判,带偏差的那种
开放式回答(摘要、对话、方案)没有标准答案,人工评太贵——让强模型(GPT-4o/Claude)按 rubric 打分是行业标配。但裁判自己有脾气:
- 位置偏差:两个答案先后呈现,裁判偏向某一边(通常第一个或最后一个)。对策:交换位置各评一次取平均。
- 长度偏差:偏爱更长的回答(长=看起来详细)。对策:rubric 里明确「不因长度加分」,或控制长度分布。
- 自家人偏差:GPT-4 评 GPT-4 的答案偏高。对策:裁判模型与被评模型不同家族。
- 字面匹配偏好:和参考答案字面像的分高,语义等价但措辞不同的吃亏。
JUDGE_PROMPT = """你是严格的评审。按以下标准给回答打分(1-5):
1. 事实准确性(权重最高)2. 完整性 3. 简洁性
注意:不因回答长短加分;只依据给定参考资料判断事实。
[问题] {question}
[参考资料] {context}
[回答] {answer}
先逐项给理由,最后一行输出 JSON: {{"score": N}}"""
校准是刚需:随机抽 50 条让人类专家同样打分,算人机一致率(Cohen’s κ 或简单一致率)——低于 70% 的裁判不能上岗,要么换模型要么改 rubric。裁判也要「持证上岗」。
自建 Eval:唯一回答得了「对我够不够好」的东西
建集:从真实流量里长出来
评估集三来源,按价值排:
- 线上真实 query log(分布最真实,抽样 100~300 条)
- 历史 badcase(每个坑都要有名字,防回归)
- 对抗构造(边界、刁钻、注入攻击——主动找茬)
每条的标配字段:输入、期望行为(不是唯一答案,是可接受的标准)、标签(场景/难度)、通过判定方式(规则/裁判/人工)。
判定:能自动化的别用眼看
| 任务类型 | 判定方式 |
|---|---|
| 分类/提取 | 精确匹配/F1,规则硬判 |
| 有参考答案的 QA | 语义相似度 + LLM 裁判 |
| 开放式生成 | LLM-as-Judge + rubric |
| 代码 | 跑测试用例(可执行评估,最硬) |
| 格式合规 | JSON Schema 校验/正则 |
def run_eval(model_fn, eval_set, judge):
results = []
for case in eval_set:
output = model_fn(case["input"])
passed = judge(output, case)
results.append({"id": case["id"], "passed": passed,
"output": output, "tags": case["tags"]})
# 按标签分层报告:总分 + 各场景分 + badcase 清单
return results
纪律:eval 的三条军规
- eval 集不许进训练数据——污染后所有分数都是自欺欺人。定期做 n-gram 重叠检查。
- 看分层不看总分:总分 90 分可能在「退款类」上全军覆没——按场景/难度切开的分数才有行动指导。
- 每次改动跑全量:prompt 改一行、模型换个版本、知识库更新——都可能引发回归。eval 进 CI,像单元测试一样成为发布门禁(MLOps 篇的延伸)。
评测驱动迭代:我的完整工作流
建 eval 集(100 条真实 query + 50 条 badcase + 30 条对抗)
↓ 每两周从线上 log 补充
改动(prompt/模型/检索)→ 全量跑 eval
↓
分层报告:总分变化 + 各场景变化 + 新增 badcase
↓
人工抽检 10%(校准自动判定)→ 通过 → 灰度上线
↓
线上指标(采纳率/重试率/人工介入率)回写 → 反哺 eval 集
离线 eval 是门槛,线上行为指标才是终审——两者矛盾时信线上,并检查 eval 哪里脱离了真实分布。
踩坑排查
| 现象 | 原因 | 解法 |
|---|---|---|
| 基准分高但业务表现差 | 基准与你的任务不匹配 | 自建 eval 为准,榜单只粗筛 |
| 裁判给分普遍偏高 | 裁判模型太宽松/自家人偏差 | 换裁判家族;rubric 加严格锚点示例 |
| 同一模型两次评测分数波动 | 温度非零 + 样本小 | 温度设 0;每题跑 3 次取多数;扩样本 |
| eval 分数涨线上不涨 | eval 集偏离真实分布/被污染 | 从线上 log 更新 eval;查污染 |
| 两模型对比结论随裁判而变 | 裁判偏差 | 双裁判 + 交换位置 + 人工校准子集 |
练习
- 选你的一个 LLM 应用,建 50 条 eval 集(含 10 条历史 badcase),定义每条的可接受标准。
- 实现一个 LLM 裁判:给 rubric,评 30 条输出,然后人工同样评一遍,算人机一致率——不达标就改 rubric 再来。
- 做位置偏差实验:同一对答案 AB 两种顺序各评 20 次,统计裁判的偏好分布。
- 对比两个模型(如 GPT-4o-mini vs Qwen)在你的 eval 集上的分层表现,写一份 300 字的选型建议。
面试常问
Q:MMLU 分数高说明什么?不说明什么? 说明:广泛的知识覆盖和选择题形式的理解力,底座训练的扎实程度。不说明:开放式生成质量、指令遵循、特定领域表现、安全性、延迟成本。MMLU 是「体检基础项」不是「岗位胜任力」——选人要看场景 eval。
Q:LLM-as-Judge 怎么做得可信? 四步:明确 rubric(每个分数档有具体描述和锚点示例);对抗已知偏差(换序、控长度、异家族裁判);人机校准(抽样人工复核,一致率达标才信任);双裁判/裁判团取共识。把裁判当「有偏但稳定的测量仪器」——定期校准,用其相对差而非绝对分。
Q:eval 集多大合适? 够检出你关心的效应量:要区分 5 个点的差距,二项分布下约需 300+ 样本;粗筛(10 个点差距)100 条够。分层后每层至少 20~30 条才有统计意义。质量 > 数量:100 条精心覆盖关键场景的 eval 胜过 1000 条随机堆砌。
Q:如何防 eval 污染? 训练侧:与训练语料做 n-gram/embedding 去重;使用侧:eval 集私有(不进公开 repo、不进 prompt 示例);时间维度:定期从最新线上数据补充新题(滚动 eval);检测侧:测「题目逐字出现时的表现 vs 同义改写后」——差异大说明靠背题。
Q:业务 eval 和公开基准冲突时信谁? 信业务 eval——公开基准测「平均能力」,你的业务是特定分布。但要检查:eval 是否太小(统计噪声)、是否有偏(只覆盖简单场景)、判定是否过松/过严。冲突本身是信息:说明你的场景与通用分布有结构差异,值得写进模型卡片。
相关阅读
- Prompt Engineering 实战——评测集驱动 prompt 迭代
- LLM 对齐技术:SFT、RLHF 与 DPO——训练侧的效果同样需要 eval 验证
- A/B 测试与统计推断——线上终审的科学方法
- MLOps:实验跟踪与监控——eval 进 CI/CD 的落法
- RAG 进阶——检索层的分层评估
评测是 LLM 工程的罗盘——没有它,所有「优化」都是布朗运动。先建 eval 再迭代,这个顺序值你项目一半的成败。
💬 评论
这套方案在哪一步卡住了?也欢迎补充你的实现方式或踩坑经验。