https://llamafactory.readthedocs.io/zh-cn/latest/getting_started/data_preparation.html
在构建和优化大型语言模型的过程中,数据集的质量和格式至关重要。本文将详细介绍如何准备符合要求的数据集,包括数据格式、内容要求以及在 dataset_info.json 中的配置方法。
dataset_info.json 文件包含了所有经过预处理的本地数据集和在线数据集的配置信息。如果您希望使用自定义数据集,请务必在 dataset_info.json 文件中添加对数据集及其内容的定义。
目前,我们支持以下两种数据集格式:
Alpaca 格式适用于大多数简单的问答和对话场景,特别是指令监督微调和预训练任务。以下是不同任务的数据集格式要求。
示例数据集:指令监督微调样例数据集
指令监督微调通过让模型学习详细的指令以及对应的回答,优化模型在特定指令下的表现。数据集格式如下:
json展开代码[
  {
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "output": "模型回答(必填)",
    "system": "系统提示词(选填)",
    "history": [
      ["第一轮指令(选填)", "第一轮回答(选填)"],
      ["第二轮指令(选填)", "第二轮回答(选填)"]
    ]
  }
]
字段说明:
instruction:人类给出的指令。input:人类的输入,可能是指令的补充信息。output:模型应生成的回答。system:系统提示词,可用于设定对话的背景或角色。history:对话历史,由多个指令和回答组成的列表。在进行指令监督微调时, instruction 列对应的内容会与 input 列对应的内容拼接后作为最终的人类输入,即人类输入为 instruction\ninput。而 output 列对应的内容为模型回答。
示例:
json展开代码{
  "instruction": "计算这些物品的总费用。",
  "input": "汽车 - $3000,衣服 - $100,书 - $20。",
  "output": "汽车、衣服和书的总费用为 $3000 + $100 + $20 = $3120。",
  "history": [
    ["今天会下雨吗?", "今天不会下雨,是个好天气。"],
    ["今天适合出去玩吗?", "非常适合,空气质量很好。"]
  ]
}
dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "system": "system",
    "history": "history"
  }
}
示例数据集:预训练样例数据集
预训练数据集通常由大量未标记的文本构成,用于让模型学习语言的基础表示。格式如下:
json展开代码[
  {"text": "document1"},
  {"text": "document2"}
]
字段说明:
text:文本内容,模型将学习其中的语言结构和信息。dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "columns": {
    "prompt": "text"
  }
}
偏好数据集用于奖励模型训练、DPO 训练和 ORPO 训练。通过提供优质和劣质回答,模型可以学习到更符合人类偏好的回答方式。
数据格式:
json展开代码[
  {
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "chosen": "优质回答(必填)",
    "rejected": "劣质回答(必填)"
  }
]
字段说明:
chosen:模型的优质回答。rejected:模型的劣质回答。dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "ranking": true,
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "chosen": "chosen",
    "rejected": "rejected"
  }
}
KTO 数据集类似于偏好数据集,但使用 kto_tag 来标记回答的好坏。
数据格式:
json展开代码[
  {
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "output": "模型回答(必填)",
    "kto_tag": "true 或 false(必填)"
  }
]
字段说明:
kto_tag:人类反馈标签,true 表示回答优质,false 表示回答有问题。dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "kto_tag": "kto_tag"
  }
}
多模态数据集在文本之外,额外添加了图像等其他模态的信息。目前仅支持单张图像输入。
数据格式:
json展开代码[
  {
    "instruction": "人类指令(必填)",
    "input": "人类输入(选填)",
    "output": "模型回答(必填)",
    "images": [
      "图像路径(必填)"
    ]
  }
]
字段说明:
images:包含图像路径的列表。dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "columns": {
    "prompt": "instruction",
    "query": "input",
    "response": "output",
    "images": "images"
  }
}
ShareGPT 格式支持更复杂的对话结构和角色类型,适用于需要模拟真实对话的场景。
示例数据集:指令监督微调样例数据集
ShareGPT 格式的核心是 conversations 列,它是一个对象列表,每个对象包含 from(消息来源)和 value(消息内容)。
数据格式:
json展开代码[
  {
    "conversations": [
      {
        "from": "human",
        "value": "人类指令"
      },
      {
        "from": "function_call",
        "value": "工具调用参数"
      },
      {
        "from": "observation",
        "value": "工具返回结果"
      },
      {
        "from": "gpt",
        "value": "模型回答"
      }
    ],
    "system": "系统提示词(选填)",
    "tools": "工具描述(选填)"
  }
]
字段说明:
conversations:对话列表,包含不同角色的消息。from:消息来源,如 human、gpt、function_call、observation 等。value:消息内容。system:系统提示词。tools:工具描述,用于辅助对话。注意:human 和 observation 必须出现在奇数位置,gpt 和 function_call 必须出现在偶数位置。
dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "conversations",
    "system": "system",
    "tools": "tools"
  }
}
示例数据集:偏好数据样例数据集
ShareGPT 格式的偏好数据集需要在 chosen 和 rejected 字段中分别提供优质和劣质的回复。
数据格式:
json展开代码[
  {
    "conversations": [
      {
        "from": "human",
        "value": "人类指令"
      },
      {
        "from": "gpt",
        "value": "模型回答"
      }
    ],
    "chosen": {
      "from": "gpt",
      "value": "优质回答"
    },
    "rejected": {
      "from": "gpt",
      "value": "劣质回答"
    }
  }
]
dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "formatting": "sharegpt",
  "ranking": true,
  "columns": {
    "messages": "conversations",
    "chosen": "chosen",
    "rejected": "rejected"
  }
}
OpenAI 格式是 ShareGPT 格式的特殊情况,主要区别在于消息的结构。
数据格式:
json展开代码[
  {
    "messages": [
      {
        "role": "system",
        "content": "系统提示词(选填)"
      },
      {
        "role": "user",
        "content": "人类指令"
      },
      {
        "role": "assistant",
        "content": "模型回答"
      }
    ]
  }
]
字段说明:
messages:消息列表,每个消息包含 role 和 content。role:消息的角色,如 system、user、assistant。content:消息内容。dataset_info.json 配置:
json展开代码"数据集名称": {
  "file_name": "data.json",
  "formatting": "sharegpt",
  "columns": {
    "messages": "messages"
  },
  "tags": {
    "role_tag": "role",
    "content_tag": "content",
    "user_tag": "user",
    "assistant_tag": "assistant",
    "system_tag": "system"
  }
}
准备高质量的数据集是训练优秀语言模型的基础。无论是采用 Alpaca 格式还是 ShareGPT 格式,都需要严格遵守数据格式和字段要求。同时,在 dataset_info.json 中正确配置数据集的信息,确保模型能够正确读取和处理数据。


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!