📍 你在这里 训练进阶 · 第 3 篇 / 共 9 篇

← 上一篇 大模型微调基础:LoRA 原理与实践 · 下一篇 → 大模型微调步骤及示例

训练集准备

格式

[
  {
    "instruction": "总结以下文本的核心内容",
    "input": "人工智能(AI)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。近年来,随着大数据、算力和算法的突破,AI在医疗、金融、教育等领域快速落地:医疗上,AI辅助诊断系统能提高疾病筛查效率;金融领域,AI可用于风险评估和 fraud 检测;教育中,个性化学习系统帮助学生定制学习计划。但AI也面临伦理争议,如数据隐私、算法偏见等问题。",
    "output": "人工智能是研究模拟人类智能的技术科学,近年因大数据等突破在医疗、金融、教育等领域快速应用,同时面临数据隐私、算法偏见等伦理争议。",
    "system": "你是一个文本总结助手,需用简洁语言提炼核心信息,不超过200字。"
  },
  {
    "instruction": "总结以下文本的核心内容",
    "input": "地球是太阳系八大行星之一,按离太阳由近及远的次序排为第三颗。它有一个天然卫星——月球,二者组成一个天体系统——地月系统。地球赤道半径约6378公里,极半径约6357公里,平均半径约6371公里。地球表面积5.1亿平方公里,其中71%为海洋,29%为陆地,在太空上看地球呈蓝色。",
    "output": "地球是太阳系第三大行星,有天然卫星月球,组成地月系统;平均半径约6371公里,表面积5.1亿平方公里,71%为海洋,呈蓝色。",
    "system": "你是一个地理知识总结助手,需准确提炼地球的关键特征。"
  }
]

数据集格式

Alpaca格式和ShareGPT格式是当前大语言模型(LLM)微调中最常用的两种数据集格式,分别针对单轮指令任务和多轮对话场景设计,以下是详细解析:

一、Alpaca格式:结构化指令微调的基石

(原文档附带的附件请到语雀源文档查看)

(原文档附带的附件请到语雀源文档查看)

起源与用途:
Alpaca格式由斯坦福大学团队提出,最初用于微调LLaMA模型以生成Alpaca-7B。其核心思想是通过“指令-输入-输出”三元组让模型学习执行具体任务,适用于问答、翻译、代码生成等单轮指令场景。

核心结构:

{
  "instruction": "任务描述(必填)",  // 明确告诉模型要做什么,例如"写一封英文邮件"
  "input": "额外输入(选填)",     // 提供任务相关的补充信息,如"参会者包括部门经理"
  "output": "预期输出(必填)",     // 模型应生成的答案,如邮件正文内容
  "system": "系统提示(选填)",     // 设定模型角色,如"你是一位专业秘书"
  "history": [指令-回答对列表]     // 多轮对话历史,如[("previous instruction", "previous output")]
}

典型示例:

{
  "instruction": "将以下句子翻译成法语",
  "input": "Hello, how are you?",
  "output": "Bonjour, comment ça va?",
  "system": "你是一位专业翻译员"
}
  • 特点:
    • 结构简单,适合快速构建任务型数据集。
    • 支持扩展字段(如system和history)以适应复杂场景。
    • 数据集规模通常在数万条(如Alpaca-52k约5.2万条),文件大小约40MB。

应用场景:

  • 训练模型执行明确指令,如生成报告、解析数据、代码补全等。
  • 作为基础格式,衍生出Alpaca-cleaned、Alpaca-GPT4等优化版本。

二、ShareGPT格式:多轮对话的“活字典”

起源与用途:
ShareGPT格式源自同名平台用户分享的ChatGPT对话记录,被Vicuna、LLaMA-2-Chat等模型用于训练自然流畅的多轮交互能力。其核心是记录对话的完整上下文,包括用户和模型的多轮交替发言。

核心结构:

