记录一下那天晚上的排查过程。把自建数据集直接喂给训练脚本,报 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。

提醒一点。字段缺失往往只出现在少数样本上,脚本跑到中途才崩,训练前先做一次全量字段体检能省下大量重启时间。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189