若sharegpt用于chatglm/llama/vicuna指令微调时出现样本丢失、tokenization错位或loss震荡,主因是其多轮对话结构与sft三元组范式不匹配;需通过语义解析、alpaca格式转换、llama-factory模板直连、指令前缀增强及三项硬性校验来适配。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您计划将ShareGPT数据集用于ChatGLM、LLaMA或Vicuna等大语言模型的指令微调(Instruction Tuning),但发现训练过程中出现样本丢失、tokenization错位或loss异常震荡,则很可能是由于ShareGPT原始结构未适配目标模型的SFT输入范式。以下是针对该问题的数据准备完整说明:
一、理解ShareGPT结构与指令微调目标的语义鸿沟
ShareGPT数据本质是真实用户与模型交互的多轮对话日志,含human/gpt/function_call/observation等角色字段及可选system提示,其设计目标是还原对话流;而标准指令微调要求明确区分instruction(任务意图)、input(上下文或条件)、output(期望响应)三元组,二者在信息粒度、角色映射和训练信号构造上存在结构性不匹配。该步骤旨在识别原始conversations中哪些片段承载指令语义、哪些构成隐式上下文、哪些属于工具执行中间态,从而避免将observation或function_call误标为output。
1、打开任意ShareGPT样本,定位conversations数组内首条from: "human"字段,该value通常承载初始任务意图,应作为instruction候选。
2、检查后续from: "gpt"是否直接回应首条human,若是,则该gpt value可视为output;若中间插入function_call与observation,则需将function_call+observation整体视为工具调用过程,仅末尾gpt value为最终output。
3、若conversations以from: "system"开头,且内容含角色设定(如“你是一名资深律师”),则该system内容应合并至instruction前缀,格式为“[系统角色]:{system_value}\n{first_human_value}”。
二、手动转换ShareGPT为Alpaca兼容格式
该方法适用于需完全控制字段语义、排除LLaMA-Factory模板自动推断误差的场景,尤其适合含复杂tool调用链或非标准human/gpt交替序列的样本。转换后生成标准JSONL文件,每行严格符合{"instruction": "...", "input": "...", "output": "..."}结构,可被Hugging Face Datasets、Axolotl等主流训练框架原生加载。
1、新建Python脚本parse_sharegpt.py,导入jsonlines库用于流式写入。
2、逐行读取原始sharegpt_zh.json,对每个样本执行:提取conversations列表,初始化instruction为空字符串、input为空字符串、output为空字符串。
3、遍历conversations,当遇到首条from: "human"时,将其value赋给instruction;当后续出现from: "human"且instruction已非空时,将其value追加至input(用"\n"分隔);当遇到末条from: "gpt"且其后无其他from字段时,将其value赋给output。
4、若样本中存在function_call与紧随其后的observation,将二者value拼接为input的一部分,格式为“
5、过滤instruction或output为空的样本,将有效三元组以JSONL格式写入alpaca_ready.jsonl。
三、使用LLaMA-Factory内置ShareGPT模板直连训练
该方式跳过手动JSON结构调整,依赖LLaMA-Factory的sharegpt.py模板完成动态role-to-field映射,自动处理system、tools、function_call等扩展字段,并在tokenization阶段对齐labels掩码,适用于含大量工具调用或跨模态(如ShareGPT4V)的复杂样本。
1、确认LLaMA-Factory版本≥0.9.0,运行pip install llama-factory确保sharegpt模板已注册。
2、将原始ShareGPT数据保存为data/sharegpt_custom.json,无需重命名字段或修改结构,保留conversations/system/tools原样。
3、启动训练时指定--dataset sharegpt_custom --template sharegpt --dataset_dir ./data,框架将自动调用sharegpt.py中的format_example()函数。
4、关键验证点:在训练日志中搜索“Loaded dataset with X samples”,确认数值与原始JSON文件行数一致;若显著偏少,说明sharegpt.py中from字段匹配逻辑未覆盖您的数据变体。
四、混合构造带显式instruction前缀的增强样本
该方法针对ShareGPT中instruction隐含于对话首轮、缺乏明确任务描述的问题,通过规则注入标准化指令头(如“请回答以下问题:”、“根据上述描述,生成…”),提升模型对任务边界的感知能力,特别适用于将闲聊对话转化为问答、摘要、改写等下游任务。
1、统计原始ShareGPT中高频human提问句式,例如“什么是…”、“如何…”、“请解释…”、“帮我…”等,构建instruction前缀词典。
2、对每条human value,若匹配词典中任一模式,则保留原value;若不匹配(如“今天天气怎么样”),则前置通用指令头“请进行开放式对话回复:”。
3、对含图像占位符
4、将增强后的instruction与对应gpt output组合,生成新样本,存入enhanced_instructions.jsonl,与原始alpaca_ready.jsonl按1:1比例混合进训练集。
五、验证数据质量的三项硬性指标
无论采用何种转换路径,必须在训练前执行本地校验,确保每条样本满足指令微调的最小语义完备性要求。校验失败的样本需返回前序步骤修正,不可强行纳入训练流程。
1、执行python validate_sft_data.py --input alpaca_ready.jsonl,脚本应输出“PASS: All samples have non-empty instruction and output fields”。
2、随机抽取10条样本,人工检查output是否严格对应instruction所定义的任务类型(如instruction含“翻译”,output必须为译文而非解释)。
3、关键操作:使用tokenizer.encode()分别处理instruction+input与instruction+input+output,确认前者token IDs长度严格小于后者,且差值等于output部分token数量——此项不满足将导致labels掩码错位,训练loss恒为nan。