{
  "id": "对话唯一标识符",        // 可选,用于区分不同对话
  "system": "系统提示(选填)",  // 设定对话背景,如"你是一位心理咨询师"
  "conversations": [           // 对话轮次列表
    {"from": "human", "value": "用户发言内容"},
    {"from": "gpt", "value": "模型回应内容"},
    ...
  ],
  "tools": [工具描述列表]      // 可选,记录模型调用的外部工具信息
}

典型示例:

{
  "system": "你是一位旅行规划师",
  "conversations": [
    {"from": "human", "value": "推荐一个适合亲子游的国内城市"},
    {"from": "gpt", "value": "成都很适合亲子游,有大熊猫基地..."},
    {"from": "human", "value": "那里有适合孩子的餐厅吗?"},
    {"from": "gpt", "value": "有的,比如XX餐厅提供儿童套餐..."}
  ]
}
  • 特点:
    • 支持多角色区分(如human、gpt、observation),可记录工具调用等复杂交互。
    • 对话历史完整,适合训练模型理解上下文和保持对话连贯性。
    • 数据规模较大,例如Vicuna训练集包含约7万条对话。

应用场景:

  • 训练聊天机器人、虚拟助手等需要自然交互的模型。
  • 支持多模态扩展,例如包含图像路径的对话(需配合images字段)。

三、核心对比与选择建议

维度 Alpaca格式 ShareGPT格式
核心目标 让模型学会执行具体指令 让模型掌握自然流畅的多轮对话
数据结构 单条任务(instruction/input/output) 多轮对话(conversations列表)
典型场景 写邮件、翻译、代码生成 闲聊、心理咨询、旅行规划
字段灵活性 结构化,字段固定 支持扩展角色(如工具调用)
数据集规模 中小型(数万条) 中大型(数万至数十万条)
适用模型 Vicuna、Alpaca、LLaMA LLaMA-2-Chat、ChatGLM-6B

选择建议:

  • 优先Alpaca:若任务为单轮指令(如客服工单处理、API调用),或需快速构建结构化数据集。
  • 优先ShareGPT:若任务涉及多轮对话(如智能客服、心理咨询),或需模型理解复杂上下文。
  • 混合使用:可结合两种格式提升模型泛化能力,例如在对话数据中混入指令任务。

四、格式转换与工具支持

实际应用中,可通过工具将两种格式互相转换。例如:

  1. Alpaca转ShareGPT:将单条指令任务包装为一轮对话,添加system和conversations字段。
  2. ShareGPT转Alpaca:提取对话中的最后一轮human发言作为instruction,gpt回应作为output。

LLaMA-Factory、EasyDataset等工具已支持两种格式的自动转换和混合训练,开发者可根据需求选择合适的处理流程。

通过合理选择和使用这两种格式,可高效地将领域知识转化为模型可学习的数据,显著提升大模型在特定场景下的表现。

数据集配置

这份文档主要围绕如何在项目中使用不同格式的数据集展开,涵盖了数据集的配置、不同格式数据集的特点及使用方式等内容。以下为您详细介绍:

1. 数据集配置概述

  • 核心配置文件:dataset_info.json 包含了所有可用数据集的信息。若要使用自定义数据集,需在该文件中添加数据集描述,并修改 dataset: 数据集名称 配置。
  • 文件存放位置:dataset_info.json 应放在 dataset_dir 目录下,该参数可修改,默认值为 ./data。
  • 支持的数据集格式和文件类型:目前支持 alpaca 和 sharegpt 格式的数据集,允许的文件类型有 json、jsonl、csv、parquet 和 arrow。

2. dataset_info.json 数据集描述示例

以下是一个完整的 dataset_info.json 中数据集描述的示例:

