sharegpt数据需严格转换为dpo三元组格式:确保conversations以human结尾,chosen/rejected为含from/value的字典,转为jsonl,配置dataset_info.json启用ranking=true,并清洗文本、校验schema。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您正在使用ShareGPT格式的数据进行DPO(直接偏好优化)训练,但模型无法正常加载或训练报错,则很可能是由于数据结构不符合DPO专用格式要求。以下是针对ShareGPT数据集在DPO训练中正确应用的详细操作步骤:
一、确认ShareGPT数据必须满足DPO三元组结构
ShareGPT原始格式仅支持多轮对话序列,而DPO训练强制要求每个样本包含明确的prompt上下文、一个优选回复(chosen)和一个劣选回复(rejected),二者必须为独立对象而非字符串。若conversations中最后一个消息不是human类型,或chosen/rejected字段缺失from字段,则LLaMA-Factory等训练框架将直接拒绝解析。
1、检查每个样本的conversations字段,确保最后一项的from值为"human";
2、验证chosen与rejected字段是否为字典对象,且均包含"from": "gpt"和"value"两个键;
3、删除所有conversations中from为"gpt"的末尾消息,仅保留以human结尾的单轮提问上下文;
4、将原conversations中倒数第二条gpt回复移出,作为rejected.value,将人工标注的优质回复填入chosen.value。
二、重写JSONL文件以适配DPO训练器
LLaMA-Factory等主流训练框架不接受原始ShareGPT JSON数组,必须转换为每行一个合法DPO样本的JSONL格式,并确保字段名与配置文件严格一致。任意字段名拼写错误(如"messages"误写为"message")都会导致列映射失败。
1、用Python逐行读取原始ShareGPT JSON文件;
2、对每一行数据提取conversations列表,截取至最后一个human消息为止;
3、新建字典,显式设置"conversations"键对应截断后的列表,"chosen"和"rejected"键分别赋值为带from/value结构的字典;
4、将新字典以json.dumps()写入新文件,每行一个样本,保存为UTF-8无BOM编码。
三、配置dataset_info.json启用ranking模式
即使数据内容正确,若未在dataset_info.json中声明ranking=true及字段映射关系,训练器仍将按SFT模式解析,忽略chosen/rejected字段。该配置是触发DPO专用数据加载路径的开关。
1、在dataset_info.json中新增数据集条目,名称需与脚本中--dataset参数完全一致;
2、设置"formatting": "sharegpt";
3、显式添加"ranking": true字段;
4、在columns对象中精确指定:"messages": "conversations"、"chosen": "chosen"、"rejected": "rejected"。
四、验证数据可被tokenizer正确分词
DPO训练要求chosen与rejected的token序列长度必须严格对齐,否则在计算对比损失时会因shape mismatch报错。若原始文本含大量不可见控制字符或非标准空格,会导致分词后长度突变,进而中断训练。
1、加载HuggingFace tokenizer,对任一样本的chosen.value和rejected.value分别调用encode();
2、比对二者返回的input_ids长度,差异超过3个token即需清洗;
3、使用正则表达式r'[\u200b-\u200f\u202a-\u202f\u2066-\u2069]'清除零宽字符;
4、将连续空白符(\s+)统一替换为单个空格,并strip首尾空白。
五、启动训练前执行schema校验脚本
手动检查百条样本易遗漏边界情况。应运行轻量级校验脚本,自动扫描全部样本并报告缺失字段、类型错误及长度异常,避免训练启动后因单条脏数据崩溃。
1、编写Python脚本,导入jsonlines库逐行读取JSONL文件;
2、对每一行执行isinstance(line, dict) and "conversations" in line and "chosen" in line and "rejected" in line;
3、对chosen/rejected分别校验isinstance(x, dict) and "from" in x and "value" in x and x["from"] == "gpt";
4、输出所有违反规则的行号及错误类型,例如:"line 87: chosen.value is None"。











