1. 什么是数据集
对于大型语言模型(LLMs),数据集是用于训练模型的数据集合。为了训练有效,文本数据需要能够被分词(tokenized)。创建数据集的关键部分之一是聊天模板(chat template)的设计,分词也很重要,它将文本分解为单词、子单词或字符,以便LLMs能有效处理。这些分词随后被转化为嵌入向量(embeddings),帮助模型理解含义和上下文。
2. 数据格式
数据集需要是分词器能够读取的格式,常见的数据格式和对应的训练类型如下:
格式 | 描述 | 训练类型 |
---|---|---|
原始语料(Raw Corpus) | 来自网站、书籍或文章的原始文本 | 持续预训练(Continued Pretraining, CPT) |
指令(Instruct) | 模型要遵循的指令及期望的输出示例 | 监督式微调(Supervised fine-tuning, SFT) |
对话(Conversation) | 用户与AI助手之间的多轮对话 | 监督式微调(SFT) |
强化学习人类反馈(RLHF) | 用户与AI助手的对话,助手的回答由脚本、其他模型或人工评估者排名 | 强化学习(Reinforcement Learning, RL) |
3. 入门指南
在格式化数据之前,需要确定以下几点:
3.1 数据集的目的
明确数据集的用途有助于确定所需的数据和格式。例如:
- 聊天式对话 :问答、学习新语言、客户支持、日常对话等。
- 结构化任务 :分类、总结、生成任务等。
- 特定领域的数据 :医学、金融、技术等。
3.2 输出风格
输出风格决定了我们将使用哪些数据源来达到期望的输出。输出类型可以是JSON、HTML、文本或代码,也可以是特定语言,如西班牙语、英语或德语等。
3.3 数据来源
确定数据集的用途和风格后,需要分析数据的质量和数量。Hugging Face和维基百科是优质的数据集来源,尤其是维基百科,对于训练模型学习语言非常有用。数据来源可以是CSV文件、PDF文件,甚至是网站。也可以合成生成数据,但需要确保每个示例的质量和相关性。将数据集与Hugging Face上的通用数据集(如ShareGPT)结合,可以使模型更智能、更多样化。此外,还可以添加合成生成的数据。
4. 格式化数据
在确定了相关标准并收集了必要的数据后,可以将数据格式化为机器可读的格式,以便进行训练。
4.1 常见的LLM训练数据格式
- 持续预训练 :使用无特定结构的原始文本格式。例如:
"text": "Pasta carbonara is a traditional Roman pasta dish. The sauce is made by mixing raw eggs with grated Pecorino Romano cheese and black pepper. The hot pasta is then tossed with crispy guanciale (cured pork cheek) and the egg mixture, creating a creamy sauce from the residual heat. Despite popular belief, authentic carbonara never contains cream or garlic. The dish likely originated in Rome in the mid-20th century, though its exact origins are debated..."
这种格式保留了自然语言的流畅性,使模型能够从连续文本中学习。
- 指令格式(Alpaca风格) :如果要让模型根据特定指令在单轮对话中输出文本,可以使用以下格式:
"Instruction": "Task we want the model to perform."
"Input": "Optional, but useful, it will essentially be the user's query."
"Output": "The expected result of the task and the output of the model."
- ShareGPT格式 :如果需要多轮对话,可以使用以下格式:
{
"conversations": [
{
"from": "human",
"value": "Can you help me make pasta carbonara?"
},
{
"from": "gpt",
"value": "Would you like the traditional Roman recipe, or a simpler version?"
},
{
"from": "human",
"value": "The traditional version please"
},
{
"from": "gpt",
"value": "The authentic Roman carbonara uses just a few ingredients: pasta, guanciale, eggs, Pecorino Romano, and black pepper. Would you like the detailed recipe?"
}
]
}
这种模板格式使用“from”/“value”属性键,消息在“human”和“gpt”之间交替,使对话流程自然。
- ChatML格式 :这是OpenAI的格式,也是Hugging Face默认的格式,可能是使用最广泛的格式,消息在“user”和“assistant”之间交替。例如:
{
"messages": [
{
"role": "user",
"content": "What is 1+1?"
},
{
"role": "assistant",
"content": "It's 2!"
},
]
}
4.2 使用Unsloth应用聊天模板
对于通常遵循ChatML格式的数据集,准备数据集以用于训练或微调的过程包括以下四个简单步骤:
- 检查Unsloth目前支持的聊天模板 :
from unsloth.chat_templates import CHAT_TEMPLATES
print(list(CHAT_TEMPLATES.keys()))
这将打印出Unsloth目前支持的模板列表。例如:
['unsloth', 'zephyr', 'chatml', 'mistral', 'llama', 'vicuna', 'vicuna_old', 'vicuna old', 'alpaca', 'gemma', 'gemma_chatml', 'gemma2', 'gemma2_chatml', 'llama-3', 'llama3', 'phi-3', 'phi-35', 'phi-3.5', 'llama-3.1', 'llama-31', 'llama-3.2', 'llama-3.3', 'llama-32', 'llama-33', 'qwen-2.5', 'qwen-25', 'qwen25', 'qwen2.5', 'phi-4', 'gemma-3', 'gemma3']
- 使用
get_chat_template
为分词器应用正确的聊天模板 :
from unsloth.chat_templates import get_chat_template
tokenizer = get_chat_template(
tokenizer,
chat_template = "gemma-3", # 根据需要更改聊天模板名称
)
- 定义格式化函数 :以下是一个示例:
def formatting_prompts_func(examples):
convos = examples["conversations"]
texts = [tokenizer.apply_chat_template(convo, tokenize = False, add_generation_prompt = False) for convo in convos]
return { "text" : texts, }
这个函数会遍历数据集,将定义的聊天模板应用到每个样本上。
- 加载数据集并应用所需的修改 :
# 导入并加载数据集
from datasets import load_dataset
dataset = load_dataset("repo_name/dataset_name", split = "train")
# 使用map方法将格式化函数应用到数据集上
dataset = dataset.map(formatting_prompts_func, batched = True,)
如果数据集使用ShareGPT格式的“from”/“value”键,而不是ChatML格式的“role”/“content”键,可以使用standardize_sharegpt
函数进行转换。修改后的代码如下:
# 导入数据集
from datasets import load_dataset
dataset = load_dataset("mlabonne/FineTome-100k", split = "train")
# 如果需要,将数据集转换为“role”/“content”格式
from unsloth.chat_templates import standardize_sharegpt
dataset = standardize_sharegpt(dataset)
# 使用map方法将格式化函数应用到数据集上
dataset = dataset.map(formatting_prompts_func, batched = True,)
4.3 数据格式化Q&A
- 如何使用Alpaca指令格式 :如果数据集已经是Alpaca格式,则按照Llama3.1笔记本中显示的格式化步骤操作。如果需要将数据转换为Alpaca格式,可以创建Python脚本处理原始数据。如果是总结任务,可以使用本地LLM为每个示例生成指令和输出。
- 是否总是使用
standardize_sharegpt
方法 :只有当目标数据集是ShareGPT格式,但模型期望ChatML格式时,才使用standardize_sharegpt
方法。 - 为什么不使用分词器自带的
apply_chat_template
函数 :模型所有者首次上传模型时,chat_template
属性有时会包含错误,可能需要时间更新。相比之下,Unsloth在将量化版本上传到我们的仓库时,会彻底检查并修复每个模型的`