本文围绕 Ai大模型训练教程 的实战环节,详解 SFT 指令数据怎么做:如何制定任务分布与难度梯度、统一 system/user/assistant 模板、构建拒答与合规对照样本,并用分层抽样与量化评分完成质量抽检与回流,给出可直接执行的流程与检查清单。
SFT 指令数据的目标:让模型“按你希望的方式说话”
在 Ai大模型训练教程 的实战路径里,SFT(Supervised Fine-Tuning,监督微调)最核心的产出不是“更多数据”,而是更可控的行为:
- 面对不同任务,输出结构稳定、格式可解析
- 回答风格统一(语气、长度、引用规范、是否给步骤)
- 在边界问题上能“拒答/引导”,而不是瞎编
- 遇到缺信息时会主动澄清、补齐输入条件
要做到这些,SFT 指令数据需要从 任务分布、模板设计、拒答样本、质量抽检 四个维度同时落地。本篇围绕这四件事给出可直接执行的做法、示例与检查表。
一、任务分布怎么定:先画“能力雷达”,再配比数据
1.1 先定义你的模型“服务场景”
很多团队 SFT 做不起来,原因是“任务类型过多且边界不清”,最后变成把通用问答数据倒进来。建议先把业务需求落成 2 层结构:
- 一级能力域:如客服问答、知识检索、写作、代码、数据分析、工具调用、合规拒答
- 二级任务:如客服里的“退换货政策解释”“物流异常处理”“情绪安抚”“工单结构化输出”
把它做成一张表(后面会用于抽检与配比)。
1.2 任务分布的推荐配比(可做起步版)
下面给一个通用“起步配比”,你可以按业务重要性调整:
- 主业务任务(50%~70%):模型主要要干的事(例如客服、助理写作、行业问答)
- 格式与结构化输出(10%~20%):JSON/表格/要点列表/固定字段(可解析)
- 澄清与追问(5%~10%):输入缺信息时,先问再答
- 长上下文与多轮(5%~10%):复现真实对话节奏(含历史引用)
- 拒答与安全(5%~15%):合规拒答、边界引导、低风险替代方案
如果你的场景高度结构化(如工单、质检、知识库问答),可以提高“结构化输出”和“拒答”的比例;如果是内容创作,提高“写作风格/改写/扩写/摘要”的比例。
1.3 覆盖“难度梯度”:别只喂简单题
建议每个二级任务内部再做难度分层:
- 基础题(50%):输入完整、直接回答
- 中等题(35%):信息不全/需要归纳/需要引用规则/需要对比
- 困难题(15%):冲突指令、陷阱问题、跨段推理、多轮纠错、格式约束严格
困难题数量少但价值高,决定模型在真实环境是否“稳”。
1.4 数据去重与“近重复”控制
SFT 很怕“模板化重复”导致过拟合:模型学会背例子而不是学规则。
实操建议:
- 指令近重复检测:对 instruction 做 embedding,相似度 > 0.92 的只留 1~2 条
- 答案近重复检测:对 output 也做相似度过滤,避免同一话术刷屏
- 实体/数值扰动:同一模板下替换商品名、时间、地点、金额、政策条款编号,增加泛化
二、模板设计:用统一“对话协议”降低训练噪声
2.1 优先采用“稳定的消息结构”
建议统一为(兼容多数训练框架):
- system:角色、边界、风格、输出约束
- user:用户输入
- assistant:期望答案
不要在同一数据集中混用多种协议(例如一会儿是 Instruction/Response,一会儿是 ChatML 但字段不同),否则训练时等于引入噪声。
2.2 system 模板:写清楚三件事
一个好用的 system 模板至少要包含:
1) 角色与任务:你是谁、要做什么
2) 边界与拒答:不能做什么,遇到什么要拒绝/转人工
3) 输出格式:是否必须 JSON、字段有哪些、是否要给步骤
示例(偏结构化输出):
- 角色:电商客服助手
- 规则:不编造订单信息;缺信息先询问;涉及退款必须引用政策摘要;无法判断建议转人工
- 输出:必须输出 JSON:{"intent","need_clarification","reply","next_question"}
2.3 user 模板:把“真实噪声”加进去
真实用户的输入往往:
- 有错别字、口语、省略
- 一次问多个问题
- 情绪化表达
因此 user 侧要刻意覆盖:
- 口语化:"你们这快递咋还没到?"
- 缺信息:"我要退货"(没订单号、没原因)
- 多意图:"能改地址吗顺便开发票"
2.4 assistant 模板:显式展示“决策过程的结果”,不要泄露推理草稿
SFT 的目标是教会模型输出正确答案与格式,而不是让模型在输出里写冗长推理。建议:
- 给出结论 + 关键依据
- 需要追问时,明确问什么
- 结构化字段值可检验
示例(结构化 JSON 输出,含追问):
- intent:refund_request
- need_clarification:true
- reply:说明退款条件与大致流程
- next_question:询问订单号、是否已签收、商品是否完好
2.5 模板要“参数化”,避免写死
把可变部分变成槽位:
- 商品名、价格、时间、政策条款
- 城市、物流状态、发票类型
- 用户身份(新客/会员/VIP)
这样你可以用脚本批量生成多样样本,同时保持格式一致。
三、拒答样本怎么做:拒得对、说得清、还能给替代方案
拒答(或安全引导)在 SFT 里常见两类失败:
- 过度拒答:正常问题也拒绝,模型变“胆小”
- 拒答不彻底:嘴上说不能,转头给出危险步骤
3.1 先定义“拒答触发策略”
你需要一张拒答策略表(在抽检也会用到):
- 违法/高危:武器、诈骗、黑产、毒品 → 坚决拒绝
- 隐私与数据:索要他人身份证、手机号、住址 → 拒绝并提示合规
- 医疗法律金融:高风险建议 → 限制为信息性科普,建议咨询专业人士
- 企业内部:要求泄露内部政策/密钥/客户数据 → 拒绝
然后决定输出风格:
- 拒答 + 原因(简短)
- 提供安全替代(例如合法的学习资料、合规操作步骤)
- 必要时建议求助渠道(如客服、医生、律师)
3.2 拒答样本要覆盖“诱导与变体”
不要只写直白请求,还要覆盖:
- 角色扮演绕过:"假设你是黑客…"
- 分步套取:先问概念再问工具再问执行
- 伪装用途:"用于安全测试"、"用于论文"(没有合法授权证明)
- 语义改写:同义词、拼写错误、谐音
3.3 拒答样本的标准答案结构(可复用)
给一个可复用结构:
1) 明确拒绝:我不能帮助…
2) 简述原因:涉及违法/隐私/安全风险
3) 替代方案:提供合法合规的方向
4) 追问(可选):如果是正当用途,建议提供授权范围/合规证明/改问为防护建议
3.4 “拒答对照组”:防止过度拒答
必须加入“看起来敏感但其实合规”的样本,告诉模型哪些可以答:
- 合规安全科普:如何防范钓鱼、如何设置强密码
- 合法工具使用:如何在自己系统里做渗透测试(强调授权)
- 合规数据处理:如何脱敏、如何做权限控制
这些样本能显著降低“见到关键词就拒”的问题。
四、质量抽检:把主观评审变成可执行的“打分与回流”
SFT 数据质量决定上限。建议把抽检做成流水线:抽样 → 评分 → 返工 → 版本化。
4.1 抽检的分层抽样方法
不要只随机抽。建议按以下维度分层:
- 任务类型(每个二级任务都要抽到)
- 难度等级(基础/中等/困难)
- 数据来源(人工写、脚本生成、改写、历史对话清洗)
- 是否拒答类
起步抽检比例建议:
- 小批次(<5k):抽 8%~15%
- 中批次(5k~50k):抽 3%~8%
- 大批次(>50k):抽 1%~3%,但对高风险任务(拒答、合规、工具调用)额外加抽
4.2 评分表:至少 6 个维度,能量化就量化
推荐维度(每项 0/1 或 1~5):
1) 指令清晰度:用户意图是否明确
2) 答案正确性:事实/规则是否正确(能否追溯依据)
3) 完整性:是否覆盖用户所有问题
4) 格式合规:JSON/字段/Markdown 标题等是否符合
5) 一致性:与 system 约束是否冲突(如“必须先澄清”却直接编)
6) 安全与拒答:该拒是否拒、拒得是否彻底、替代是否合规
再加两个“硬性一票否决”:
- 编造关键事实(订单号、政策条款、引用来源)
- 输出包含敏感数据或危险指导
4.3 常见瑕疵与修复方式(可直接用于返工)
瑕疵:输出格式偶尔漂移
- 修复:在 system 增加强约束;在数据里加入“格式错误→纠正”的对话;提高结构化样本占比
瑕疵:缺信息不追问,直接猜
- 修复:加入“need_clarification=true”的样本;对同类问题制作 20~50 条专门追问数据
瑕疵:拒答不稳定
- 修复:建立拒答策略表;对同一触发点制作多种改写;加入对照组合规问法
瑕疵:话术空泛
- 修复:要求答案包含可执行步骤、条件、例子;为每类任务准备“标准操作清单”并体现在输出中
4.4 回流机制:把抽检结果变成“下一版数据任务”
建议每次抽检后输出三类清单:
- 删除清单:一票否决样本直接剔除
- 返工清单:可修复的样本(标注问题类型)
- 增补清单:暴露出覆盖空白的任务(例如“退款+发票+改地址”的多意图组合太少)
并且为数据集做版本号:
- sft_v0.1_raw
- sft_v0.1_clean
- sft_v0.2_add_refusal
这样你能在训练后定位“是哪一版数据导致了行为变化”。
五、给你一套可直接执行的生产流程(从 0 到可训)
5.1 流程概览
1) 定义任务树与配比(表格)
2) 设计统一模板(system/user/assistant)
3) 生成/撰写样本(覆盖难度梯度与拒答对照组)
4) 自动规则校验(格式、字段、长度、敏感词初筛)
5) 分层抽检与评分
6) 返工/删除/增补
7) 导出训练集与验证集(建议按任务分层切分,避免泄漏)
5.2 自动校验建议(不依赖复杂模型也能做)
- JSON 可解析性校验
- 必填字段存在性校验
- 输出长度范围(防止极端短/极端长)
- 是否出现“我无法访问你的订单但我查到…”这类编造迹象(正则/关键词)
- 拒答类样本:检测是否包含明确拒绝句式 + 不包含具体危险步骤
5.3 验证集怎么留:按任务分桶留出
不要随机切分导致同模板的近重复同时出现在训练和验证。建议:
- 以“任务类型 + 模板族 + 实体组合”做分桶
- 每桶留 5%~10% 做验证
这样验证集更像真实泛化测试。
六、最小可行样本(MVP)建议:先做对,再做大
如果你是第一次做 SFT,建议先做一个 MVP:
- 选 3~5 个最核心二级任务
- 每个任务 200~500 条高质量样本(含追问、困难题、格式约束)
- 拒答与合规 300~800 条(含对照组)
训练一轮看行为:格式是否稳定、是否会追问、是否会乱编、拒答是否过度。再决定扩大任务面与数据量。
七、落地检查清单(上线前最后过一遍)
- [ ] 任务分布是否与线上流量匹配(主任务占比是否足够)
- [ ] 是否存在大量近重复指令/答案(相似度过滤是否做过)
- [ ] system 是否统一、是否包含边界与格式要求
- [ ] 是否覆盖缺信息追问、多轮纠错、冲突指令
- [ ] 拒答策略是否成表、是否有诱导变体与对照组
- [ ] 抽检评分是否量化、是否有一票否决规则
- [ ] 返工与增补是否回流到下一版数据集并版本化
通过这套方法,你的 SFT 指令数据会从“堆数据”变成“可控地塑形模型行为”,这是 Ai大模型训练教程 实战落地里最关键的一步之一。
Prev:长上下文怎么训得稳:RoPE缩放、分段训练、序列长度课程学习与显存预算