📈数据集指南
了解如何为微调创建和准备数据集。
什么是数据集?
对于大语言模型(LLM)来说,数据集是可用于训练我们模型的数据集合。为了能用于训练,文本数据需要采用可被分词器处理的格式。你还将学习如何 在 Unsloth 中使用数据集.
创建数据集的关键部分之一是你的 聊天模板 以及你将如何设计它。分词同样重要,因为它将文本拆分为标记,这些标记可以是单词、子词或字符,以便大模型能有效处理。然后这些标记会被转换为嵌入向量,并进行调整以帮助模型理解含义和上下文。
数据格式
为了使分词过程可行,数据集需要采用可被分词器读取的格式。
原始语料
来自网站、书籍或文章等来源的原始文本。
继续预训练(CPT)
指令式
供模型遵循的指令以及期望输出的示例。
监督微调(SFT)
对话
用户与 AI 助手之间的多轮对话。
监督微调(SFT)
RLHF
用户与 AI 助手之间的对话,助手的回复由脚本、其他模型或人工评估者进行排序。
强化学习(RL)
值得注意的是,每种类型都有不同风格的格式存在。
入门
在格式化数据之前,我们需要确定以下内容:
数据集用途
明确数据集的用途将帮助我们确定所需的数据和要使用的格式。
用途可能是将模型适配到新任务(例如摘要)或提高模型扮演特定角色的能力。例如:
基于聊天的对话(问答、学习新语言、客户支持、会话)。
结构化任务(分类、摘要、生成任务)。
领域特定数据(医学、金融、技术)。
输出风格
输出风格将告诉我们需要使用哪些数据来源来达到期望输出。
例如,你希望实现的输出类型可以是 JSON、HTML、文本或代码。或者你可能希望它是西班牙语、英语或德语等。
创建更好数据集的最佳方法之一是将其与来自 Hugging Face 的更通用数据集(如 ShareGPT)结合,以使模型更聪明和多样化。你也可以添加 合成生成的数据.
数据格式化
当我们确定相关标准并收集必要数据后,就可以将数据格式化为机器可读的格式,准备进行训练。
用于大模型训练的常见数据格式
对于 继续预训练,我们使用没有特定结构的原始文本格式:
该格式保留了自然语言的流畅性,并允许模型从连续文本中学习。
如果我们要将模型适配到新任务,并希望模型基于一组特定指令在单轮中输出文本,我们可以使用 指令格式 在 Alpaca 风格中
当我们希望多轮对话时,可以使用 ShareGPT 格式:
模板格式使用 "from"/"value" 属性键,消息在 human和 gpt之间交替,允许自然的对话流。
另一种常见格式是 OpenAI 的 ChatML 格式,也是 Hugging Face 的默认格式。这可能是最常用的格式,并在 user 和 assistant
在 Unsloth 中应用聊天模板
对于通常遵循常见 chatml 格式的数据集,将数据集准备为训练或微调的过程由四个简单步骤组成:
检查 Unsloth 当前支持的聊天模板:\
这将打印出 Unsloth 当前支持的模板列表。下面是一个示例输出:\
\
以在容器内执行 sudo 操作
get_chat_template将正确的聊天模板应用到你的分词器:\\
定义你的格式化函数。示例:\
该函数遍历你的数据集,将你定义的聊天模板应用到每个样本上。\
最后,让我们加载数据集并对其应用所需的修改: \
如果你的数据集使用 ShareGPT 格式且带有 "from"/"value" 键而不是 ChatML 的 "role"/"content" 格式,你可以先使用
standardize_sharegpt函数将其转换。修改后的代码如下: \
数据格式化问答
问: 如何使用 Alpaca 指令格式?
答: 如果你的数据集已经采用 Alpaca 格式,则按照 Llama3.1 中示例的格式化步骤进行操作, 笔记本 。如果需要将数据转换为 Alpaca 格式,一种方法是创建一个 Python 脚本来处理原始数据。如果你正在做摘要任务,可以使用本地 LLM 为每个示例生成指令和输出。
问: 我是否应始终使用 standardize_sharegpt 方法?
答: 仅当你的目标数据集采用 sharegpt 格式但你的模型期望 ChatML 格式时,才使用 standardize_sharegpt 方法。
问: 为什么不使用分词器自带的 apply_chat_template 函数?
答: 当原始模型所有者首次上传模型时, chat_template 属性有时包含错误并可能需要时间才能更新。相比之下,在 Unsloth,我们会彻底检查并修复每个模型在上传量化版本到我们的仓库时的任何错误。此外,我们的 chat_template apply_chat_template get_chat_template 和 方法提供了高级的数据操作功能,其在我们的聊天模板文档中有详细说明, 页面 。.
问: 如果我的模板当前未被 Unsloth 支持怎么办?
答: 在 unsloth 的 github issues 上提交功能请求 论坛。作为临时解决方法,你也可以使用分词器自带的 apply_chat_template 函数,直到你的功能请求被批准并合并。
合成数据生成
你也可以使用任何本地 LLM,例如 Llama 3.3(70B)或 OpenAI 的 GPT 4.5 来生成合成数据。通常,使用更大的模型(如 Llama 3.3(70B))更有助于确保更高质量的输出。你可以直接使用 vLLM、Ollama 或 llama.cpp 等推理引擎来生成合成数据,但这需要一些手动工作来收集并提示生成更多数据。合成数据有三个目标:
完全生成新数据——可以从头开始或基于你现有的数据集生成
使你的数据集多样化,以防止模型 过拟合 并变得过于特定化
增强现有数据,例如自动将你的数据集结构化为所选的正确格式
合成数据集笔记本
我们与 Meta 合作发布了一个免费笔记本,用于使用本地模型(如 Llama 3.2)自动创建合成数据集。 在此处访问该笔记本。
该笔记本的功能:
自动解析 PDF、网站、YouTube 视频等内容
使用 Meta 的合成数据工具包 + Llama 3.2(3B)生成问答对
自动清理和过滤数据
使用 Unsloth + Llama 对数据集进行微调
笔记本完全在本地运行,无需调用任何 API
使用本地 LLM 或 ChatGPT 生成合成数据
你的目标是引导模型生成并处理符合你指定格式的问答数据。模型需要学习你提供的结构以及上下文,因此确保你至少已有 10 个示例数据。示例提示:
用于在现有数据集上生成更多对话的提示:
当你没有数据集时的提示:
{% code overflow="wrap" %}
{% endcode %}
针对未格式化数据集的提示:
{% code overflow="wrap" %}
{% endcode %}
建议检查生成数据的质量,以删除或改进无关或低质量的回复。根据你的数据集,可能还需要在许多方面进行平衡,以防止模型过拟合。随后你可以将清理后的数据集反馈回 LLM 以重新生成数据,并提供更多指导。
数据集常见问题与提示
我的数据集应该有多大?
我们通常建议用于微调的最少数据量至少为 100 行,以获得合理的结果。为了获得最佳性能,建议数据集超过 1,000 行,在这种情况下,更多数据通常会带来更好效果。如果你的数据集过小,也可以添加合成数据或从 Hugging Face 添加数据集以增加多样性。然而,微调模型的效果在很大程度上取决于数据集的质量,因此务必彻底清理和准备你的数据。
如果我想微调一个具有推理能力的模型,我应该如何构建数据集?
如果你想微调一个已经具备推理能力的模型(例如 DeepSeek-R1 的蒸馏版本,如 DeepSeek-R1-Distill-Llama-8B),你仍然需要使用问答/任务-答案对,但你的答案需要包含推理/链式思考过程以及得出答案所采取的步骤。 对于一个没有推理能力的模型,如果你希望之后让它具备推理能力,你需要使用标准数据集,但这次答案中不包含推理过程。这种训练过程被称为 强化学习和 GRPO.
多个数据集
如果你有多个用于微调的数据集,你可以:
将所有数据集的格式标准化,合并为单一数据集,并在此统一数据集上进行微调。
使用 多个数据集 笔记本直接在多个数据集上进行微调。
我可以对同一模型进行多次微调吗?
你可以对已经微调过的模型再次进行微调,但最好将所有数据集合并并在一次流程中完成微调。对已经微调过的模型再次训练可能会改变先前微调过程中获得的质量和知识。
在 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,而是必须将这些信息“合并”成一个大型提示。

