需将sharegpt格式(message列表,含role/content)转为alpaca格式(instruction/input/output),核心是提取首轮user-assistant对作为instruction和output,多轮内容可选填入input;代码含基础版(单轮)、增强版(多轮压缩)、鲁棒处理(清洗异常字段)及命令行批量支持。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您拥有以ShareGPT格式组织的对话数据集,但需要将其转换为Alpaca格式以适配微调流程,则需对字段结构、角色映射和指令构造进行系统性重排。以下是完成该格式转换的完整Python代码实现:
一、理解ShareGPT与Alpaca格式结构差异
ShareGPT格式以message列表形式存储多轮对话,每条message包含role("user"或"assistant")和content字段;Alpaca格式则采用扁平化单样本结构,包含instruction、input(可选)、output三个固定键,其中instruction通常对应首轮用户提问,output为首轮模型回复,后续多轮交互需合并或截断。转换核心在于识别首组user-assistant对并提取为instruction-output,同时将中间轮次内容按规则归入input字段或丢弃。
1、读取原始JSONL文件,逐行解析ShareGPT格式的字典对象。
2、遍历messages列表,定位第一个role为"user"的项作为instruction候选。
3、查找紧随其后的role为"assistant"的项,将其content设为output值。
4、若存在位于首user与首assistant之间的其他user消息(如system提示被误标),则跳过该样本。
5、将剩余非首轮的user-assistant对拼接为input字段,用换行符分隔,格式为“User: 内容\nAssistant: 内容”。
二、基础版转换脚本(支持单轮提取)
该版本适用于标准ShareGPT数据,仅保留首轮问答,忽略后续轮次,确保Alpaca格式严格对齐单指令-单响应范式。输出结果符合Hugging Face Datasets库直接加载要求。
1、导入json模块用于读写JSONL文件,导入os模块校验输入路径有效性。
2、定义函数convert_sharegpt_to_alpaca_basic(input_path, output_path),接收输入输出路径参数。
3、以只读模式打开input_path,逐行读取并用json.loads解析每行。
4、对每个样本检查messages是否为列表且长度≥2,且首项role=="user"、次项role=="assistant"。
5、构造新字典:{"instruction": messages[0]["content"], "input": "", "output": messages[1]["content"]}。
6、将新字典用json.dumps写入output_path,每行一个JSON对象。
三、增强版转换脚本(支持多轮压缩与input填充)
该版本在保留首轮instruction-output基础上,将第二轮及以后的user-assistant对编码进input字段,形成上下文感知的Alpaca样本,适用于需建模对话历史的训练场景。所有非首轮内容均经转义处理,避免JSON序列化失败。
1、定义函数convert_sharegpt_to_alpaca_enhanced(input_path, output_path, max_rounds=3),max_rounds控制最多纳入几轮历史。
2、对每个样本过滤出role为"user"或"assistant"的有效消息,剔除system类消息。
3、取索引0的消息作为instruction(强制要求为user),索引1的消息作为output(强制要求为assistant)。
4、从索引2开始截取最多max_rounds×2条消息,按顺序两两配对,生成形如"User: {content}\nAssistant: {next_content}"的字符串片段。
5、将所有片段用两个换行符连接,赋值给input字段;若无额外轮次,则input保持空字符串。
6、使用json.dump写入时设置ensure_ascii=False,保证中文不被转义。
四、鲁棒性增强处理(处理缺失字段与异常角色)
真实ShareGPT数据常含role为"system"、"observation"等非标准值,或content为空字符串。此步骤通过预处理清洗,防止转换中断,并提供可配置的容错策略。
1、在解析每条message前,检查是否存在role和content键,缺失则跳过该message。
2、将role值统一小写并映射:'user'→'user','assistant'→'assistant','system'→None(丢弃),其他值统一视为'user'并记录警告。
3、对content执行strip()操作,若结果为空,则整条message被忽略。
4、当首条有效message非user角色时,向前搜索首个user项;若未找到,则丢弃该样本并打印"Warning: No valid user message found in sample"。
5、启用logging模块,在output_path同目录下生成error.log记录所有被丢弃样本的原始行号与原因。
五、命令行封装与批量处理支持
为便于集成至数据预处理流水线,脚本需支持终端直接调用,接受输入文件、输出目录、格式类型等参数,并自动创建输出子目录结构。同时兼容通配符批量处理多个ShareGPT文件。
1、使用argparse.ArgumentParser定义--input、--output、--mode(basic/enhanced)、--max-rounds等参数。
2、若--input值含*字符(如"data/sharegpt_*.jsonl"),则用glob.glob展开为文件列表。
3、对每个输入文件,基于文件名生成对应输出文件名,例如sharegpt_v1.jsonl → alpaca_v1.jsonl。
4、根据--mode参数动态调用basic或enhanced转换函数,传入相应参数。
5、转换完成后打印完成统计:"Processed X files, generated Y valid Alpaca samples"。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











