消息转换¶
消息转换执行将数据集中的原始样本字典转换为torchtune的消息结构。一旦您的数据表示为消息,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
from pprint import pprint
class MessageTransform(Transform):
def __call__(self, sample: Mapping[str, Any]) -> Mapping[str, Any]:
messages = [
Message(
role="user",
content=sample["input"],
masked=True,
eot=True,
),
Message(
role="assistant",
content=sample["output"],
masked=False,
eot=True,
),
]
return {"messages": messages}
input_sample = {"input": "hello world", "output": "bye world"}
transform = MessageTransform()
output_sample = transform(input_sample)
pprint(output_sample)
# {'messages': [Message(role='user', content=['hello world']),
# Message(role='assistant', content=['bye world'])]}
要在您的数据集中使用此功能,您必须创建一个自定义数据集构建器,该构建器使用底层数据集类,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
示例消息转换¶
- Instruct
- Preference