监督微调

SFT (Supervised Fine-Tuning)

SFT(监督微调)是在通用基模型上用高质量任务数据集(问答、指令遵循、对话等)做有监督微调的训练环节,是 RLHF、DPO 等对齐流程的前置基础步骤。

详细解释

SFT(Supervised Fine-Tuning,监督微调) 是让基模型从”能接上文”的语言模型,变成”听得懂指令”的助手模型的第一道工序。基模型(比如 Llama 3 70B base、Qwen 2 72B base)只学到了下一词预测能力——你问它”北京是哪个国家的首都”,它很可能接”,也是中国政治文化中心”,不会直接回答”中国”。SFT 就是通过喂给它几万到几十万条”(指令,期望回答)“成对的标注数据,教它学会以”回答式”的格式输出而不是”续写式”。

SFT 与 Instruction Tuning 的关系:两者经常混用但略有差别。Instruction Tuning 是更大的概念,强调”跨任务泛化的指令数据 + 零样本新任务迁移”的方法论;而 SFT 是训练手段本身:只要是(输入 X,输出 Y)对形式的微调,就叫 SFT。实际落地时,大家常说的 “做一版 SFT” = 用指令-回答对跑几轮 LoRA/全参微调。

典型 SFT 数据来源

数据类型示例作用质量权重
高质量对话ShareGPT / UltraChat / WildChat 人工分享对话教会模型”如何像人类一样说话”最高(决定助手味)
指令遵循数据Alpaca、GPT-4-LLM、Flan 系列教模型遵循 200+ 种任务格式高(决定通用性)
代码数据Stack Exchange、CodeAlpaca 百万级写代码 / 修 bug高(逻辑推理相关)
逻辑/数学推理GSM8K、MATH、Orca 推理链CoT 推理能力(先想后答)中高
企业私有场景客服历史(脱敏后)/ 公司 FAQ / 产品文档问答适配你自己的业务语气和领域术语高(场景化)

唯元智创 SFT 训练服务(零代码)

唯元智创 控制台支持自助创建 SFT 任务:上传 JSONL(messages 格式,system/user/assistant 三段)→ 选基座模型 → 选 LoRA rank(默认 16/32)→ 2-4 小时产出可部署的 Adapter。训练过程全程可视化 loss/LR 曲线,自动评估 20 条随机样本生成对比。训练完成后模型直接可在”模型商城 - 我的私有模型”里通过 /chat/completions 调用,计费与公有模型相同。

常见超参数速查表(建议收藏)

超参数小模型(< 13B)大模型(>=33B)推荐优先调
Epochs(训练轮数)2 至 31 至 2第一个要调的,太多容易过拟合
Batch Size(每步样本数)16 至 324 至 8看卡显存,不够开 gradient accumulation
Learning Rate(学习率)1e-5 至 3e-55e-6 至 1.5e-5太大发散、太小学不动
LoRA rank r16 / 328 / 16越大能力越强,文件越大
LoRA alphar 的 2 倍(r=32 时 alpha=64)r 的 2 倍经验公式 alpha=2r
Max Length(训练序列长)2048 / 40968192越长越好,但显存线性涨

常见问题

SFT 需要多少数据才够?
没有标准答案,取决于任务宽度。单一场景(比如你是做客服机器人,只回答自家 100 条常见问题):1000 到 3000 条高质量样本就明显超过 RAG;中等任务(要会写代码 + 会翻译 + 会摘要 + 会客服):1 万到 5 万条;做通用助手级(对齐到 ChatGPT 风格):10 万到 50 万条,且必须混入一定比例的 CoT 推理链数据。经验:数据质量 > 数据数量 100 倍,宁可 3000 条全是人审无噪音的,也别 10 万条爬来的乱数据,后者会把模型训废。
SFT 之后要不要接 RLHF/DPO?
取决于你的用户期待的是”做事能力”还是”对话舒适感”。如果是内部工具(数据分析师用的 SQL 生成器、程序员用的代码助手),SFT 之后其实够用了——你的用户不介意模型”说话像机器人”,只要答案对就行。如果是面向 C 端用户的闲聊 / 情感陪伴 / 教育类对话产品,SFT 回答往往是”生硬模板感”,需要再接 DPORLHF 加一层偏好对齐,把输出拉成”像人一样有礼貌、带语气、会拒绝不安全问题”。
SFT 时 system 指令放不放进训练样本里?
强烈建议放,而且要多样化。做法:每条样本随机挑选 3 到 5 种不同的 system 指令(比如”你是一个乐于助人的 AI 助手”/“请简明回答用户问题,不要多余废话”/“你是代码助手,先给出代码再解释”),再搭配 user+assistant 段。这么做是为了训练时让模型把”system 指令”当成真实的行为开关,而不是训练时永远没见过 system,线上加了就完全不理会。这也是很多新手 SFT 之后发现”加 System Prompt 没用”的根因——他们训练数据里一条都没写 system,只有 Q/A。