📈数据集指南

了解如何为微调创建和准备数据集。

什么是数据集?

对于大型语言模型,数据集是可用于训练我们模型的数据集合。为了对训练有用,文本数据需要以可被分词器(tokenizer)读取的格式存在。你还将学习如何 在 Unsloth 中使用数据集.

创建数据集的关键部分之一是你的 聊天模板 以及你将如何设计它。分词也很重要,因为它将文本拆分为标记(tokens),这些标记可以是单词、子词或字符,以便大型语言模型能有效处理。这些标记随后被转换为嵌入,并进行调整以帮助模型理解含义和上下文。

数据格式

为了启用分词过程,数据集需要采用分词器能够读取的格式。

格式
说明
训练类型

原始语料

来自网站、书籍或文章等来源的原始文本。

继续预训练(CPT)

指令型

供模型遵循的指令以及期望输出的示例。

监督微调(SFT)

对话

用户与 AI 助手之间的多轮对话。

监督微调(SFT)

RLHF

用户与 AI 助手之间的对话,其中助手的回复由脚本、另一个模型或人工评估者进行排序。

强化学习(RL)

circle-info

值得注意的是,每种类型都有不同风格的格式存在。

入门

在我们格式化数据之前,我们需要确定以下内容:

1

数据集用途

了解数据集的用途将帮助我们确定需要哪些数据以及使用何种格式。

用途可能是将模型适配到新的任务,例如摘要,或提高模型扮演特定角色的能力。例如:

  • 基于聊天的对话(问答、学习新语言、客户支持、对话)。

  • 结构化任务(分类arrow-up-right、摘要、生成任务)。

  • 特定领域数据(医学、金融、技术)。

2

输出风格

输出风格将告诉我们需要使用哪些数据来源来达到期望输出。

例如,你希望达到的输出类型可以是 JSON、HTML、文本或代码。或者你可能希望输出为西班牙语、英语或德语等。

3

数据来源

当我们知道所需数据的用途和风格后,我们需要分析数据的质量和 数量 Hugging Face 和维基百科是很好的数据集来源,如果你希望训练模型学习一种语言,维基百科尤其有用。

数据来源可以是 CSV 文件、PDF 或甚至是网站。你也可以 合成生成 数据,但需要额外注意以确保每个示例都是高质量且相关的。

circle-check

格式化数据

当我们确定了相关标准并收集了必要的数据后,就可以将数据格式化为机器可读的格式,以便训练使用。

用于大型语言模型训练的常见数据格式

对于 继续预训练,我们使用没有特定结构的原始文本格式:

此格式保留自然语言流,使模型能从连续文本中学习。

如果我们要将模型适配到新任务,并期望模型基于特定指令在单次交互中输出文本,我们可以使用 指令 格式,采用 Alpaca 风格arrow-up-right

当我们需要多轮对话时,可以使用 ShareGPT 格式:

该模板格式使用 "from"/"value" 属性键,消息在 人类(human)和 gpt之间交替,允许自然对话流。

另一种常见格式是 OpenAI 的 ChatML 格式,也是 Hugging Face 的默认格式。这可能是最常用的格式,消息在 user(用户)assistant(助手)

在 Unsloth 中应用聊天模板

对于通常遵循通用 chatml 格式的数据集,将数据集准备用于训练或微调的过程包括四个简单步骤:

  • 检查 Unsloth 当前支持的聊天模板:\

    这将打印出 Unsloth 当前支持的模板列表。以下是示例输出:\

    \

  • 使用 get_chat_template 将合适的聊天模板应用到你的分词器:\

    \

  • 定义你的格式化函数。示例如下:\

    该函数遍历你的数据集,将你定义的聊天模板应用于每个样本。\

  • 最后,让我们加载数据集并对其应用所需的修改: \

    如果你的数据集使用 ShareGPT 格式的 "from"/"value" 键而不是 ChatML 的 "role"/"content" 格式,你可以先使用 standardize_sharegpt 函数将其转换。修改后的代码如下所示: \

格式化数据 问答

问: 我如何使用 Alpaca 指令格式?

答: 如果你的数据集已经采用 Alpaca 格式,则按照 Llama3.1 中所示的格式化步骤进行 笔记本 arrow-up-right。如果你需要将数据转换为 Alpaca 格式,一种方法是创建一个 Python 脚本来处理原始数据。如果你正在进行摘要任务,可以使用本地大型模型为每个示例生成指令和输出。

问: 我是否应始终使用 standardize_sharegpt 方法?

