ShareGPT与OpenAI格式可双向转换:ShareGPT→OpenAI需映射from为role、value为content,并补system;OpenAI→ShareGPT则反向映射role为from、content为value,丢弃非标字段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您需要在ShareGPT格式与OpenAI官方对话格式之间进行双向转换,可能是为了适配不同训练框架、微调工具或API接口要求。以下是实现这两种格式互转的具体方法:
一、ShareGPT → OpenAI格式的转换
ShareGPT格式以messages数组为核心,但每个message对象包含from(角色标识)和value(内容)字段,而OpenAI格式要求role为system/user/assistant,content为字符串。转换需重映射字段并处理特殊结构(如多轮中的tool_calls缺失、无system消息时补默认system等)。
1、读取原始ShareGPT JSON文件,解析为Python字典。
2、遍历messages列表,将from字段映射为role:若from为"human"则设为"user",若from为"gpt"则设为"assistant",若from为"system"则设为"system"。
3、提取每条消息的value字段作为content值,构造新字典{"role": "...", "content": "..."}。
4、若原messages中首条非user消息为system类型,则保留;若无system消息且首条为user,则在列表开头插入{"role": "system", "content": ""}。
5、将转换后的messages列表封装为{"messages": [...]},写入新JSON文件。
二、OpenAI → ShareGPT格式的转换
OpenAI格式中role字段严格限定为system/user/assistant,而ShareGPT使用from字段且不支持tool_calls或function调用结构。转换需忽略非标准字段,并将role映射回from,同时确保value字段与content完全一致,不引入额外换行或空格。
1、加载OpenAI格式JSON,提取顶层messages数组。
2、对每条消息,将role字段值转为from:role为"user"对应"human",role为"assistant"对应"gpt",role为"system"对应"system"。
3、将content字段原样赋给value字段,不作trim或正则清洗,确保换行符和缩进与原始content完全一致。
4、丢弃所有非role/content字段(如tool_calls、function_call、name等)。
5、将转换后消息列表直接作为根对象写入JSON文件,不添加任何外层包装字段如conversations或data。
三、使用Python脚本批量处理多个文件
当存在大量对话JSON文件需统一格式化时,可编写主控脚本协调两类转换逻辑,并通过命令行参数指定方向(--to-openai 或 --to-sharegpt)及输入输出路径。
1、导入argparse模块,定义--input、--output、--direction三个必需参数。
2、根据--direction值调用对应转换函数,对--input路径下所有.json文件逐个处理。
3、对每个文件执行转换后,保存至--output路径下同名文件,保留原始文件名与目录层级结构。
4、遇到解析失败的文件,记录错误路径到error.log而不中断流程。
5、输出完成统计,例如“成功转换127个文件,跳过3个无效JSON”。
四、处理含图片或base64内容的ShareGPT扩展字段
部分ShareGPT导出数据包含from: "human"且value中嵌有<img src="data:image/png;base64,..."/>标签。OpenAI格式不支持HTML或内联图片,因此必须剥离或替换为文本描述,否则会导致API拒绝或训练崩溃。
1、在ShareGPT→OpenAI转换前,检测value字段是否包含<img 或 data:image/ 字符串。
2、若存在,提取base64前缀后的MIME类型(如png/jpg),生成占位文本"[Image: PNG image]"并替换整个img标签。
3、保留原始base64字符串至sidecar.json元数据文件,避免丢失图像信息用于后续人工校验。
4、在OpenAI→ShareGPT转换中,若content含类似"[Image:"文本,则反向注入img标签,MIME类型从sidecar.json中还原。
五、验证转换结果一致性的断言检查
为防止字段错位、顺序错乱或编码污染,应在每次转换后运行校验逻辑,确保语义未损。校验不依赖全文相等,而是比对关键结构特征。
1、加载原始与目标文件,分别提取messages数组长度、首条role/from值、末条role/from值。
2、逐条比对:user消息的content/value是否完全相同(忽略前后空格);assistant消息是否均非空且不含控制字符。
3、检查是否存在连续两条user消息,这在两种格式中均为非法结构,应触发警告并终止保存。
4、对每条消息计算content/value的UTF-8字节长度,差异超过5%则标记为潜在截断。


















