📈数据集指南
学习如何为微调创建并准备数据集。
什么是数据集?
对于大语言模型(LLM)而言,数据集是可用于训练模型的数据集合。为了便于训练,文本数据需要采用可以分词的格式。你还将学习如何 在 Unsloth 中使用数据集.
创建数据集的关键部分之一是你的 聊天模板 以及你打算如何设计它。分词也很重要,因为它会将文本拆分为 token,这些 token 可以是单词、子词或字符,从而让大语言模型能够有效处理它。随后,这些 token 会被转换为嵌入,并经过调整,以帮助模型理解含义和上下文。
数据格式
为了实现分词过程,数据集需要采用分词器能够读取的格式。
原始语料
来自网站、书籍或文章等来源的原始文本。
继续预训练(CPT)
指令
供模型遵循的指令,以及期望得到的输出示例。
监督微调(SFT)
对话
用户与 AI 助手之间的多轮对话。
监督微调(SFT)
RLHF
用户与 AI 助手之间的对话,其中助手的回复由脚本、另一个模型或人工评估者进行排序。
强化学习(RL)
开始使用
在格式化数据之前,我们需要先确定以下内容:
数据集的用途
了解数据集的用途将帮助我们确定需要哪些数据以及使用何种格式。
用途可以是将模型适配到新任务,例如摘要,或提升模型扮演特定角色的能力。例如:
基于聊天的对话(问答、学习新语言、客服、对话)。
结构化任务(分类、摘要、生成任务)。
特定领域数据(医疗、金融、技术)。
输出风格
输出风格会让我们知道应使用哪些数据来源来达到期望的输出。
例如,你想实现的输出类型可以是 JSON、HTML、文本或代码。或者你可能希望它是西班牙语、英语或德语等。
🦥 Unsloth 数据配方
Unsloth Data Recipes 让你可以上传 PDF 或 CSV 等文档文件,并将其转换为可用的数据集。通过图节点工作流以可视化方式创建和编辑数据集。
recipes 页面是主要入口。Recipes 会本地存储在浏览器中,因此你之后可以回到已保存的工作。从这里,你可以创建一个空白 recipe,或者打开一个引导式学习 recipe。

数据配方遵循相同的基本流程。你打开配方页面,创建或选择一个配方,在编辑器中构建工作流,验证并运行预览,然后在输出看起来正确时运行完整数据集。添加种子数据和生成模块,验证工作流,预览样本输出,然后运行完整的数据集构建。
一眼看去,常见的工作流应如下所示:
打开 recipes 页面。
创建一个新 recipe 或打开一个现有 recipe。
添加 blocks 来定义你的数据集工作流。
点击 验证 以便尽早发现配置问题。
运行预览以快速检查示例行。
当 recipe 准备就绪时,运行完整的数据集构建。
在图中或在以下位置实时查看进度和输出: 执行 视图,以查看更多详情。
在 Unsloth 中选择生成的数据集并微调模型。阅读更多:
数据格式化
当我们确定了相关标准并收集了必要的数据后,就可以将数据格式化为机器可读、可用于训练的格式。
用于 LLM 训练的常见数据格式
对于 继续预训练,我们使用没有特定结构的原始文本格式:
这种格式保留了自然语言的流畅性,并允许模型从连续文本中学习。
如果我们要将模型适配到新任务,并打算让模型根据一组特定指令一次性输出文本,我们可以使用 指令 格式的 Alpaca 风格
当我们想要多轮对话时,可以使用 ShareGPT 格式:
模板格式使用 "from"/"value" 属性键,消息在以下内容之间交替: human和 gpt,从而实现自然的对话流。
另一种常见格式是 OpenAI 的 ChatML 格式,也是 Hugging Face 的默认格式。这可能是使用最广泛的格式,并在以下内容之间交替: user 和 assistant
使用 Unsloth 应用聊天模板
对于通常遵循常见 chatml 格式的数据集,准备数据集以进行训练或微调的过程,只包含四个简单步骤:
查看 Unsloth 目前支持的聊天模板:\
这将打印出 Unsloth 当前支持的模板列表。下面是一个示例输出:\
\\
使用
get_chat_template以将正确的聊天模板应用到你的 tokenizer:\\\
定义你的格式化函数。下面是一个示例:\
该函数会遍历你的数据集,将你定义的聊天模板应用到每个样本。\
最后,让我们加载数据集并将所需的修改应用到我们的数据集: \
如果你的数据集使用的是 ShareGPT 格式,带有 "from"/"value" 键,而不是 ChatML 的 "role"/"content" 格式,你可以使用
standardize_sharegpt该函数先将其转换。修改后的代码现在如下所示: \
数据格式化问答
问: 我如何使用 Alpaca 指令格式?
答: 如果你的数据集已经是 Alpaca 格式,那么请按照 Llama3.1 中所示的格式化步骤进行。若你需要将数据转换为 Alpaca 格式,一种方法是创建一个 Python 脚本来处理原始数据。如果你在做摘要任务,可以使用本地 LLM 为每个示例生成指令和输出。 notebook 。如果你需要将数据转换为 Alpaca 格式,一种方法是创建一个 Python 脚本来处理原始数据。如果你在做摘要任务,可以使用本地 LLM 为每个示例生成指令和输出。
问: 我是否应该始终使用 standardize_sharegpt 方法?
答: 只有当你的目标数据集是 sharegpt 格式,但你的模型期望的是 ChatML 格式时,才使用 standardize_sharegpt 方法。
问: 为什么不使用 tokenizer 自带的 apply_chat_template 函数呢。
答: “ chat_template 属性在模型最初由原始模型所有者上传时有时会包含错误,并且可能需要一些时间才能更新。相比之下,在 Unsloth 中,我们会彻底检查并修复所有模型的 chat_template 当我们将量化版本上传到我们的仓库时。此外,我们的 get_chat_template 和 apply_chat_template 方法提供高级数据处理功能,并已在我们的 Chat Templates 文档中完整说明 页面.
问: 如果我的模板目前不受 Unsloth 支持怎么办?
答: 在 unsloth github issues 上提交功能请求 论坛。作为临时变通方案,在你的功能请求获批并合并之前,你也可以使用 tokenizer 自己的 apply_chat_template 函数。
合成数据生成
你也可以使用任何本地 LLM,如 Llama 3.3(70B)或 OpenAI 的 GPT 4.5 来生成合成数据。通常,更好的是使用更大的模型,如 Llama 3.3(70B),以确保最高质量的输出。你可以直接使用 vLLM、Ollama 或 llama.cpp 等推理引擎来生成合成数据,但这需要一些手动工作来收集数据并提示生成更多数据。合成数据有 3 个目标:
生成全新数据——可以从头创建,也可以基于你现有的数据集。
使你的数据集多样化,这样你的模型就不会 过拟合 并变得过于具体。
增强现有数据,例如自动将你的数据集结构化为所选的正确格式。
在 Unsloth 中使用合成数据
你可以轻松将任何非结构化或结构化数据上传到 Unsloth Studio 的 数据配方 ,它会自动将其转换为可用的 / 合成数据集。更多详情见 我们的指南.

