PyTorch Torchtune项目中的聊天数据集使用指南
什么是聊天数据集
聊天数据集是一种特殊格式的对话数据集,它记录了用户和AI助手之间的多轮对话交互。与传统的自由文本数据集不同,聊天数据集具有明确的结构化格式,能够更好地训练模型进行对话式响应。
典型的聊天数据集示例如下:
[
{"role": "user", "content": "生命、宇宙及一切的终极答案是什么?"},
{"role": "assistant", "content": "答案是42。"},
{"role": "user", "content": "这太荒谬了"},
{"role": "assistant", "content": "我也这么觉得。"},
]
为什么使用聊天数据集
- 结构化对话训练:相比自由文本预测,聊天数据集能更好地训练模型理解对话上下文
- 多轮对话能力:帮助模型学习如何维持连贯的对话流
- 角色区分:明确区分用户输入和AI响应,提高对话质量
在Torchtune中使用聊天数据集
Torchtune提供了chat_dataset
构建器作为主要入口点,支持从本地文件或Hugging Face数据集加载聊天格式数据。
基本使用示例
from torchtune.models.mistral import mistral_tokenizer
from torchtune.datasets import chat_dataset
# 初始化分词器
m_tokenizer = mistral_tokenizer(
path="/tmp/Mistral-7B-v0.1/tokenizer.model",
prompt_template="torchtune.models.mistral.MistralChatTemplate",
max_seq_len=8192,
)
# 加载聊天数据集
ds = chat_dataset(
tokenizer=m_tokenizer,
source="json",
data_files="data/my_data.json",
split="train",
conversation_column="conversations",
conversation_style="sharegpt",
train_on_input=True,
new_system_prompt=None,
)
配置文件示例
tokenizer:
_component_: torchtune.models.mistral.mistral_tokenizer
path: /tmp/Mistral-7B-v0.1/tokenizer.model
prompt_template: torchtune.models.mistral.MistralChatTemplate
max_seq_len: 8192
dataset:
_component_: torchtune.datasets.chat_dataset
source: json
data_files: data/my_data.json
split: train
conversation_column: conversations
conversation_style: sharegpt
train_on_input: True
new_system_prompt: null
聊天数据集的常见格式
聊天数据集通常包含一个名为"conversations"或"messages"的列,其中每个样本包含一个主题下的多轮对话消息列表。消息可能包括系统提示、用户与助手的多轮对话以及工具调用/返回。
标准格式示例
| conversations |
|--------------------------------------------------------------|
| [{"role": "user", "content": "今天星期几?"}, |
| {"role": "assistant", "content": "今天是星期二。"}] |
| [{"role": "user", "content": "那明天呢?"}, |
| {"role": "assistant", "content": "明天是星期三。"}] |
从不同来源加载聊天数据集
从Hugging Face加载
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import chat_dataset
g_tokenizer = gemma_tokenizer("/tmp/gemma-7b/tokenizer.model")
ds = chat_dataset(
tokenizer=g_tokenizer,
source="Open-Orca/SlimOrca-Dedup",
conversation_column="conversations",
conversation_style="sharegpt",
split="train",
)
从本地或远程文件加载
from torchtune.models.gemma import gemma_tokenizer
from torchtune.datasets import chat_dataset
g_tokenizer = gemma_tokenizer("/tmp/gemma-7b/tokenizer.model")
ds = chat_dataset(
tokenizer=g_tokenizer,
source="json",
conversation_column="conversations",
conversation_style="sharegpt",
data_files="data/my_data.json",
split="train",
)
指定对话风格
Torchtune支持多种标准化的对话格式转换:
ShareGPT风格
{
"conversations": [
{
"from": "system" | "human" | "gpt",
"value": <message>,
},
...
]
}
OpenAI风格
{
"messages": [
{
"role": "system" | "user" | "assistant",
"content": <message>,
},
...
]
}
如果你的数据集不符合这些标准格式,需要创建自定义的消息转换器。
高级配置技巧
重命名列名
当数据集中的对话列名不是默认值时,可以使用conversation_column
参数指定:
ds = chat_dataset(
tokenizer=g_tokenizer,
source="json",
conversation_column="dialogue", # 自定义列名
conversation_style="sharegpt",
data_files="data/my_data.json",
split="train",
)
聊天模板
聊天模板的定义方式与指令数据集中的模板相同,可以使用Torchtune提供的各种预定义模板。
内置聊天数据集
Torchtune提供了一些内置的聊天数据集,例如SlimOrcaDataset
,可以直接使用而无需额外配置。
最佳实践
- 数据清洗:确保对话数据质量,移除不完整或低质量的对话
- 长度控制:根据模型的最大序列长度合理截断长对话
- 角色一致性:保持角色标识符在整个数据集中的一致性
- 平衡数据:确保用户和助手的对话轮次比例合理
通过合理使用Torchtune的聊天数据集功能,开发者可以高效地训练出高质量的对话模型。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考