You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将JSON转为GPT-3微调所需JSONL并合并同作者ID内容

实现方案

核心逻辑说明

  • 第一步:遍历原始对话列表,先合并相同作者ID的连续对话内容,避免同一用户连续发送的多条消息被拆分成多个无效样本
  • 第二步:将合并后的对话按照ID123在前、ID456在后的顺序配对,每对对应一条JSONL样本
  • 第三步:遵循GPT-3微调的官方最佳实践,给prompt末尾加上固定分隔符(示例用\n\n###\n\n),给completion开头加空格、结尾加停止符(示例用\n),避免模型生成异常内容

完整Python实现代码

import json
from typing import List, Dict

def convert_dialogue_to_jsonl(raw_dialogues: List[Dict], output_path: str) -> None:
    # 合并同ID的连续对话
    merged_msgs = []
    for msg in raw_dialogues:
        user_id = msg["user_id"]
        content = msg["content"].strip()
        if not content:
            continue
        if merged_msgs and merged_msgs[-1]["user_id"] == user_id:
            merged_msgs[-1]["content"] += f" {content}"
        else:
            merged_msgs.append({"user_id": user_id, "content": content})
    
    # 配对生成微调样本
    samples = []
    idx = 0
    while idx < len(merged_msgs) - 1:
        if merged_msgs[idx]["user_id"] == 123 and merged_msgs[idx+1]["user_id"] == 456:
            prompt = merged_msgs[idx]["content"] + "\n\n###\n\n"
            completion = " " + merged_msgs[idx+1]["content"] + "\n"
            samples.append({"prompt": prompt, "completion": completion})
            idx += 2
        else:
            idx += 1
    
    # 写入JSONL文件
    with open(output_path, "w", encoding="utf-8") as f:
        for sample in samples:
            f.write(json.dumps(sample, ensure_ascii=False) + "\n")

# 调用示例
if __name__ == "__main__":
    # 替换为你的原始数据读取逻辑
    with open("raw_dialogue.json", "r", encoding="utf-8") as f:
        raw_data = json.load(f)
    convert_dialogue_to_jsonl(raw_data, "gpt3_finetune_data.jsonl")

效果样例参考

原始JSON输入样例

[
    {"user_id": 123, "content": "你好"},
    {"user_id": 123, "content": "请问GPT-3微调要准备什么数据?"},
    {"user_id": 456, "content": "首先需要整理对话数据"},
    {"user_id": 456, "content": "然后转换为符合要求的JSONL格式即可"},
    {"user_id": 123, "content": "好的我懂了谢谢"},
    {"user_id": 456, "content": "不客气"}
]

输出JSONL样例

{"prompt": "你好 请问GPT-3微调要准备什么数据?\n\n###\n\n", "completion": " 首先需要整理对话数据 然后转换为符合要求的JSONL格式即可\n"}
{"prompt": "好的我懂了谢谢\n\n###\n\n", "completion": " 不客气\n"}

注意事项

  • 可根据实际使用场景调整分隔符和停止符,只需要保证训练和推理时使用的分隔符完全一致即可
  • 代码会自动过滤空内容的消息,避免生成无效训练样本
  • 若原始对话存在多轮交替的场景,代码会自动按顺序配对所有符合123接456的对话对,不会遗漏有效数据

内容的提问来源于stack exchange,提问作者Dispay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:36:04