使用本地 LLM 或 ChatGPT 生成合成数据
你的目标是提示模型生成并处理符合你指定格式的 QA 数据。模型需要学习你提供的结构以及上下文,因此请确保你至少已经有 10 个数据示例。示例提示:
用于基于现有数据集生成更多对话的提示:
如果你没有数据集时的提示:
{% code overflow="wrap" %}
{% endcode %}
用于未格式化数据集的提示:
{% code overflow="wrap" %}
{% endcode %}
建议检查生成数据的质量,以移除或改进无关或低质量的回复。根据你的数据集,它在许多方面也可能需要平衡,以免模型过拟合。然后你可以将这个清理后的数据集再次输入 LLM,以重新生成数据,并提供更多指导。
数据集常见问题 + 提示
我的数据集应该有多大?
我们通常建议用于微调的数据至少应有 100 行,以获得合理的结果。为了获得最佳性能,最好使用超过 1,000 行的数据集,在这种情况下,更多的数据通常会带来更好的效果。如果你的数据集太小,你也可以添加合成数据,或从 Hugging Face 添加一个数据集来丰富它。不过,你的微调模型效果在很大程度上取决于数据集的质量,因此务必彻底清理和准备你的数据。
如果我想微调一个推理模型,该如何组织我的数据集?
如果你想微调一个已经具备推理能力的模型,例如 DeepSeek-R1 的蒸馏版本(如 DeepSeek-R1-Distill-Llama-8B),你仍然需要遵循问题/任务与答案配对的格式;不过,在答案中,你需要将答案改写为包含推理/思维链过程以及得出答案所采取的步骤。 对于一个不具备推理能力、而你希望训练它以便日后具备推理能力的模型,你需要使用标准数据集,但这一次其答案中不包含推理过程。这种训练过程被称为 强化学习和 GRPO.
多个数据集
如果你有多个用于微调的数据集,你可以:
将所有数据集的格式标准化,合并为一个单一数据集,并在这个统一数据集上进行微调。
使用 多个数据集 用于直接在多个数据集上进行微调的 notebook。
我可以多次微调同一个模型吗?
你可以对一个已经微调过的模型再次进行多次微调,但更好的做法是将所有数据集合并后一次性完成微调。训练一个已经微调过的模型可能会改变在前一次微调过程中获得的质量和知识。
在 Unsloth 中使用数据集
Alpaca 数据集
在 Google Colab 上查看在 Unsloth 中使用 Alpaca 数据集的示例:

