记录一下那天晚上的排查过程。把 sharegpt 格式数据转成 alpaca 时报 ValueError: unknown role human,转换脚本只认 user 和 assistant。
刚开始盯着「多轮对话被当成单轮,后半段信息丢失」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。sharegpt 用 human 和 gpt 表示角色。还有一种是系统消息混在对话数组里,没有单独处理。
不容易想到的是,value 字段里带了空白和换行,模板拼接错位。
上来先把角色名映射成统一取值
python -c "m={'human':'user','gpt':'assistant'};print([m.get(t['from'],t['from']) for t in conv])"
接着按轮次把对话拼成指令与回答
python convert.py --in sharegpt.json --out alpaca.jsonl --style alpaca
再往下把系统消息单独抽成字段
python -c "print([t for t in conv if t['from']=='system'])"
末了抽查转换结果的首尾几条
python -c "import json;print(json.loads(open('alpaca.jsonl').readline()))"
改完先别撤,确认这几项。转换后的文件字段齐全,角色对应正确,训练脚本能直接读取且多轮内容没有丢失。
提醒一点。多轮数据转成单轮时会丢掉中间轮次,如果训练目标是多轮对话,应该保留对话结构而不是压成一条问答。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。