数据集#

我们在data目录下提供了多个可用数据集。您可以通过运行以下命令下载全部数据:

cd data && ./download.sh all && cd -

你可以将all替换为特定数据集名称来仅下载该数据集(例如./download.sh alpaca)。

强烈推荐使用自定义数据集,因为这样用户可以在各种源数据集上应用自己的提示工程技术。只要生成的数据集遵循以下格式,它们就可以作为我们管道的输入 :hugs:

通用数据集格式#

要指定模型微调的输入,用户可以在指定的数据集目录下提供一系列.json文件。例如,

|- path_to_dataset
  |- data_1.json
  |- data_2.json
  |- another_data.json
  |- ...

目前,我们仅支持单个.json文件进行推理。

每个json文件应遵循以下格式(例如,三个实例包含四个键),

{
  "type": "TYPE",
  "instances": [
    {
        "KEY_1": "VALUE_1.1",
        "KEY_2": "VALUE_1.2",
        "KEY_3": "VALUE_1.3",
        "KEY_4": "VALUE_1.4",
    },
    {
        "KEY_1": "VALUE_2.1",
        "KEY_2": "VALUE_2.2",
        "KEY_3": "VALUE_2.3",
        "KEY_4": "VALUE_2.4",
    },
    {
        "KEY_1": "VALUE_3.1",
        "KEY_2": "VALUE_3.2",
        "KEY_3": "VALUE_3.3",
        "KEY_4": "VALUE_3.4",
    },
  ]
}

其中TYPE表示数据集类型,并定义了键集合 { KEY_1, KEY_2, ... }及其对应的解释。支持的类型列表如下所示。

支持的数据集及详细格式#

对话#

数据格式#

对话数据通常用于监督微调(SFT)过程。我们目前支持ShareGPT格式的对话数据:

A conversation dataset
{
  "type": "conversation",
  "instances": [
    {
      "conversation_id": "CONVERSATION_ID",
      "system": "SYSTEM_PROPMT",
      "tools": ["TOOL_DESCRIPTION_1","TOOL_DESCRIPTION_2","TOOL_DESCRIPTION_X"],
      "messages": [
        {
            "role": "user",
            "content": "USER_INPUT_1"
        },
        {
            "role": "assistant",
            "content": "ASSISTANT_RESPONSE_1"
        },
        {
            "role": "user",
            "content": "USER_INPUT_2"
        },
        {
            "role": "assistant",
            "content": "ASSISTANT_RESPONSE_2"
        }
      ]
    },
    {
      "conversation_id": "CONVERSATION_ID",
      "system": "SYSTEM_PROPMT",
      "tools": ["TOOL_DESCRIPTION_1"],
      "messages": [
        {
            "role": "user",
            "content": "USER_INPUT_1"
        },
        {
            "role": "assistant",
            "content": "ASSISTANT_RESPONSE_1"
        }
      ]
    }
  ]
}

数据类型:

  • conversation_id: Optional[Any]. 对话的唯一标识符。conversation_id仅用于方便追踪对话,不会在流程中使用。

  • system: Optional[string]. 用于启动对话的系统提示词。

  • tools: Optional[List[string]]. 对话中使用的一系列工具列表。

  • messages: List[Dict]. 对话中的消息列表。每条消息包含以下字段:

    • role: string. 消息的角色。可以是userassistant

    • content: string. 消息的内容。

我们正在努力支持自定义消息键和角色名称。请保持关注。

提示:

  • 请确保消息内容如下:

    1. 从用户消息开始。

    2. 按正确顺序排列。该流程不会检查消息的顺序。

    3. 用户和助手成对出现(即消息长度应为偶数)。如果对话以用户消息结束,流程将自动修剪最后一条用户消息。

    4. 确保content内容不为空。如果content为空,管道会为其添加一个空格。

对话模板#

在将对话输入模型之前,需要进行格式化处理。目前,我们已经为以下模型预设了对话模板:

模板名称

填充示例

详细模板

chatglm3

[gMASK]sop<|system|>
LMFlow 团队 开发的 聊天机器人。<|user|>
谁?<|assistant|>
LMFlow 团队 开发的 聊天机器人。<|user|>
多大了?<|assistant|>
不像 人类 那样 变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。

Link

chatml

<|im_start|>system
你是由LMFlow团队开发的聊天机器人。<|im_end|>
<|im_start|>user
你是谁?<|im_end|>
<|im_start|>assistant
我是由LMFlow团队开发的聊天机器人。<|im_end|>
<|im_start|>user
你多大了?<|im_end|>
<|im_start|>assistant
我不像人类那样会变老。我作为软件存在,所以没有传统意义上的年龄概念。<|im_end|>

