先把当时的情况摆出来。微调后模型在内部回归集上准确率 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 附近,与线上表现基本一致。
提醒一点。分数虚高优先查泄漏,按行随机切分在会话型数据上几乎必然重叠,切分要以会话或用户为单位。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