答: 仅当你的目标数据集采用 sharegpt 格式,但你的模型期待 ChatML 格式时才使用 standardize_sharegpt 方法。

问: 为什么不使用分词器自带的 apply_chat_template 函数?

答: 当模型由原始模型所有者首次上传时, chat_template 属性有时包含错误,且可能需要时间来更新。相比之下,在 Unsloth,我们会在将量化版本上传到我们的仓库时彻底检查并修复每个模型中的任何错误。此外,我们的 chat_template apply_chat_template get_chat_template方法提供高级数据操作功能,完整文档见我们的聊天模板(Chat Templates)文档 页面 如果我的模板当前不被 Unsloth 支持怎么办?arrow-up-right.

问: 在 Unsloth 的 GitHub issues 上提交功能请求

答: 论坛 。作为临时解决方案,你也可以使用分词器自带的 apply_chat_template 函数,直到你的功能请求被批准并合并。arrow-up-right合成数据生成

你也可以使用任何本地大型模型,例如 Llama 3.3(70B)或 OpenAI 的 GPT-4.5 来生成合成数据。通常,使用更大的模型(如 Llama 3.3(70B))能确保输出质量更高。你可以直接使用像 vLLM、Ollama 或 llama.cpp 这样的推理引擎来生成合成数据,但这将需要一些手工工作来收集并提示生成更多数据。合成数据有三个目标:

生成全新的数据——要么从头开始,要么基于现有数据集

  • 使数据集多样化,以防止模型

  • 过拟合 并变得过于专一 扩充现有数据,例如自动将你的数据集结构化为所选的正确格式

  • 合成数据集笔记本

我们与 Meta 合作推出了一个免费笔记本,用于使用 Llama 3.2 等本地模型自动创建合成数据集。

在此访问该笔记本。 笔记本的功能:arrow-up-right

自动解析 PDF、网站、YouTube 视频等

  • 使用 Meta 的 Synthetic Data Kit + Llama 3.2(3B)生成问答对

  • 自动清理和过滤数据

  • 使用 Unsloth + Llama 对数据集进行微调

  • 笔记本完全在本地运行,无需调用任何 API

  • 使用本地大型模型或 ChatGPT 进行合成数据生成

你的目标是提示模型生成并处理符合你指定格式的问答数据。模型需要学习你提供的结构和上下文,因此至少确保你已有 10 个示例数据。示例提示:

用于在现有数据集上生成更多对话的提示

  • 使用我提供的数据集示例,按照该结构并基于示例生成对话。:

  • {% code overflow="wrap" %}:

    为可口可乐创建 10 条产品评价示例,并按正面、负面或中立进行分类。

    针对未格式化数据集的提示

  • 将我的数据集结构化为用于微调的 QA ChatML 格式。然后生成 5 个相同主题和格式的合成示例数据。:

    为可口可乐创建 10 条产品评价示例,并按正面、负面或中立进行分类。

    针对未格式化数据集的提示

数据集常见问题与技巧

我的数据集应有多大?

我们通常建议微调至少使用至少 100 行数据以获得合理的结果。为了达到最佳性能,最好有超过 1,000 行的数据集,并且在这种情况下,更多数据通常带来更好效果。如果你的数据集太小,也可以添加合成数据或从 Hugging Face 添加数据集以增加多样性。然而,微调模型的有效性在很大程度上取决于数据集的质量,因此请务必彻底清理和准备你的数据。

如果我想微调一个具备推理能力的模型,我应如何构建我的数据集?

如果你想微调一个已经具有推理能力的模型,例如 DeepSeek-R1 的蒸馏版本(例如 DeepSeek-R1-Distill-Llama-8B),你仍然需要遵循问题/任务与答案对的格式;不过你的答案需要包含推理/链式思维(chain-of-thought)过程以及得出答案的步骤。 对于没有推理能力且你想训练其后来具备推理能力的模型,你需要使用标准数据集,但答案中这次不包含推理过程。这一训练过程称为

强化学习与 GRPO 多个数据集.

如果你有多个用于微调的数据集,你可以:

将所有数据集的格式标准化,合并为单一数据集,并在该统一数据集上进行微调。

你可以对已经微调过的模型进行多次微调,但最好将所有数据集合并并在一次流程中完成微调。对已微调模型再次训练可能会改变先前微调过程中获得的质量和知识。

在 Unsloth 中使用数据集

Alpaca 数据集

在 Google Colab 中查看在 Unsloth 中使用 Alpaca 数据集的示例:

