数据集#
我们在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. 消息的角色。可以是user或assistant。content:string. 消息的内容。
我们正在努力支持自定义消息键和角色名称。请保持关注。
提示:
请确保消息内容如下:
从用户消息开始。
按正确顺序排列。该流程不会检查消息的顺序。
用户和助手成对出现(即消息长度应为偶数)。如果对话以用户消息结束,流程将自动修剪最后一条用户消息。
确保
content内容不为空。如果content为空,管道会为其添加一个空格。
对话模板#
在将对话输入模型之前,需要进行格式化处理。目前,我们已经为以下模型预设了对话模板:
模板名称 |
填充示例 |
详细模板 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
– |
|
|
– |
|
|
– |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
– |
|
|
– |
|
|
– |
|
|
– |
|
|
与 |
|
|
|
|
|
|
将模板名称传递给--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参数传递empty或empty_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"
}
]
}
}
]
}