我们现在将使用通过调用 GPT-4 本身创建的 Alpaca 数据集。它包含 52,000 条指令和输出,在 Llama-1 发布时非常受欢迎,因为它使得基础 LLM 的微调能够与 ChatGPT 本身竞争。
你可以访问 GPT4 版本的 Alpaca 数据集 这里。下面显示了数据集的一些示例:

你可以看到每一行有 3 列——指令、输入和输出。我们本质上会将每一行合并成如下所示的一个大提示。然后我们用它来微调语言模型,这使它变得非常类似于 ChatGPT。我们将这个过程称为 监督式指令微调.

用于微调的多列
但一个大问题是,对于 ChatGPT 风格的助手,我们只允许 1 条指令 / 1 个提示,而不是多列 / 多个输入。例如在 ChatGPT 中,你可以看到我们必须提交 1 个提示,而不是多个提示。

这实际上意味着,为了让微调真正起作用,我们必须将多列“合并”成 1 个大提示!
例如,著名的 Titanic 数据集有很多很多列。你的任务是根据乘客的年龄、舱位、票价等信息预测其是生还还是死亡。我们不能直接把这些信息输入 ChatGPT,而是必须将这些信息“合并”成 1 个大提示。

例如,如果我们使用包含该乘客全部信息的“合并后”单个提示向 ChatGPT 提问,我们就可以让它猜测或预测该乘客是死亡还是生还。

其他微调库要求你通过将所有列合并成 1 个提示来手动准备微调数据集。在 Unsloth 中,我们只需提供名为 to_sharegpt 的函数,它一下子就能完成这一切!

现在这稍微复杂一些,因为我们允许大量自定义,但有几个要点:
你必须将所有列用花括号括起来
{}。这些是实际 CSV / Excel 文件中的列名。可选文本组件必须用
[[]]括号括起来选择输出或目标 / 预测列所在的
output_column_name。对于 Alpaca 数据集而言,这将是output.
例如,在 Titanic 数据集中,我们可以创建一个如下所示的大型合并提示格式,其中每一列 / 每一段文本都成为可选项。

例如,假设数据集看起来像这样,并且有很多缺失数据:
S
23
18
7.25
那么,我们不希望结果变成:
该乘客从 S 登船。其年龄为 23。其票价为 空.
该乘客从 空登船。其年龄为 18。其票价为 7.25 美元。
相反,通过使用 [[]]可选地将列括起来
[[该乘客从 S 登船。]] [[其年龄为 23。]] [[其票价为 空.]]
[[该乘客从 空登船。]] [[其年龄为 18。]] [[其票价为 7.25 美元。]]
会变成:
该乘客从 S 登船。其年龄为 23。
其年龄为 18。其票价为 7.25 美元。
多轮对话
如果你没注意到,一个问题是 Alpaca 数据集是单轮的,而记得 ChatGPT 是交互式的,你可以和它多轮对话。例如,左边是我们想要的,而右边的 Alpaca 数据集只提供单一对话。我们希望微调后的语言模型能以某种方式学会像 ChatGPT 一样进行多轮对话。

因此我们引入了 conversation_extension 参数,它本质上会从你的单轮数据集中随机选取一些行,并将它们合并成 1 段对话!例如,如果你把它设为 3,我们会随机选择 3 行并将它们合并为 1 段!设置得太长会使训练变慢,但可能让你的聊天机器人和最终微调效果更好!

然后将 output_column_name 到预测 / 输出列。对于 Alpaca 数据集而言,它将是输出列。
然后我们使用 standardize_sharegpt 函数把数据集整理成适合微调的正确格式!一定要调用这个!

视觉微调
用于微调视觉或多模态模型的数据集也包含图像输入。例如, Llama 3.2 Vision 笔记本 使用放射学案例来展示 AI 如何帮助医疗专业人员更高效地分析 X 光、CT 扫描和超声图像。
我们将使用 ROCO 放射学数据集的采样版本。你可以访问该数据集 这里。该数据集包含 X 光、CT 扫描和超声图像,展示医疗状况和疾病。每张图像都附有由专家撰写的说明文字。目标是微调一个 VLM,使其成为医疗专业人员有用的分析工具。
让我们看一下数据集,并检查第一个示例显示了什么:

全景放射图显示右侧后上颌骨有一处骨溶解性病灶,并伴有上颌窦底壁吸收(箭头所示)。
要对数据集进行格式化,所有视觉微调任务都应按以下方式格式化:
我们将编写一个自定义指令,要求 VLM 扮演放射科专家。也请注意,除了只使用 1 条指令之外,你还可以添加多轮对话,使其成为动态对话。
让我们把数据集转换为用于微调的“正确”格式:
第一个示例如下所示:
在进行任何微调之前,也许视觉模型已经知道如何分析图像了?让我们来检查一下是否如此!
结果如下:
更多详情,请查看我们的数据集部分中的 笔记本这里.
最后更新于
这有帮助吗?

