偏好数据集¶
- torchtune.datasets.preference_dataset(tokenizer: ModelTokenizer, *, source: str, column_map: Optional[Dict[str, str]] = None, train_on_input: bool = False, new_system_prompt: Optional[str] = None, filter_fn: Optional[Callable] = None, split: str = 'train', **load_dataset_kwargs: Dict[str, Any]) PreferenceDataset[source]¶
配置一个包含用户和模型助手之间交互的自定义偏好数据集。
此构建器函数可用于直接从yaml配置中配置自定义偏好数据集,作为
PreferenceDataset的替代方案,因为它旨在便于配置。此函数要求数据集具有“chosen”和“rejected”列。单个样本将在“chosen”和“rejected”列之间共享相同的系统+/用户提示,随后是一轮或多轮用户和助手的消息:
| chosen | rejected | |----------------------------------------|----------------------------------------| | [{"role": "user", "content": Q1}, | [{"role": "user", "content": Q1}, | | {"role": "assistant", "content": C1}] | {"role": "assistant", "content": R1}] |
这个例子将被转换为:
chosen_messages = [ Message(role="user", content="Q1"), Message(role="assistant", content="C1"), ] rejected_messages = [ Message(role="user", content="Q1"), Message(role="assistant", content="R1"), ]
这些消息列表随后会被分词用于模型训练。目前,此函数仅支持与
OpenAIToMessages相同的对话格式,不支持自定义消息格式。如果你的数据集不符合这种格式,我们建议创建一个类似于
ChosenRejectedToMessages的自定义消息转换,并在类似于preference_dataset的自定义数据集构建函数中使用它。在训练期间,提示的掩码由
train_on_input标志控制,该标志默认设置为False。如果
train_on_input为 True,提示将在训练期间使用,并影响损失。如果
train_on_input为 False,则提示被屏蔽(标记替换为 -100)。
- Parameters:
tokenizer (ModelTokenizer) – 模型使用的分词器,实现了
tokenize_messages方法。source (str) – Hugging Face 上数据集仓库的路径。对于本地数据集, 将 source 定义为数据文件类型(例如“json”、“csv”、“text”), 在
data_files中传入文件路径,并设置split="train"。有关更多详细信息,请参阅 Hugging Face 的load_dataset。column_map (可选[Dict[str, str]]) – 从消息转换
ChosenRejectedToMessages中预期的列“chosen”和“rejected”到数据集中新列名的映射。键应为“chosen”和“rejected”,值应为实际的列名。如果为None,则保留默认列“chosen”和“rejected”。train_on_input (bool) – 模型是否在提示上进行训练。默认值为 False。
new_system_prompt (可选[str]) – 如果指定,将为每个样本(包括被选中和被拒绝的)前置一个系统消息。这可以作为指导模型响应的指令。设置此选项将覆盖数据集中已存在的任何系统消息。默认值为 None。
filter_fn (可选[Callable]) – 用于在预处理之前过滤数据集的可调用对象。有关更多详细信息,请参阅Hugging Face的文档。
split (str) –
split参数用于datasets.load_dataset。您可以使用此参数加载给定拆分的子集,例如split="train[:10%]"。默认值为“train”。**load_dataset_kwargs (Dict[str, Any]) – 传递给
load_dataset的额外关键字参数。
示例:
my_preference_dataset.json [ { "chosen_conversations": [ { "content": "What do I do when I have a hole in my trousers?", "role": "user" }, { "content": "Fix the hole.", "role": "assistant" } ], "rejected_conversations": [ { "content": "What do I do when I have a hole in my trousers?", "role": "user" }, { "content": "Take them off.", "role": "assistant" } ] } ]
>>> from torchtune.datasets import preference_dataset >>> column_map = { ... "chosen": "chosen_conversations", ... "rejected": "rejected_conversations" >>> } >>> dataset = preference_dataset( ... tokenizer=tokenizer, ... source="json", ... column_map=column_map, ... data_files="my_preference_dataset.json", ... train_on_input=False, ... split="train", >>> ) >>> tokenizer.decode(dataset[0]["chosen_input_ids"], skip_special_tokens=True) What do I do when I have a hole in my trousers?Fix the hole. >>> tokenizer.decode(dataset[0]["rejected_input_ids"], skip_special_tokens=True) What do I do when I have a hole in my trousers?Take them off.
这也可以通过yaml配置来完成:
dataset: _component_: torchtune.datasets.preference_dataset source: json data_files: my_preference_dataset.json column_map: chosen: chosen_conversations rejected: rejected_conversations train_on_input: False split: train
- Returns:
从源配对数据构建的偏好数据集。
- Return type: