对 SFT 来说,数据几乎就是上限:格式乱,模型学不到稳定模式;划分泄漏,验证分数虚高。这一篇只讲方法与原则——不展示、不摘录任何真实训练/验证样本

数据在微调里的位置

  • 格式乱 → 模型学不到稳定模式;
  • 划分泄漏 → 验证分数虚高;
  • 类别不均衡 → 某类任务永远学不好。

推荐格式:Alpaca 风格 JSONL

每行一条 JSON,字段示意如下(内容为虚构占位):

1
2
3
4
5
6
{
"instruction": "<用户输入>",
"input": "",
"output": "<期望输出>",
"system": "<系统提示,可选>"
}
字段 作用
instruction 用户侧主输入
input 补充上下文(可空)
output 监督目标
system 全局角色与规则(可全库共用)

在 LLaMA-Factory 中,需要把数据集注册到 dataset_info.json,并映射字段名(如 prompt/query/response/system)。

两类常见样本(抽象描述)

不必绑定具体业务,按输出形态区分即可:

  1. 结构化输出样本output 是可解析的 JSON(或固定模板)。适合「意图 → 动作 / 槽位」类任务。
  2. 开放文本样本output 是自然语言。适合 FAQ、闲聊、解释性回答。

构造结构化样本时,常用手法是:先固定合法动作/标签枚举,再为每个标签写多种口语说法(同义改写)。这能提升对「换一种说法」的鲁棒性,但验证时仍要保证说法互斥

划分:比「几比几」更重要的是互斥

经验比例可以是 9:1 或 10:1,但更关键的是:

  • 同一 instruction(或同一语义组)不要同时出现在 train 与 val;
  • 不要让 val 成为 train 的子集;
  • 尽量按类型分层抽样(结构化 / 开放文本比例接近)。

错误示例(概念上):先把全量放进 train,再从中拷一份当 val。这样测到的是记忆,不是泛化。

数据准备流水线(建议)

1
2
3
4
5
6
7
原始语料(私有,不公开)
→ 清洗 / 去重
→ 生成结构化同义样本(可选)
→ 合并开放文本样本
→ 按 instruction 分组分层划分
→ 写出 train.jsonl / val.jsonl
→ 在 dataset_info.json 注册

可用脚本固化上述步骤,避免手工拷贝导致再次泄漏。

注册与路径

训练配置里通常指定:

  • dataset_dir:放 dataset_info.json 的目录;
  • dataset:注册名(不是文件名本身);
  • 可选 eval_dataset:训练过程中的验证集。

小结

数据篇的交付物不是「公开几条漂亮样本」,而是一套可重复、可审计、无泄漏的准备流程。

语言模型微调实战第 04 篇完。下一篇把配置写好,跑通第一次训练与合并。