需将sharegpt格式转换为openai chat-completion格式,可用四种方法:一、python脚本手动映射human/gpt为user/assistant;二、llamafactory内置align_dataset()自动对齐;三、medusa工具convert_to_openai.py命令行转换;四、hugging face datasets动态map转换。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

如果您拥有 ShareGPT 格式的对话数据,但需在要求 OpenAI chat-completion API 格式(如 messages 列表)的训练框架或推理服务中使用,则必须进行结构化转换。以下是实现该转换的多种可行方法:
一、使用 Python 脚本手动映射字段
该方法通过逐条解析 ShareGPT 的 conversations 字段,将其重构成 OpenAI 格式的 messages 列表,适用于对数据可控性要求高、需嵌入清洗或过滤逻辑的场景。
1、读取原始 *_sharegpt.jsonl 文件,按行加载 JSON 对象。
2、对每个样本提取 conversations 列表,遍历其中每条字典项。
3、将 "from": "human" 映射为 {"role": "user", "content": value},将 "from": "gpt" 映射为 {"role": "assistant", "content": value},忽略 "from": "function_call" 或其他非标准角色项。
4、将转换后的 messages 列表写入新文件,每行一个符合 OpenAI 格式的 JSON 对象。
5、确保输出字段仅保留 role 和 content,禁止添加 system、name、tool_calls 等扩展字段,除非目标框架明确支持。
二、利用 LlamaFactory 内置数据对齐模块
LlamaFactory 的 align_dataset() 流程原生支持 ShareGPT → OpenAI 格式语义对齐,无需额外编写转换逻辑,适合已集成该框架的训练管线。
1、在 dataset_info.json 中为数据集指定 type: "sharegpt" 和 format: "openai"。
2、确保 dataset_attr 配置中设置 is_chat: true 且 train_on_prompt: false。
3、运行 llamafactory-cli train 命令时,系统自动触发 align_dataset(),将 conversations 拆解并重排为 messages 序列。
4、检查日志输出中是否出现 “Aligned to OpenAI chat format” 提示,确认未启用 --packing 参数,否则会破坏 messages 的独立样本结构。
三、调用 Medusa 提供的通用格式桥接工具
Medusa 的 data_generation/convert_to_openai.py 工具专为跨格式桥接设计,兼容 ShareGPT 输入与 OpenAI 输出,适配多阶段训练流程。
1、确认已安装 medusa 包并定位到 data_generation 目录。
2、执行命令:python convert_to_openai.py --input_path your_data_sharegpt.jsonl --output_path output_openai.jsonl。
3、工具默认将 human/gpt 角色严格映射至 user/assistant,自动跳过含非法 control characters 的 value 字段,避免 JSON 解析失败。
4、输出文件每行为一个独立 JSON 对象,包含字段:{"messages": [{"role": "...", "content": "..."}, ...]}。
四、基于 Hugging Face Datasets 的 on-the-fly 转换
该方法不生成中间文件,在数据加载阶段动态完成格式转换,节省磁盘空间,适合大规模数据流式处理。
1、使用 load_dataset("json", data_files="data.jsonl") 加载 ShareGPT 数据集。
2、定义 map 函数:对每个样本提取 conversations,构建 messages 列表,返回 {"messages": messages}。
3、调用 dataset.map() 并设置 remove_columns=["conversations"],保留仅含 messages 的结构。
4、保存为新数据集时指定 writer_batch_size=1000,避免内存溢出导致 messages 列表截断。











