趋近智
将提示词 (prompt)格式化、分词(tokenization)以及注意力掩码生成整合到一个自动化的流水线中,可以确保数据准备的一致性。数据流水线负责将原始文本转换为模型架构在训练时所需的精确张量形状。
构建此流水线需要一套系统的方法。我们将加载原始数据集,应用格式化模板来合并指令和回答,对生成的文本进行分词,最后将数据转换为适配 PyTorch 的多维数组。
首先,我们将原始数据加载到内存中。在本练习中,假设我们有一个名为 training_data.jsonl 的 JSON Lines 文件。文件中的每一行都是一个包含 instruction(指令)字段和 response(回答)字段的 JSON 对象。我们使用 Hugging Face 的 datasets 库来高效加载此文件。
from datasets import load_dataset
# 加载 JSONL 数据集
dataset = load_dataset("json", data_files="training_data.jsonl", split="train")
# 检查第一行
print(dataset[0])
# 输出: {'instruction': 'Translate to French: Hello', 'response': 'Bonjour'}
将数据加载到 Dataset 对象中可以利用优化的内存映射操作。数据集不会一次性全部加载到内存(RAM)中,这在处理包含数百万行的数据文件时,可以防止内存崩溃。
模型无法直接理解独立的 instruction 和 response 字段。它需要一个带有特定结构标记 (token)的连续字符串。我们定义一个标准的 Python 函数,将这些字段拼接成模型架构要求的提示词 (prompt)格式。
def format_instruction(example):
"""
将指令和回答合并为一个标准的字符串。
"""
prompt = f"### Instruction:\n{example['instruction']}\n\n### Response:\n{example['response']}"
return {"formatted_prompt": prompt}
我们使用 .map() 方法将此函数应用到整个数据集。此操作会在数据集中创建一个包含最终文本字符串的新列。
# 对所有行应用格式化函数
dataset = dataset.map(format_instruction)
文本结构化之后,必须将字符转换为整数序列。我们实例化一个与基础模型相对应的分词器 (tokenizer)。神经网络 (neural network)在批处理期间需要固定的输入维度。如果批大小为 ,序列长度为 ,则生成的输入张量维度必须始终为 。
为了获得这种统一的形状,我们配置分词器:对超过最大长度的序列进行截断,对不足长度的序列进行填充。
from transformers import AutoTokenizer
# 初始化分词器
tokenizer = AutoTokenizer.from_pretrained("base-model-identifier")
# 如果基础模型缺少填充令牌,则指定一个
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
def tokenize_function(examples):
"""
对格式化后的提示词进行分词,并应用填充和截断。
"""
return tokenizer(
examples["formatted_prompt"],
truncation=True,
padding="max_length",
max_length=512
)
通过设置 padding="max_length" 和 max_length=512,数据集中的每个序列都将正好由 512 个令牌组成。分词器会自动为每个条目生成两个数组:代表文本的 input_ids,以及通过数学方式告知模型忽略填充位置的 attention_mask。
我们将分词 (tokenization)函数应用于数据集。通过使用 batched=True 参数 (parameter)来同时处理多个示例。这利用并行执行显著加快了分词过程。我们还会移除原始文本列,因为神经网络 (neural network)只需要数值张量。
# 应用分词并移除文本列
tokenized_dataset = dataset.map(
tokenize_function,
batched=True,
remove_columns=dataset.column_names
)
将文本条目转换为填充整数数组的数据处理阶段。
流水线的最后一步是为机器学习 (machine learning)框架配置数据格式。目前,数据集列包含的是标准的 Python 列表。训练循环需要 PyTorch 张量。我们应用 .set_format() 方法将这些列表直接转换为可以传输到 GPU 的张量。
# 将格式设置为 PyTorch 张量
tokenized_dataset.set_format("torch")
# 验证张量维度
print(tokenized_dataset[0]["input_ids"].shape)
输出形状将是 torch.Size([512])。当 PyTorch DataLoader 在训练循环中将这些行组合成批次时,生成的矩阵将完全对齐 (alignment)。例如,批大小为 8 时,将产生形状为 的张量。
自定义数据流水线现已完成。原始文本输入已经过标准化、转换为整数、限制为统一长度,并转换为特定框架的张量,为微调 (fine-tuning)过程做好了准备。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•