应将ShareGPT数据转换为ChatGLM兼容的instruction-input-output格式,或通过LLaMA-Factory直接加载,或修改ChatGLM-Efficient-Tuning源码原生支持,最后验证labels掩码仅覆盖gpt输出。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您计划使用ShareGPT格式的数据集对ChatGLM系列模型(如ChatGLM3-6B)进行监督微调,但发现数据加载失败或训练中断,则很可能是由于ShareGPT结构与ChatGLM默认期望的instruction格式不兼容。以下是将ShareGPT数据适配至ChatGLM微调流程的完整操作步骤:
一、确认ShareGPT数据结构并转换为ChatGLM兼容格式
ChatGLM官方微调脚本(如train_bash.py)默认接受instruction-input-output三元组结构,而ShareGPT采用conversations数组嵌套human/gpt/function_call等角色字段,需先做结构映射。该步骤确保每条样本能被tokenizer正确截断并构造labels掩码。
1、打开ShareGPT原始JSON文件,定位到每个样本的conversations数组。
2、遍历conversations中所有from: "human"和from: "gpt"条目,按顺序拼接为单轮或多轮对话文本,保留原始语义顺序。
3、将首条human内容设为instruction字段,后续human与gpt交替视为多轮上下文,末尾gpt输出设为output;若无明确gpt结尾,则丢弃该样本。
4、生成新JSONL文件,每行一个标准ChatGLM SFT样本:{"instruction": "用户第一句话", "input": "", "output": "模型最后一句回复"}。
二、使用LLaMA-Factory统一加载ShareGPT数据
LLaMA-Factory提供内置ShareGPT数据集解析器,可跳过手动转换,直接支持conversations字段读取,并自动处理system提示与tool调用标记。该方式避免JSON结构误解析,适用于含function_call/observation字段的复杂ShareGPT样本。
1、安装LLaMA-Factory:执行git clone https://github.com/hiyouga/LLaMA-Factory.git并进入目录。
2、在data子目录下新建sharegpt_zh_custom.json,直接粘贴原始ShareGPT数据(无需修改字段名)。
3、运行微调命令时指定数据集类型:--dataset_dir ./data --dataset sharegpt_zh_custom --template sharegpt。
4、确保--template sharegpt参数启用,LLaMA-Factory将调用sharegpt.py模板完成role-to-instruction映射与tokenization对齐。
三、修改ChatGLM-Efficient-Tuning源码以原生支持ShareGPT
当需深度控制对话轮次截断逻辑或保留observation中间态时,可直接修改ChatGLM-Efficient-Tuning的数据加载模块。该方法绕过格式转换损耗,保留原始数据语义完整性,适用于强化学习(PPO)阶段的观测序列建模。
1、打开src/data.py,找到get_dataset函数,在elif dataset_name == "alpaca_zh"分支后新增elif dataset_name == "sharegpt_zh"分支。
2、在该分支内调用自定义解析函数load_sharegpt_dataset,逐条读取conversations并构建input_ids与labels张量,对function_call和observation字段添加特殊token标识。
3、在src/train_bash.py的参数校验处,将"sharegpt_zh"加入MODEL_CLASSES支持列表。
4、启动训练时传入--dataset sharegpt_zh --stage sft,框架将自动加载并处理原始ShareGPT结构。
四、验证数据加载是否成功
在执行正式训练前,必须验证数据已正确注入模型输入管道。该步骤通过打印batch样本来确认instruction-output对齐、token长度未超限、labels掩码仅覆盖gpt输出部分。
1、在src/train_bash.py中找到trainer.train()调用前的位置,插入调试代码:print('Sample input:', tokenizer.decode(train_dataset[0]["input_ids"][:50]))。
2、运行训练脚本并添加--do_train False --max_steps 1参数,强制只加载一个batch后退出。
3、检查日志中输出的decoded文本:确认human内容出现在开头,gpt内容紧随其后,且function_call字段被转为可识别token而非乱码。
4、重点核对labels张量:其中-100应覆盖所有非gpt位置,仅gpt输出对应位置为真实token id,任何非-100值出现在human段即表示掩码错误。











