聊天机器人训练数据集分解 | AI生成和翻译

首页 2026.07

问题: 请解释这个 SFT 数据混合以及像 <|user_start|><|user_end|><|assistant_start|><|assistant_end|> 这样的特殊 token。

答案:

该表格描述了用于训练预训练语言模型使其具备聊天机器人行为的监督微调(SFT) 数据集。在预训练(在大规模文本上预测下一个 token)之后,模型会在高质量的指令-回复样本上进行微调。

该 SFT 数据集总计包含 1,071,759 个对话样本

数据集 行数 包含原因
SmolTalk 460K 通用对话、问答、助手的辅助行为
MMLU ×3 300K 逻辑推理和知识类问题
SimpleSpelling 200K 学习拼写纠正
SpellingBee 80K 统计单词中的字母个数(LLM 常感困难的任务)
GSM8K ×4 32K 小学数学应用题
Identity 1K 让模型知道自己的名字、创建者和角色
自定义代码 + SEC 1K 专业编程以及 SEC/金融类对话

让我们逐一分析。

1. SmolTalk (460K)

这是占比最大的一部分。

它包含普通的聊天机器人对话,例如:

用户:解释一下递归。
助手:递归是指函数调用自身...

模型学习:

这主要将语言模型转变为聊天机器人。


2. MMLU ×3 (300K)

MMLU 代表大规模多任务语言理解(Massive Multitask Language Understanding)。

它包含多项选择题,例如:

问题:
哪颗行星离太阳最近?

A. 金星
B. 水星
C. 地球
D. 火星

正确答案:

B. 水星

×3 通常意味着数据集被重复或扩充了三次,以便在训练中产生更大影响。

如果不重复,模型可能没有足够的更新次数来学习推理任务。


3. SimpleSpelling (200K)

例子:

用户:
纠正这个拼写:
recieve

助手:
receive

纠正:
acomodation

助手:
accommodation

这提高了拼写准确性。


4. SpellingBee (80K)

此数据集教授字母计数。

例子:

用户:
"strawberry" 中有几个字母 r?

助手:
3

这看起来简单,但基于 token 的语言模型历来在这方面表现不佳,因为它们基于 token(而非单个字符)进行推理。

专门的训练样本有助于提高这种能力。


5. GSM8K ×4 (32K)

GSM8K 是一个知名的小学数学问题数据集。

例子:

Tom 有 5 个苹果。
他又买了 3 个。
他现在有多少个苹果?

答案:

8

同样,×4 表示他们对数据集进行了过采样,以在训练中赋予数学问题更大的权重。


6. Identity (1K)

这教会助手其身份。

例子:

是谁创造了你?

我是由 X 公司创造的。

你是什么模型?

我是 XYZ-7B。

没有这些示例,模型的回答可能会不一致。


7. 自定义代码 + SEC (1K)

这些是人工整理的对话。

例如:

编程:

用 Python 写一个二分查找。

金融:

解释一下 SEC 10-K 年报。

虽然只有 1,000 个示例,但它们通常是高质量的,并且是根据项目目标定制的。


为什么要混合多个数据集?

每个数据集教授一种不同的能力。

数据集 学习到的技能
SmolTalk 对话能力
MMLU 推理能力
GSM8K 数学能力
SimpleSpelling 拼写能力
SpellingBee 字符计数能力
Identity 角色一致性
自定义数据集 领域专业知识

通过不依赖单一数据集,模型在多项技能上变得更强。


这些特殊 token 是什么?

<|user_start|>
<|user_end|>

<|assistant_start|>
<|assistant_end|>

这些是插入到训练文本中用于标记谁在说话的特殊控制 token

例如,一个对话会被转换成连续的 token 序列:

<|user_start|>
什么是 Python?
<|user_end|>

<|assistant_start|>
Python 是一种编程语言。
<|assistant_end|>

模型看到的不是独立的“消息”。它只看到一串连续的 token。

这些特殊 token 告诉它:


SFT 训练如何工作

假设一个训练示例是:

<|user_start|>
将 "hello" 翻译成法语。
<|user_end|>

<|assistant_start|>
Bonjour。
<|assistant_end|>

在 SFT 期间:

概念上:

输入:
<用户> 将 "hello" 翻译成法语。

目标:
Bonjour。

这教会模型根据先前的对话生成助手的回复。


与预训练的关系

预训练使用纯文本,例如:

法国的首都是巴黎。

并训练模型在任何位置预测下一个 token。

而 SFT 使用结构化的对话:

<|user_start|>
解释注意力机制。
<|user_end|>

<|assistant_start|>
注意力机制让每个 token 可以选择性地关注其他 token...
<|assistant_end|>

目标仍然是下一个 token 预测,但现在模型学习的模式是:

用户消息 → 助手回复

而不仅仅是继续任意的互联网文本。

这就是为什么 SFT 是将通用语言模型转变为遵循指令的对话式助手的阶段。


AI生成和翻译,但整理分享仍需精力。如果觉得有帮助,欢迎 捐助支持。 微信:@lzwjavaWeChat QR · X: @lzwjava · 打个招呼 👋

返回 捐助