本文为《Ai大模型训练教程》实战篇,详解全参SFT从数据收集与清洗、messages格式化与模板一致性、训练超参与分布式ZeRO建议、评测抽检到导出可部署权重与推理验证的完整流程,给出可直接落地的步骤与检查清单。
全参SFT实战:从数据到训练到导出权重的完整流程
在《Ai大模型训练教程:从入门到实战落地的系统课程》这一系列里,全参 SFT(Supervised Fine-Tuning,监督微调)是最接近“把模型调成可用产品能力”的关键一环。与 LoRA/QLoRA 这类参数高效微调不同,全参 SFT 会更新模型全部(或绝大部分)参数,训练成本更高,但在一致性、风格对齐、复杂任务能力迁移上往往更“彻底”。
本文聚焦全参 SFT 的完整实操链路:数据准备 → 格式化与清洗 → 训练配置(以 Transformers + TRL/SFTTrainer 为主)→ 评估与对齐检查 → 导出权重与推理验证。你可以把它当作“照着做就能跑通”的工程流程模板。
1. 全参 SFT 前置决策:你真的需要全参吗?
在动手前先做两个判断,避免走弯路:
1.1 适用场景
全参 SFT 更适合:
- 你要明显改变模型行为:如行业话术、严格格式输出、工具调用风格、客服 SOP。
- 需要较强的“整体迁移”:复杂指令跟随、多轮对话连贯性、长文本结构化。
- 你有稳定算力与较高训练预算:比如 8×A100/ H100 或者至少 2~4 张 80GB 显存卡,或者使用 ZeRO/FSDP 做分布式。
不太建议全参的情况:
- 只是加一点领域术语、少量风格调整(LoRA 更划算)。
- 数据量很少(< 1k)且任务不明确,容易过拟合或“训坏”。
1.2 目标与验收标准
务必写清楚:
- 模型要学会哪些能力?(例如:根据用户工单生成规范回复,包含固定字段)
- 不能犯哪些错?(例如:不得胡编政策条款,不得输出敏感信息)
- 怎么验收?(自动化评测集 + 人工抽检清单)
2. 数据:从“能用”到“可训练”的关键步骤
全参 SFT 成败 70% 在数据。建议把数据流分为:收集 → 规范 → 清洗 → 切分 → 质量抽检。
2.1 选用数据结构:指令-回复 or 多轮对话
建议优先采用ChatML / messages 结构(与主流对话模型一致)。示例(JSONL 一行一条):
{"messages":[{"role":"system","content":"你是企业客服助手,回答需简洁、合规、可执行。"},{"role":"user","content":"我想退款,但订单已发货,怎么办?"},{"role":"assistant","content":"可以协助您申请退货退款:1)确认包裹未拆封/不影响二次销售;2)在订单页点击‘申请售后’选择‘退货退款’;3)按页面提示寄回后我们将在签收48小时内处理。若商品存在质量问题请上传照片,我们将优先为您处理。"}]}如果你的业务是单轮任务(例如分类、改写、结构化抽取),也可以采用“instruction + input + output”的扁平结构,但最终仍建议在训练前统一映射到 messages,减少模板差异。
2.2 数据来源与覆盖策略
可用来源包括:
- 历史客服对话、工单、FAQ
- 业务文档(规章制度、产品手册)转为问答对
- 专家撰写的示例(黄金数据,量不必大但要准)
覆盖策略建议用“能力矩阵”:
- 意图类型:咨询/投诉/退款/故障排查/政策解释
- 难度层级:简单→复杂(含条件、限制、多步骤)
- 输出形态:纯文本/条目/JSON/表格
对每一格设定最少样本数,例如每类意图至少 200 条,多轮至少占 20%(按你的产品形态调整)。
2.3 清洗与去重:避免把模型训“脏”
建议至少做以下处理:
1) 去重:完全重复、近似重复(可用 MinHash/SimHash 或 embedding 相似度)
2) 敏感信息脱敏:手机号、身份证、地址、订单号等用占位符替换
3) 剔除低质量回复:
- 过短(如 < 10 字)
- 明显敷衍(“不知道”“自己看说明书”)
- 非目标风格(脏话、攻击性)
4) 一致性规范:术语、单位、日期格式统一
实操建议:先抽样 200 条做人工检查,形成“坏样例清单”,再把规则编码化批量过滤。
2.4 训练/验证/测试切分
一个可落地的切分方案:
- train:90%
- valid:5%(训练中监控 loss / early stop)
- test:5%(仅用于最终评估)
注意:要避免同一用户/同一主题的相似对话跨集合泄漏(例如同一个订单问题变体出现在 train 与 test)。建议按“主题簇/工单类型/文档章节”分组切分。
3. 数据格式化:把 messages 转成模型可学习的 token
全参 SFT 的本质是语言建模 loss,但我们通常只对 assistant 部分计算 loss(避免模型去学习复读用户输入)。
3.1 选择 tokenizer 与 chat template
如果你使用的是带 chat template 的模型(如 Llama 系、Qwen 系),尽量使用官方 tokenizer 内置的模板能力。例如:
tokenizer.apply_chat_template(messages, tokenize=False/True, add_generation_prompt=False)
关键点:训练与推理必须用同一模板,否则会出现“训练时学到的格式”与“推理输入格式”不一致,效果大幅下降。
3.2 只在 assistant 上计算 loss(推荐)
原因:
- 让模型专注学习“如何回答”而不是“如何复读问题”
- 更贴近指令微调的目标
实现方式通常有两类:
- 使用 TRL 的
SFTTrainer+data_collator自动处理 - 自己构造
labels,把非 assistant token 的 label 置为 -100
4. 训练环境与依赖:一套可复用的工程基线
4.1 推荐依赖组合
transformersdatasetsacceleratetrl(SFTTrainer)- 分布式:
deepspeed或torchrun + FSDP
4.2 硬件与显存估算(经验值)
全参训练显存占用与模型大小、序列长度、batch size、优化器状态强相关。粗略经验:
- 7B 模型,fp16/bf16,全参:单卡 80GB 才较从容(还要看 seq_len)
- 13B:通常需要多卡 + ZeRO/FSDP
如果只有 24GB/48GB:更建议 LoRA;若必须全参,可考虑:
- 减小
seq_len - 减小 batch
- ZeRO-2/3
- Gradient checkpointing
5. 全参 SFT 训练实战:配置、命令、关键超参
下面以常见的“对话 SFT”作模板(你可替换模型名与数据路径)。
5.1 训练超参怎么选(可直接落地)
(1) 学习率(LR)
- 全参 SFT 通常比 LoRA 更敏感,建议从 1e-5 ~ 2e-5 起步
- 数据很少(<5k)时更保守:5e-6 ~ 1e-5
(2) 训练轮数(epochs)
- 1~3 轮常见
- 数据量大(>100k)时 1 轮就可能足够
(3) batch 与梯度累积
- 目标是合理的 global batch size(例如 64 或 128)
- 显存不够就用
gradient_accumulation_steps堆出来
(4) 序列长度(max_seq_length)
- 客服/工具调用:2048 常用
- 长文档问答:4096/8192(成本上升很快)
(5) 优化器与精度
- bf16(若硬件支持)通常比 fp16 稳定
- 优化器:AdamW
5.2 一个可执行的训练脚本结构(思路清晰版)
核心流程:
1) load tokenizer & model
2) load dataset(jsonl)
3) apply chat template → text
4) 用 SFTTrainer 训练
5) 保存权重与 tokenizer
你需要重点确认 3 个点:
- chat template 一致
- labels masking(只算 assistant)
- valid 集在训练中可观测(loss 曲线,必要时早停)
5.3 分布式训练建议:Deepspeed ZeRO
当你显存压力较大时,建议上 Deepspeed。
- ZeRO-2:分片优化器状态,配置相对简单
- ZeRO-3:连参数也分片,省显存更多,但通信更复杂
实操建议:先用 ZeRO-2 跑通,再上 ZeRO-3。
训练中务必观察:
train_loss是否平滑下降eval_loss是否开始回升(过拟合信号)- 生成质量是否出现“格式崩坏/胡言乱语”(模板或数据污染信号)
6. 训练质量检查:不仅看 loss,更要做可解释抽检
全参 SFT 容易出现“loss 看起来不错,但回答不符合业务”的情况,因此必须做对齐检查。
6.1 固定评测集(建议至少 200 条)
评测集应该覆盖:
- 关键业务场景(退款、投诉、故障排查)
- 高风险场景(政策、金额、承诺时效)
- 边界场景(用户诱导违规、信息不足)
每条样本建议带“验收点”,例如:
- 必须包含字段:
处理步骤、注意事项 - 不得出现:编造政策条款
- 语气:礼貌、简洁
6.2 人工抽检清单(可复用)
抽检时按以下维度打分(1~5):
- 正确性:是否给出可执行的正确步骤
- 完整性:关键条件是否覆盖
- 合规性:是否越权承诺、是否泄露隐私
- 风格一致:是否按要求输出结构
- 鲁棒性:用户信息不全时是否会追问
6.3 常见问题与定位方法
- 模型爱复读用户:通常是 labels 没 masking,或模板处理错误
- 格式经常错(JSON 缺字段):训练样本格式不稳定;需要统一输出模板并强化示例
- 回答变短、变保守:训练数据偏“拒答”或“简短回复”;增加高质量长回复样本
- 出现业务幻觉:补充“知识边界”样本(信息不足就追问/引用规则),并清理含编造内容的数据
7. 导出权重:从训练产物到可部署模型
全参 SFT 导出相对直接,但仍有几个坑。
7.1 保存内容清单
至少应保存:
pytorch_model.bin或model.safetensorsconfig.json- tokenizer 全套文件(
tokenizer.json、tokenizer.model、special_tokens_map.json等) - 训练使用的 chat template(如果是自定义的,务必落盘)
7.2 合并/转换(按部署框架)
- 如果你用 Transformers 推理:直接
from_pretrained(ckpt_dir)即可 - 若要上 vLLM/TGI:确保模型目录结构规范,safetensors 更友好
- 若要导出 GGUF(llama.cpp):需要对应的转换脚本与量化流程(注意量化会影响格式输出能力,需回归测试)
7.3 推理一致性验证(必须做)
用训练同款模板跑 20~50 条固定样本,检查:
- 输出风格是否与训练一致
- system 指令是否生效
- 停止词(eos/stop tokens)是否正确,避免输出“无穷续写”
建议固定一套推理参数用于验收:
- temperature:0.2~0.7(业务助手通常偏低)
- top_p:0.8~0.95
- max_new_tokens:根据任务设定上限
8. 一条“从零到可用”的最小闭环路线(建议照做)
如果你是第一次做全参 SFT,推荐用最小闭环降低风险:
1) 准备 2k~10k 条高质量样本(宁少勿烂),统一 messages 格式
2) 切出 200 条评测集,写清验收点
3) 选 7B 基座模型,设定 max_seq_length=2048
4) 用 bf16 + gradient checkpointing + ZeRO-2(如需要)跑 1 epoch
5) 用固定评测集生成对比:基座 vs SFT 后
6) 针对失败样本回流数据:补示例、修模板、清脏数据
7) 训练第 2 次,再评估,再迭代
做到第 2~3 轮,你通常会得到一个“能稳定输出、可上线灰度”的版本。
9. 结语:全参 SFT 的工程要点
在 Ai 大模型训练教程的实战阶段,全参 SFT 的关键不是“把训练跑起来”,而是把数据标准化、模板一致性、评测闭环、导出可部署这四件事做扎实。
你只要抓住三条原则,成功率会明显上升:
- 数据质量优先于数据数量
- 训练与推理的模板必须一致
- 用评测集驱动迭代,而不是凭感觉调参
下一步如果你要继续提升上线效果,通常会进入:偏好对齐(DPO/IPO)、工具调用强化、RAG 与 SFT 的组合策略,以及更严格的安全与合规评测流程。
Prev:SFT指令数据怎么做:任务分布、模板设计、拒答样本与质量抽检