"my_dataset": {
  "hf_hub_url": "https://huggingface.co/datasets/my_dataset",
  "formatting": "alpaca",
  "ranking": false,
  "subset": "train_subset",
  "split": "train",
  "folder": "data_folder",
  "num_samples": 1000,
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "history": "history",
    "messages": "conversations",
    "system": "system",
    "tools": "tools",
    "images": "images",
    "videos": "videos",
    "audios": "audios",
    "chosen": "chosen",
    "rejected": "rejected",
    "kto_tag": "kto_tag"
  },
  "tags": {
    "role_tag": "from",
    "content_tag": "value",
    "user_tag": "human",
    "assistant_tag": "gpt",
    "observation_tag": "observation",
    "function_tag": "function_call",
    "system_tag": "system"
  }
}

在这个示例中,我们定义了一个名为 my_dataset 的数据集,它来自 Hugging Face 仓库,格式为 alpaca,使用训练子集,共选取 1000 个样本,并指定了各列的名称和消息标签。

3. Alpaca 格式数据集

指令监督微调数据集

  • 数据结构:由 instruction、input、output、system 和 history 等列组成。
  • 使用方式:instruction 和 input 拼接作为提示词,output 作为模型回答,system 作为系统提示词,history 存储历史对话。
  • 示例数据:
[
  {
    "instruction": "计算 2 + 3 的结果",
    "input": "",
    "output": "<think>先将 2 和 3 相加得到 5。</think>5",
    "system": "你是一个数学助手",
    "history": [
      ["计算 1 + 1 的结果", "2"]
    ]
  }
]
  • dataset_info.json 描述:
"math_dataset": {
  "file_name": "math_data.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "system": "system",
    "history": "history"
  }
}

预训练数据集

  • 数据结构:只有 text 列。
  • 使用方式:仅 text 列内容用于模型学习。
  • 示例数据:
[
  {"text": "自然语言处理是人工智能的一个重要领域。"},
  {"text": "深度学习在图像识别中取得了显著成果。"}
]
  • dataset_info.json 描述:
"pretrain_dataset": {
  "file_name": "pretrain_data.json",
  "columns": {
    "prompt": "text"
  }
}

偏好数据集

  • 数据结构:包含 instruction、input、chosen 和 rejected 列。
  • 使用方式:用于奖励模型训练等,chosen 提供更优回答,rejected 提供更差回答。
  • 示例数据:
[
  {
    "instruction": "描述苹果的特点",
    "input": "",
    "chosen": "苹果是一种常见的水果,富含维生素,口感清甜多汁。",
    "rejected": "苹果就是一种水果。"
  }
]
  • dataset_info.json 描述:
"preference_dataset": {
  "file_name": "preference_data.json",
  "ranking": true,
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "chosen": "chosen",
    "rejected": "rejected"
  }
}

4. Sharegpt 格式数据集

指令监督微调数据集

  • 数据结构:conversations 列包含多个角色的对话,还可包含 system 和 tools 列。
  • 使用方式:支持更多角色种类,human 和 observation 奇数位置,gpt 和 function 偶数位置,默认 gpt 和 function 用于学习。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "查询天气"
      },
      {
        "from": "function_call",
        "value": "{\"name\": \"get_weather\", \"parameters\": {\"location\": \"北京\"}}"
      },
      {
        "from": "observation",
        "value": "北京当前天气晴朗,气温 25 摄氏度。"
      },
      {
        "from": "gpt",
        "value": "北京当前天气晴朗,气温 25 摄氏度。"
      }
    ],
    "system": "你是一个天气查询助手",
    "tools": "get_weather 函数可查询天气"
  }
]
  • dataset_info.json 描述:
"weather_dataset": {
  "file_name": "weather_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "system": "system",
    "tools": "tools"
  }
}

偏好数据集

  • 数据结构:conversations 列包含对话,chosen 和 rejected 列分别提供更优和更差消息。
  • 使用方式:与 alpaca 偏好数据集类似。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "推荐一部电影"
      },
      {
        "from": "gpt",
        "value": "推荐《泰坦尼克号》,这是一部经典的爱情电影。"
      }
    ],
    "chosen": {
      "from": "gpt",
      "value": "推荐《泰坦尼克号》,它不仅有浪漫的爱情故事,还有宏大的灾难场景,非常值得一看。"
    },
    "rejected": {
      "from": "gpt",
      "value": "有部电影还不错。"
    }
  }
]
  • dataset_info.json 描述:
