消息转换¶
消息转换将来自数据集的原始样本字典转换为 torchtune 的 Message
结构。一旦您的数据以消息的形式表示,torchtune 将处理分词并将数据准备好用于模型。
配置消息转换¶
我们的大多数内置消息转换包含用于控制输入掩码 (train_on_input
)、添加系统提示 (new_system_prompt
) 和更改预期列名 (column_map
) 的参数。这些参数在我们的数据集构建器 instruct_dataset()
和 chat_dataset()
中公开,因此您无需担心消息转换本身,可以直接从配置中配置。您可以在 示例指令数据集 或 示例聊天数据集 中查看更多详细信息。
自定义消息转换¶
如果我们内置的消息转换无法很好地配置您的特定数据集,您可以创建自己的类,并具有完全灵活性。只需从 Transform
类继承并将在 __call__
方法中添加您的代码。
一个简单的示例是将数据集中的一个列作为用户消息,另一个列作为模型响应。实际上,这与 InputOutputToMessages
非常相似。
from torchtune.modules.transforms import Transform
from torchtune.data import Message
from typing import Any, Mapping
class MessageTransform(Transform):
def __call__(self, sample: Mapping[str, Any]) -> Mapping[str, Any]:
return [
Message(
role="user",
content=sample["input"],
masked=True,
eot=True,
),
Message(
role="assistant",
content=sample["output"],
masked=False,
eot=True,
),
]
sample = {"input": "hello world", "output": "bye world"}
transform = MessageTransform()
messages = transform(sample)
print(messages)
# [<torchtune.data._messages.Message at 0x7fb0a10094e0>,
# <torchtune.data._messages.Message at 0x7fb0a100a290>]
for msg in messages:
print(msg.role, msg.text_content)
# user hello world
# assistant bye world
查看 创建消息,了解有关如何操作 Message
对象的更多详细信息。
要将此用于您的数据集,您必须创建一个自定义数据集构建器,该构建器使用底层数据集类 SFTDataset
。
# In data/dataset.py
from torchtune.datasets import SFTDataset
def custom_dataset(tokenizer, **load_dataset_kwargs) -> SFTDataset:
message_transform = MyMessageTransform()
return SFTDataset(
source="json",
data_files="data/my_data.json",
split="train",
message_transform=message_transform,
model_transform=tokenizer,
**load_dataset_kwargs,
)
这可以直接从配置中使用。
dataset:
_component_: data.dataset.custom_dataset