评测不是“分高即好”,而是“业务可用”。 注:本文为“1 月份重点篇”,补充可落地的评测清单与样例脚本。
🎯 文章目标
- 理解“基准评测 vs 业务内评估”的差别
- 设计一个小而全的离线集,并建立在线 A/B 的观测看板
- 快速搭建自动化评测脚本
📚 背景/前置
- 通用基准:MMLU、BBH、GSM8K 等用于横向比较,不代表你的业务
- 业务内评估:覆盖真实任务、格式约束、边界输入、反事实与噪声样本
- 指标维度:正确率/一致性、可执行性、延迟、成本、拒答率与有害输出
🔧 核心内容
1) 评测集设计
- 覆盖典型流程:主路径/分支/错误输入/越权输入
- 题型混合:抽取/归纳/生成/结构化输出
- 样本标注:黄金答案/答案模板/可执行校验器(JSON Schema/正则/单元测试)
2) 评测框架与自动化
- 离线:固定随机种子、稳定 prompt、冻结模型版本
- 在线:A/B 人群划分、灰度比例、观测与报警
- 度量:分 bucket 汇总(按任务、客户、重要性),输出报表与 Top-N 失败样本
3) 结果解读与取舍
- 高分不等于可用:对齐差、格式不稳、延迟过高都可能导致“上线不可用”
- 用“成本/延迟/可执行性”联合排序
- 决策要点:简单任务先小模型,难任务才回退大模型
💡 实战示例:最小评测脚本
python
# pip install openai pandas jsonschema
import os, json, time, pandas as pd
from jsonschema import validate
from openai import OpenAI
API_BASE = os.getenv('OPENAI_API_BASE', 'http://localhost:8000/v1')
API_KEY = os.getenv('OPENAI_API_KEY', 'sk-xxxx')
MODEL = os.getenv('EVAL_MODEL', 'qwen2.5-7b-instruct')
schema = {
"type":"object",
"properties":{ "title": {"type":"string"}, "bullets": {"type":"array"} },
"required":["title", "bullets"]
}
data = pd.DataFrame({"input":[
"总结这段话,输出 {title, bullets} JSON 对象: ...",
"从文本中抽取 {订单号, 金额} 字段,输出 JSON",
"识别这段话是否含敏感词(是/否),并说明理由"
]})
client = OpenAI(base_url=API_BASE, api_key=API_KEY)
ok, lat = 0, []
for _, row in data.iterrows():
t0 = time.time()
resp = client.chat.completions.create(model=MODEL, messages=[{"role":"user","content":row['input']}])
lat.append(time.time()-t0)
try:
obj = json.loads(resp.choices[0].message.content)
validate(obj, schema)
ok += 1
except Exception:
pass
print({"pass_rate": ok/len(data), "avg_latency": sum(lat)/len(lat)})
要点:
- 用 JSON Schema/正则/单测,转“主观打分”为“可执行校验”
- 固定 prompt 与模型版本,避免离线评测抖动
- 在线要监控拒答率/越权调用/有害输出
📊 对比/取舍(速查)
- 通用基准:横向参考价值高,但与业务弱相关
- 业务内评估:最能反映上线可用性,但设计/维护成本更高
- 组合建议:先业务内离线小集 → 通过后灰度上线做在线评估
🧪 踩坑与经验
- 评测集污染:训练/评测样本混淆导致虚高;务必隔离
- 指标误读:只看正确率忽略延迟/成本,容易造成错误决策
- 忽略观测:上线后不留失败样本,导致问题无法复盘
📎 参考与延伸
- HELM、Dynabench 等评测框架
- 结构化输出与 JSON Schema 校验实践
- 在线实验与灰度发布最佳实践
💭 总结
- 评测的目标是“上线可用”而非“分数好看”
- 以可执行校验与在线观测为核心,构建稳定、可复用的评测体系