基准分虚高的三条路径
基准分与真实体验的偏差通常来自三条路径:训练数据里混入了题目(污染)、团队针对榜单做了定向优化、判分方式过于宽松。三者叠加时,分数可以持续上涨而用户体验没有变化。另一侧的偏差常被忽略——真实体验还受延迟、稳定性、失败重试与成本影响,这些在榜单里根本不体现。
基本信息
| 污染来源 | 训练语料混入公开题库、社区问答、同一题库的改写版本 |
|---|---|
| 定向优化 | 针对固定题目调提示词、挑选有利配置、只报最优结果 |
| 判分宽松 | 正则抽取失败被计错、模型判官偏好长答案与固定格式 |
| 体验缺口 | 延迟、超时、限流、重试与成本未纳入榜单口径 |
| 识别手段 | 换集复测、与训练数据做重合检查、看同题多次运行抖动 |
| 应对原则 | 保留从未参与调优的留出集,并长期不公开其内容 |
典型使用场景
- 选型验收:用自建留出集确认分数不是被污染抬高的
- 内部复盘:判断上一轮提升来自模型、提示词还是评测集泄漏
- 对外沟通:解释为什么宣传分数不能直接换算成业务效果
- 评测集管理:建立隔离规则,防止调优人员接触留出集
- 供应商评估:识别只公布有利口径的评测报告
- 风险预判:把延迟与成本纳入决策,避免上线后体验落差
偏差来源与识别信号
| 偏差来源 | 机制 | 识别信号 |
|---|---|---|
| 训练污染 | 题目或近似文本进入训练语料 | 换一道同义改写题后分数明显下降 |
| 题目泄露 | 评测集内容被公开或转发 | 内部人员对题目过于熟悉,能背出答案 |
| 定向优化 | 提示词针对固定题目反复调整 | 固定集分数高、新集分数低,差距大 |
| 判分宽松 | 抽取失败或长度偏好被计为正确 | 人工抽查发现部分得分答案其实不达要求 |
| 运行挑选 | 多次运行取最好或只报部分样本 | 同一配置重复运行复现不出分数 |
| 体验缺口 | 榜单不含延迟、限流与成本 | 上线后用户感知差但离线指标正常 |
污染排查的思路
污染排查的思路
# 思路:用字符 n-gram 重叠率做粗筛,再人工确认高频命中
# 只作筛查,不能证明不存在污染
from collections import Counter
def grams(text, n=8):
# 归一化:去空白与标点,避免格式差异掩盖重合
t = ''.join(ch for ch in text if ch.isalnum())
return Counter(t[i:i+n] for i in range(len(t)-n+1))
def overlap(question, corpus, n=8, topk=200):
q = grams(question, n)
common = q & grams(corpus, n)
hit = sum(common.values())
total = sum(q.values()) or 1
return hit / total, common.most_common(topk)
# 判读:重叠率异常高时,把命中片段人工复核
# 注意:领域固定表述会天然重合,必须结合上下文判断留出集的管理比算法更重要:内容不公开、调优人员不可访问、只用一次。若同一套题既用来调提示词又用来验收,分数上升只证明过拟合程度加深。
模型判官也会引入偏好:更倾向长答案、固定格式或与其自身风格相近的输出。用人判官与模型判官交叉抽查,并把判定说明写成可复核的条文,能显著降低这类偏差。
不要把榜单分数写进对外承诺。承诺应基于自建集的可复现结论,并明确输入分布与参数条件;具体评测口径、可用性与限制以对应官方文档为准。