当前位置: 首页 > news >正文

【使用Unsloth 微调】数据集的种类

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格式的数据集,准备数据集以用于训练或微调的过程包括以下四个简单步骤:

  1. 检查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']
  1. 使用get_chat_template为分词器应用正确的聊天模板
from unsloth.chat_templates import get_chat_template
tokenizer = get_chat_template(
tokenizer,
chat_template = "gemma-3", # 根据需要更改聊天模板名称
)
  1. 定义格式化函数 :以下是一个示例:
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, }

这个函数会遍历数据集,将定义的聊天模板应用到每个样本上。

  1. 加载数据集并应用所需的修改
# 导入并加载数据集
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在将量化版本上传到我们的仓库时,会彻底检查并修复每个模型的`
http://www.dtcms.com/a/347668.html

相关文章:

  • Linux|数据库|2025最新数据库管理工具cloudbeaver-25.0.1的docker方式部署和二进制方式部署
  • leetcode刷题记录03——top100题里的6道简单+1道中等题
  • 单例模式介绍
  • 企业视频库管理高效策略
  • Java和数据库的关系
  • 如何利用 DeepSeek 提升工作效率
  • C++的struct里面可以放函数,讨论一下C++和C关于struct的使用区别
  • 基于TimeMixer现有脚本扩展的思路分析
  • 网络参考模型操作指南
  • 大数据接口 - 企业风险报告(专业版)API接口文档
  • 【Vue✨】Vue 中的 diff 算法详解
  • Compose笔记(四十七)--SnackbarHost
  • 14.Shell脚本修炼手册--玩转循环结构(While 与 Until 的应用技巧与案例)
  • 使用sys数据库分析 MySQL
  • 2015-2018年咸海流域1km归一化植被指数8天合成数据集
  • 【大模型应用开发 4.RAG高级技术与实践】
  • LeetCode算法日记 - Day 20: 两整数之和、只出现一次的数字II
  • 《P3623 [APIO2008] 免费道路》
  • Java22 stream 新特性 窗口算子 与 虚拟线程map操作:Gatherer 和 Gatherers工具类
  • 告别静态网页:我用Firefly AI + Spline,构建次世代交互式Web体验
  • 学习Java24天
  • React学习(十二)
  • IDEA相关的设置和技巧
  • C语言第十一章内存在数据中的存储
  • Redis资料
  • JAVA读取项目内的文件或图片
  • springboot项目结构
  • Axure:如何打开自定义操作界面
  • 顺序表(ArrayList)
  • 刷题日记0823