例如,如果我们用包含该乘客所有信息的“合并”单一提示询问 ChatGPT,我们就可以让它猜测或预测该乘客是死还是活。

其他微调库要求你手动为微调准备数据集,通过将所有列合并为 1 个提示。在 Unsloth 中,我们简单地提供了一个名为 to_sharegpt 的函数,一次性完成此操作!

现在这有点更复杂,因为我们允许大量自定义,但有几点需要注意:
你必须用大括号将所有列括起来
{}。这些是实际 CSV / Excel 文件中的列名。可选的文本组件必须用
[[]]括起来。例如如果列 "input" 为空,合并函数将不会显示该文本并跳过它。这对具有缺失值的数据集很有用。在
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 参数,该参数本质上会从你的单轮数据集中随机选取若干行并将它们合并成一次对话!例如,如果你将其设置为 3,我们会随机选取 3 行并将它们合并成 1 个对话!设置得太长会使训练变慢,但可能会使你的聊天机器人和最终微调效果更好!

然后将 output_column_name 设置为预测 / 输出列。对于 Alpaca 数据集,它将是 output 列。
然后我们使用 standardize_sharegpt 函数将数据集制作成正确的微调格式!务必调用此函数!

视觉微调
用于微调视觉或多模态模型的数据集还包括图像输入。例如, Llama 3.2 视觉笔记本 使用放射影像案例展示 AI 如何帮助医学专业人员更高效地分析 X 光、CT 扫描和超声图像。
我们将使用采样的 ROCO 放射影像数据集。你可以访问该数据集 此处。该数据集包括展示医学病症和疾病的 X 光、CT 扫描和超声图像。每张图像都有专家撰写的说明性标题。目标是微调一个视觉语言模型(VLM),使其成为对医学专业人员有用的分析工具。
让我们查看数据集,并检查第一个示例显示的内容:

全景放射影像显示右后上颌出现溶骨性病变,并伴随上颌窦底的吸收(箭头所示)。
为格式化数据集,所有视觉微调任务应按如下方式格式化:
我们将设计一个自定义指令,要求视觉语言模型成为一名放射影像专家。注意除了单条指令外,你还可以添加多轮以使其成为动态对话。
让我们将数据集转换为用于微调的“正确”格式:
第一个示例现在结构如下:
在进行任何微调之前,也许视觉模型已经知道如何分析这些图像?让我们检查是否如此!
结果为:
欲了解更多细节,请查看我们在 笔记本部分的 数据集 部分.
最后更新于
这有帮助吗?

