记录一下那天晚上的排查过程。把自建数据集直接喂给训练脚本,报 KeyError: ‘output’,检查发现部分样本只有 instruction 和 input 两个字段。
刚开始盯着「空字符串被当成缺失,过滤逻辑误判」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。样本缺少 output 字段,模板渲染时取不到值。少数情况下是字段名写成了 answer 或 response。
另外,数据里混入了表头行。
扫描全部样本的字段集合
python -c "import json;rows=[json.loads(l) for l in open('data.jsonl')];print(set().union(*[r.keys() for r in rows]))"
接着把常见别名统一映射成标准字段
python normalize.py --map answer=output,response=output
过滤缺失关键字段的样本并记录数量
python -c "print(sum(1 for r in rows if not r.get('output')))"
渲染一条样本确认模板正确
python -c "print(render(rows[0])[:200])")
同一份数据我导出了两份,一份留底,一份拿来试。
改完先别撤,确认这几项。数据加载不再报 KeyError,渲染出的训练文本结构正确,训练能正常开始并输出 loss。
提醒一点。字段缺失往往只出现在少数样本上,脚本跑到中途才崩,训练前先做一次全量字段体检能省下大量重启时间。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。