Link

deepseek_v2

<|begin▁of▁sentence|>你 LMFlow 团队 开发的 聊天机器人。

用户: 谁?

助手: 我是 LMFlow 团队 开发的 聊天机器人。<|end▁of▁sentence|>用户: 多大了?

助手: 我不像 人类 那样 会变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。<|end▁of▁sentence|>

Link

deepseek_v3

Link

deepseek_r1

Link

deepseek_r1_distill

Link

gemma

LMFlow 团队 开发的 聊天机器人。用户
谁?
模型
LMFlow 团队 开发的 聊天机器人。
用户
了?
模型
不像 人类 那样 变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。

Link

hymba

System
你是由LMFlow团队开发的聊天机器人。
{"name": "generate_qrcode", "description": "为给定文本生成二维码", "parameters": {"type": "object", "properties": {"text": {"type": "string", "description": "要编码到二维码中的文本"}}, "required": ["text"]}}

User
你是谁?
Assistant
我是由LMFlow团队开发的聊天机器人。
User
你多大了?
Assistant
我不像人类那样会变老。作为一个软件存在,我没有传统意义上的年龄概念。

Link

internlm2

<|im_start|>system
LMFlow 团队 开发的 聊天机器人。<|im_end|>
<|im_start|>user
谁?<|im_end|>
<|im_start|>assistant
LMFlow 团队 开发的 聊天机器人。<|im_end|>
<|im_start|>user
多大了?<|im_end|>
<|im_start|>assistant
我不像人类那样有年龄概念。作为软件程序,我不具备传统意义上的年龄属性。<|im_end|>

Link

llama3

<|begin_of_text|><|start_header_id|>system<|end_header_id|>

LMFlow 团队 开发的 聊天机器人。<|eot_id|><|start_header_id|>user<|end_header_id|>

谁?<|eot_id|><|start_header_id|>assistant<|end_header_id|>

LMFlow 团队 开发的 聊天机器人。<|eot_id|><|start_header_id|>user<|end_header_id|>

多大了?<|eot_id|><|start_header_id|>assistant<|end_header_id|>

我不像人类那样会变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。<|eot_id|>

Link

llama2

[INST] <>
LMFlow 团队 开发 聊天机器人
<>

谁? [/INST] LMFlow 团队 开发 聊天机器人[INST] 了? [/INST] 不像 人类 那样 变老作为 一个 软件 没有 传统 意义上 年龄 概念

Link

phi3

<|system|>
LMFlow 团队 开发的 聊天机器人。<|end|>
<|user|>
谁?<|end|>
<|assistant|>
LMFlow 团队 开发的 聊天机器人。<|end|>
<|user|>
多大了?<|end|>
<|assistant|>
我不像人类那样会变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。<|end|>
<|endoftext|>

Link

qwen2

<|im_start|>system
LMFlow 团队 开发的 聊天机器人。<|im_end|>
<|im_start|>user
谁?<|im_end|>
<|im_start|>assistant
LMFlow 团队 开发的 聊天机器人。<|im_end|>
<|im_start|>user
多大了?<|im_end|>
<|im_start|>assistant
不像 人类 那样 会变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄 概念。<|im_end|>

Link

qwen2_5

Link

qwen2_5_1m

Link

qwen2_5_math

Link

qwen_qwq

Link

yi

chatml 相同

Link

yi1_5

LMFlow 团队 开发的 聊天机器人 。<|im_start|>用户
谁?<|im_end|>
<|im_start|>助手
LMFlow 团队 开发的 聊天机器人 。<|im_end|>
<|im_start|>用户
多大了?<|im_end|>
<|im_start|>助手
不会 人类 那样 变老 作为 一个 软件 不存在 传统 意义上 年龄 概念 。<|im_end|>

Link

zephyr

<|system|>
LMFlow 团队 开发的 聊天机器人。
<|user|>
谁?
<|assistant|>
LMFlow 团队 开发的 聊天机器人。
<|user|>
多大了?
<|assistant|>
我不像人类那样会变老。 作为 一个 软件 存在, 所以 没有 传统 意义上的 年龄概念。

Link

将模板名称传递给--conversation_template参数以应用对应的对话模板:

# scripts/run_finetune.sh
# ...
deepspeed ${deepspeed_args} \
  examples/finetune.py \
    --model_name_or_path meta-llama/Llama-2-7b-chat-hf \
    --dataset_path ${dataset_path} \
    --conversation_template llama2 \
# ...

格式化数据集