我们现在将使用由 GPT-4 本身调用创建的 Alpaca 数据集。它包含 52,000 条指令与输出的列表,在 Llama-1 发布时非常流行,因为它使得对基础 LLM 的微调在竞争力上接近 ChatGPT 本身。

你可以访问 GPT4 版本的 Alpaca 数据集

此处 。下面展示了数据集的一些示例:arrow-up-right你可以看到每行有 3 列——一个指令、一个输入和一个输出。我们本质上将每行合并为下面这样的一个大提示。然后我们用它来微调语言模型,这使得模型非常类似于 ChatGPT。我们称这一过程为

监督指令微调 用于微调的多列.

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

这基本上意味着我们必须将多个列“合并”为一个大提示,才能使微调真正起作用!

例如,非常著名的泰坦尼克号数据集有很多列。你的任务是根据年龄、乘客舱位、票价等预测乘客是否生存。我们不能简单地将其传入 ChatGPT,而必须将这些信息“合并”到一个大提示中。

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

其他微调库要求你手动准备用于微调的数据集,通过将所有列合并为一个提示。在 Unsloth 中,我们直接提供名为

to_sharegpt 的函数,一次性完成此操作! 现在这有点复杂,因为我们允许大量自定义,但有几点需要注意:

你必须用大括号括住所有列名

  • 。这些是实际 CSV/Excel 文件中的列名。 {}可选的文本组件必须用

  • 括起。例如如果列 "input" 为空,合并函数将不会显示该文本并跳过它。这对存在缺失值的数据集很有用。 [[]]

  • 中选择输出或目标/预测列。对于 Alpaca 数据集,这将是 output_column_nameoutput 例如在泰坦尼克号数据集中,我们可以创建如下的大合并提示格式,其中每一列/文本片段都变为可选。.

例如,假设数据集如下且有许多缺失数据:

登船港口(Embarked)

年龄(Age)
票价(Fare)
S

然后,我们不希望结果是:

23

18

7.25

乘客从 S 登船。他们的年龄是 23。他们的票价是

  1. 空(EMPTY) 乘客从.

  2. 登船。他们的年龄是 18。他们的票价是 $7.25。 乘客从相反,通过可选地使用

括住列,我们可以完全排除此信息。 [[]][[乘客从 S 登船。]] [[他们的年龄是 23。]] [[他们的票价是

  1. [[乘客从 乘客从.]]

  2. 登船。]] [[他们的年龄是 18。]] [[他们的票价是 $7.25。]] 乘客从变为:

乘客从 S 登船。他们的年龄是 23。

  1. 他们的年龄是 18。他们的票价是 $7.25。

  2. 视觉微调

多轮对话

一个你可能没注意到的问题是 Alpaca 数据集是单轮的,而使用 ChatGPT 时是交互式的,可以进行多轮对话。例如,左侧是我们想要的,但右侧(即 Alpaca 数据集)只提供单次对话。我们希望微调后的语言模型能以某种方式学会像 ChatGPT 一样进行多轮对话。

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

然后设置 output_column_name 为预测/输出列。对于 Alpaca 数据集,它将是输出列。

然后我们使用 standardize_sharegpt 函数将数据集规范为适合微调的正确格式!务必调用此函数!

用于微调视觉或多模态模型的数据集还包括图像输入。例如,

Llama 3.2 视觉笔记本 使用一个放射学案例来展示 AI 如何更高效地帮助医疗专业人员分析 X 光、CT 扫描和超声图像。arrow-up-right 我们将使用采样版本的 ROCO 放射学数据集。你可以访问该数据集

。该数据集包含展示医学状况和疾病的 X 光、CT 扫描和超声图像。每张图像都有专家编写的说明文字。目标是微调一个视觉语言模型(VLM),使其成为医疗专业人员的有用分析工具。 。下面展示了数据集的一些示例:arrow-up-right让我们来看看数据集,并检查第一个示例显示了什么:

Dataset({

说明文字(Caption)
全景放射影像显示右上颌后部的溶骨性病变,并伴有上颌窦底的吸收(箭头所示)。

要格式化数据集,所有视觉微调任务应按如下方式格式化:

{ "role": "user",

instruction = "你是一名放射学专家。准确描述你在此图像中看到的内容。"

converted_dataset = [convert_to_conversation(sample) for sample in dataset]

converted_dataset[0]

FastVisionModel.for_inference(model) # 启用推理!

这张放射影像似乎是上颌和下颌牙列的全景图,具体为正颌全景(Orthopantomogram,OPG)。

笔记本中查看数据集部分 arrow-up-right.

最后更新于

这有帮助吗?