"movie_preference_dataset": {
  "file_name": "movie_preference_data.json",
  "formatting": "sharegpt",
  "ranking": true,
  "columns": {
    "messages": "conversations",
    "chosen": "chosen",
    "rejected": "rejected"
  }
}

KTO 数据集

  • 数据结构:conversations 列包含对话,kto_tag 列包含人类反馈。
  • 使用方式:用于特定的训练场景。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "翻译:Hello"
      },
      {
        "from": "gpt",
        "value": "你好"
      }
    ],
    "kto_tag": true
  }
]
  • dataset_info.json 描述:
"kto_dataset": {
  "file_name": "kto_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "kto_tag": "kto_tag"
  }
}

多模态图像数据集

  • 数据结构:conversations 列包含对话,images 列包含图像路径。
  • 使用方式:图像数量与文本中 <image> 标记数量一致。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "<image>描述这幅图像"
      },
      {
        "from": "gpt",
        "value": "图像中有一朵盛开的花朵。"
      }
    ],
    "images": ["flower.jpg"]
  }
]
  • dataset_info.json 描述:
"image_dataset": {
  "file_name": "image_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "images": "images"
  }
}

多模态视频数据集

  • 数据结构:conversations 列包含对话,videos 列包含视频路径。
  • 使用方式:视频数量与文本中 <video> 标记数量一致。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "<video>总结视频内容"
      },
      {
        "from": "gpt",
        "value": "视频介绍了一场精彩的足球比赛。"
      }
    ],
    "videos": ["football_match.mp4"]
  }
]
  • dataset_info.json 描述:
"video_dataset": {
  "file_name": "video_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "videos": "videos"
  }
}

多模态音频数据集

  • 数据结构:conversations 列包含对话,audios 列包含音频路径。
  • 使用方式:音频数量与文本中 <audio> 标记数量一致。
  • 示例数据:
[
  {
    "conversations": [
      {
        "from": "human",
        "value": "<audio>转录音频内容"
      },
      {
        "from": "gpt",
        "value": "音频中有人在说你好。"
      }
    ],
    "audios": ["hello_audio.wav"]
  }
]
  • dataset_info.json 描述:
"audio_dataset": {
  "file_name": "audio_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "audios": "audios"
  }
}

5. OpenAI 格式数据集

  • 数据结构:messages 列包含多个角色的消息,第一条可能是系统提示词。
  • 使用方式:是 sharegpt 格式的特殊情况。
  • 示例数据:
[
  {
    "messages": [
      {
        "role": "system",
        "content": "你是一个智能客服"
      },
      {
        "role": "user",
        "content": "我要咨询产品售后问题"
      },
      {
        "role": "assistant",
        "content": "请您提供产品的购买时间和订单号,我会为您处理售后问题。"
      }
    ]
  }
]
  • dataset_info.json 描述:
"openai_dataset": {
  "file_name": "openai_data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "messages"
  },
  "tags": {
    "role_tag": "role",
    "content_tag": "content",
    "user_tag": "user",
    "assistant_tag": "assistant",
    "system_tag": "system"
  }
}

6. 思维链处理提示

如果模型本身具备推理能力(如 Qwen3)而数据集不包含思维链,LLaMA - Factory 会自动为数据添加空思维链。当 enable_thinking 为 True 时(慢思考,默认),空思维链会添加到模型回答中并且计算损失,否则会添加到用户指令中并且不计算损失(快思考)。训练和推理时需保持 enable_thinking 参数一致。若希望训练包含思维链的数据时使用慢思考,训练不包含思维链的数据时使用快思考,可设置 enable_thinking 为 None,但该功能较复杂,需谨慎使用。

— 感谢阅读 —

一起交流

分享你的思考,让讨论更进一步。