语言模型微调实战(04):训练数据的格式、构造与划分
对 SFT 来说,数据几乎就是上限:格式乱,模型学不到稳定模式;划分泄漏,验证分数虚高。这一篇只讲方法与原则——不展示、不摘录任何真实训练/验证样本。
数据在微调里的位置
- 格式乱 → 模型学不到稳定模式;
- 划分泄漏 → 验证分数虚高;
- 类别不均衡 → 某类任务永远学不好。
推荐格式:Alpaca 风格 JSONL
每行一条 JSON,字段示意如下(内容为虚构占位):
1 | { |
| 字段 | 作用 |
|---|---|
instruction |
用户侧主输入 |
input |
补充上下文(可空) |
output |
监督目标 |
system |
全局角色与规则(可全库共用) |
在 LLaMA-Factory 中,需要把数据集注册到 dataset_info.json,并映射字段名(如 prompt/query/response/system)。
两类常见样本(抽象描述)
不必绑定具体业务,按输出形态区分即可:
- 结构化输出样本:
output是可解析的 JSON(或固定模板)。适合「意图 → 动作 / 槽位」类任务。 - 开放文本样本:
output是自然语言。适合 FAQ、闲聊、解释性回答。
构造结构化样本时,常用手法是:先固定合法动作/标签枚举,再为每个标签写多种口语说法(同义改写)。这能提升对「换一种说法」的鲁棒性,但验证时仍要保证说法互斥。
划分:比「几比几」更重要的是互斥
经验比例可以是 9:1 或 10:1,但更关键的是:
- 同一
instruction(或同一语义组)不要同时出现在 train 与 val; - 不要让 val 成为 train 的子集;
- 尽量按类型分层抽样(结构化 / 开放文本比例接近)。
错误示例(概念上):先把全量放进 train,再从中拷一份当 val。这样测到的是记忆,不是泛化。
数据准备流水线(建议)
1 | 原始语料(私有,不公开) |
可用脚本固化上述步骤,避免手工拷贝导致再次泄漏。
注册与路径
训练配置里通常指定:
dataset_dir:放dataset_info.json的目录;dataset:注册名(不是文件名本身);- 可选
eval_dataset:训练过程中的验证集。
小结
数据篇的交付物不是「公开几条漂亮样本」,而是一套可重复、可审计、无泄漏的准备流程。
语言模型微调实战第 04 篇完。下一篇把配置写好,跑通第一次训练与合并。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 WALL-E's Blog!









