sharegpt数据集需满足conversations中human/gpt交替且至少两轮,首为human、末为gpt;system字段须为非空字符串;加载时须匹配对应模板(如--template sharegpt)或转为instruction-output格式,否则因解析错误导致keyerror或loss不降。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把ShareGPT数据集直接用于SFT监督微调,但训练脚本报错“KeyError: 'instruction'”或loss不下降,说明原始conversations结构未被正确解析——这不是数据质量问题,而是加载路径与模型期望格式不匹配导致的解析中断。
确认ShareGPT原始结构是否满足SFT基本要求
打开你的sharegpt_zh.json文件,用文本编辑器搜索任意一条样本的"conversations"字段。该数组必须至少包含两个对象,且from值严格交替为"human"→"gpt"→"human"→"gpt"……首项必须是"human",末项推荐为"gpt"。若出现连续两个"human"或某条缺失from键,该样本将被主流框架静默丢弃。
执行命令jq '.[0].conversations | length'检查首条样本轮次长度。结果小于2的样本必须过滤——【SFT阶段严禁使用单轮human无响应的数据】,否则训练时会因output为空导致loss爆梯度。
检查是否存在system字段。若有,需确认其value是否为字符串类型而非null或空对象;非字符串system内容会导致LLaMA-Factory tokenizer在拼接时抛出TypeError。
方法一:用LLaMA-Factory零代码加载(推荐新手)
这一步操作起来很简单,直接把原始ShareGPT JSON文件扔进data目录就行。
在LLaMA-Factory项目根目录下执行:cp sharegpt_zh.json data/,重命名为sharegpt_zh_custom.json。
运行训练命令时必须显式指定--template sharegpt参数,否则框架默认按alpaca模板解析,会把conversations整个数组当instruction字符串切分,造成语义断裂。
确保dataset_info.json中已注册该数据集:添加条目{"sharegpt_zh_custom": {"file_name": "sharegpt_zh_custom.json", "formatting": "sharegpt"}},否则--dataset参数无法命中配置。
方法二:手动转换为ChatGLM兼容的instruction-output三元组
ChatGLM官方train_bash.py不识别conversations字段,必须重构为{"instruction": "...", "input": "", "output": "..."}结构。
- 提取每条conversations中第一个from: "human"的对象,其value作为instruction字段值;
- 跳过中间所有轮次,定位最后一个from: "gpt"的对象,其value作为output字段值;
- 若该gpt对象value为空字符串或仅含换行符,整条样本丢弃——【空回复会导致ChatGLM tokenizer生成全-100 labels,loss恒为nan】;
- 用json.dumps()逐行写入新文件,保存为UTF-8无BOM编码,扩展名必须为.jsonl。
注意:input字段强制设为空字符串"",不可省略或填null,否则ChatGLM-Efficient-Tuning会因字段缺失触发default_factory异常。
方法三:适配Hugging Face Transformers原生Trainer
如果你用Trainer + SFTTrainer类训练,需自定义Dataset类来处理嵌套结构。
继承torch.utils.data.Dataset,__getitem__中对conversations做如下处理:取前N-1轮拼成prompt(human+gpt交替),最后一轮gpt作为response,再用tokenizer.encode(prompt+response, truncation=True, max_length=2048)。
关键点在于labels构造:对prompt部分token全部赋值-100,仅response对应token保留真实id。若用AutoTokenizer.from_pretrained("xxx")加载,必须确认其add_eos_token=True,否则response末尾缺少eos token会导致loss计算漏掉最后一个词。
这一步不能跳过——没有正确mask的labels会让模型学习预测用户提问,而非生成回答。










