先把当时的情况摆出来。微调后模型在内部回归集上准确率 0.93,上线只有 0.71,回归集 1200 条与训练集 8 万条来自同一批客服会话,怀疑有重叠。

原因不止一个,得分开看。训练集切分时按行随机,同一会话落到两边。也可能是回归集的问题在训练集里有近乎相同的改写。

另外,微调数据里包含了标注答案原文。少数情况下是去重只按完全匹配,改写样本没被识别。

做问题文本的完全匹配查重

python -c "import json;tr={json.loads(l)['q'] for l in open('train.jsonl')};ev=[json.loads(l) for l in open('eval.jsonl')];print(sum(1 for x in ev if x['q'] in tr),len(ev))"

再往下用字符 3-gram 相似度找近重复

python -c "import difflib;print(difflib.SequenceMatcher(None,'怎么部署vllm','vllm如何部署').ratio())"

随后按会话 id 重新切分数据集

python split.py --group-by session_id --eval-ratio 0.1

等前面都确认过,再剔除重叠后重跑评估对比分数

python eval.py --data eval_clean.jsonl --model ft-1.3

恢复的判定其实很直接。查重后重叠率降到 0.5% 以下,回归集分数回落到 0.73 附近,与线上表现基本一致。

提醒一点。分数虚高优先查泄漏,按行随机切分在会话型数据上几乎必然重叠,切分要以会话或用户为单位。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189