对于已应用系统提示、工具提示和模板的数据集(如下所示),用户可以通过向--conversation_template参数传递emptyempty_no_special_tokens来运行微调脚本。empty模板会在每轮对话的开头添加一个bos标记,并在每轮对话的结尾添加一个eos标记。empty_no_special_tokens则不会向对话添加任何特殊标记,只是简单拼接用户消息和助手消息。

A formatted dataset
{
  "type": "conversation",
  "instances": [
    {
      "messages": [
        {
            "role": "user",
            "content": "[INST] <<SYS>>\nYou are a helpful assistant.\n<</SYS>>\n\nHello! [/INST]"
        },
        {
            "role": "assistant",
            "content": "Hi, how are you?"
        },
        {
            "role": "user",
            "content": "[INST] Good. [/INST]"
        },
        {
            "role": "assistant",
            "content": "Glad to hear that."
        }
      ]
    },
    {
      "messages": [
        {
            "role": "user",
            "content": "[INST] <<SYS>>\nYou are a helpful assistant.\n<</SYS>>\n\nWhat's the weather like now? [/INST]"
        },
        {
            "role": "assistant",
            "content": "I'm sorry for any confusion, but as an AI, I don't have access to real-time data such as current weather conditions."
        }
      ]
    }
  ]
}

自定义对话模板#

更多详情请参阅自定义对话模板

纯文本#

这是最常见的数据集类型,每个样本仅包含原始文本。此类数据集可用作文本解码器模型的训练集,或解码器模型/编码器-解码器模型的输入。其格式示例如下(以三个实例为例),

A textonly dataset
{
  "type": "text_only",
  "instances": [
    {  "text": "SAMPLE_TEXT_1" },
    {  "text": "SAMPLE_TEXT_2" },
    {  "text": "SAMPLE_TEXT_3" },
  ]
}

例如,data/example_dataset/train/train_50.json 具有上述格式。

文本转文本#

这是最常用于推理的数据集类型,每个样本包含一对文本。此类数据集可用作文本编码器-解码器模型的训练集,或作为评估模型推理的问题-答案对。其格式如下(例如三个实例):

A text2text dataset
{
  "type": "text2text",
  "instances": [
    {
        "input": "SAMPLE_INPUT_1",
        "output": "SAMPLE_OUTPUT_1",
    },
    {
        "input": "SAMPLE_INPUT_2",
        "output": "SAMPLE_OUTPUT_2",
    },
    {
        "input": "SAMPLE_INPUT_3",
        "output": "SAMPLE_OUTPUT_3",
    },
  ]
}

例如,data/example_dataset/test/test_13.json 文件采用上述格式。

配对对话#

开发中

我们正在处理配对对话数据集,并将很快更新。

这类数据集通常用于对齐任务,例如奖励建模直接偏好优化(DPO)等。关于对话的具体要求,请参考对话数据

A paired conversation dataset
{
    "type": "paired_conversation",
    "instances": [
        {
            "chosen": {
                "conversation_id": "CONVERSATION_ID",
                "system": "SYSTEM_PROPMT",
                "tools": ["TOOL_DESCRIPTION_1","TOOL_DESCRIPTION_2","TOOL_DESCRIPTION_3"],
                "messages": [
                    {
                        "role": "user",
                        "content": "USER_INPUT_1"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_1_GOOD"
                    },
                    {
                        "role": "user",
                        "content": "USER_INPUT_2"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_2_GOOD"
                    }
                ]
            },
            "rejected": {
                "conversation_id": "CONVERSATION_ID",
                "system": "SYSTEM_PROPMT",
                "tools": ["TOOL_DESCRIPTION_1","TOOL_DESCRIPTION_2","TOOL_DESCRIPTION_3"],
                "messages": [
                    {
                        "role": "user",
                        "content": "USER_INPUT_1"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_1_BAD"
                    },
                    {
                        "role": "user",
                        "content": "USER_INPUT_2"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_2_BAD"
                    }
                ]
            }
        },
        {
            "chosen": {
                "conversation_id": "CONVERSATION_ID",
                "system": "SYSTEM_PROPMT",
                "tools": ["TOOL_DESCRIPTION_1"],
                "messages": [
                    {
                        "role": "user",
                        "content": "USER_INPUT_1"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_1_GOOD"
                    }
                ]
            },
            "rejected": {
                "conversation_id": "CONVERSATION_ID",
                "system": "SYSTEM_PROPMT",
                "tools": ["TOOL_DESCRIPTION_1"],
                "messages": [
                    {
                        "role": "user",
                        "content": "USER_INPUT_1"
                    },
                    {
                        "role": "assistant",
                        "content": "ASSISTANT_RESPONSE_1_BAD"
                    }
                ]
            }
        }
    ]
}