城东老面馆的康师傅收了个徒弟叫小模。小模记性好、手脚快,底子比谁都强——可他没下过厨。康师傅教了三个月,发现真正决定小模水平的,不是天分,而是手边那本《金牌教案》:一百道招牌菜的标准示范,每一步该放多少盐、翻炒几下、什么时候关火,写得清清楚楚。小模照着做,客人就点头;教案写得含糊,小模就抓瞎。这本教案,就是我们今天要讲的“指令数据”。 大模型也是一样的道理。基座模型读过海量网页和书籍,像极了天赋异禀的小模,但它只会“接着往下写”,不会“听话办事”。监督微调(SFT)就是那场手把手的教学,教学的质量九成取决于教案——指令数据的质量。本篇文章带你看看康师傅们是怎么从零做出一份好教案的:请状元师兄批量出模拟教案(Self-Instruct 自动生成)、老师傅逐条批改(人工标注)、三道筛子把关(质量控制)、让教案五味俱全由浅入深(多样性与难度分级),再去书铺参考名店教材(Alpaca 与 ShareGPT 开源数据集)。读完你就会明白,为什么说“数据决定模型的指令遵循能力”。
指令数据是 SFT 微调的第一道闸门。掌握自动生成、人工标注与质量控制的完整链路,是做微调工程师、标注规范设计者或数据算法研究员的必备基本功,直接决定模型交付效果的上限。
可视化演示
展示Seq2seq模型中编码器逐步读取输入序列、生成上下文向量,解码器据此逐步生成多步预测输出的完整流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
编码阶段 编码器逐步读取x1→x4,隐藏状态h_t=f(h_{t-1},x_t) 最终隐藏状态h4作为上下文向量c c=h_T, T=输入序列长度 上下文向量编码了输入序列的完整信息
指令数据根基
康师傅教小模做菜,第一件事不是买锅买铲,而是把“标准示范”摆到徒弟面前。小模脑子聪明,但没看过师傅颠勺,做出的菜就没有灵魂。基座大模型也一样——它已经读过千万亿字的网页和书籍,知识量惊人,但“懂”不等于“听话”:你问它一句无关紧要的话,它可能自顾自地编故事。SFT(监督微调)就是那场手把手的教学,而指令数据就是教学用的示范教案。
为什么教案质量直接决定教学效果?因为 SFT 的原理只有一个字:模仿。模型看到一条条“指令 → 优质回答”的配对,就学着在相似的指令下输出相似的回答。如果教案里满是错误示范、含糊作答,模型学到的就是“应付着答”的坏习惯。业界有个广为流传的判断:在 SFT 阶段,数据质量对模型效果的影响远大于训练超参数的调优。LIMA 用精心挑选的 1000 条数据就显著提升了指令遵循能力,Alpaca 也只用 52k 条自举数据就让小模型“脱胎换骨”。
数据规模与训练损失之间存在近似幂律的经验关系,这解释了“为什么不能只靠堆数据”:
所以康师傅对徒弟说:你天赋再高,也得看师傅教的示范正不正、全不全。指令数据就是大模型的命根子——它的质量,划定了模型指令遵循能力的天花板。
- 数据条数自变量$N$ 代表送入 SFT 的指令数据条数,单位是“条”,它是公式中的自变量。
- 幂律衰减项$N^{-\alpha}$ 刻画损失随数据增长而下降的规律,$\alpha > 0$ 越大,下降越快。
- 拟合常数$a$ 是缩放系数,$\epsilon$ 是不可消除的固有误差下界,代表“再多的数据也补不齐的缺陷”。
- 现实含义当 $N$ 翻倍,收益越来越小,所以“无限加数据”不如“提升每条数据的质量”。
Self-Instruct自动生成
康师傅一个人写教案太慢,于是请来参加过厨王争霸的状元师兄。师兄灵机一动:我照着师傅手写的几道样菜,用同一套思路批量仿写出几百道菜的做法示范,不就把教案扩充起来了?这招叫“让大徒弟替师傅出题”。
Self-Instruct 正是这个思路。它先用人工编写一小撮“种子指令”(比如 100~200 条),然后让一个能力较强的 LLM 扮演“出题老师”:给定几条示例指令,模型照葫芦画瓢批量生成新指令,再让模型为每条新指令写出答案。斯坦福的 Alpaca 就靠这个自举办法,用 175 条种子指令“滚”出了 52k 条指令数据,成本只有几百美元,一时间成为开源社区的标杆。
Self-Instruct 的标准流程分四步:第一步,人工准备种子指令集,尽量覆盖多种任务类型;第二步,设计提示模板,把 6 条左右示例拼进提示词,让模型“模仿出题”;第三步,用相似度算法把与已有指令高度重复的新指令剔除;第四步,对留下的新指令生成回答,组装成“指令—回答”对。其中第三步的去重是关键,常用 ROUGE-L 来衡量两条指令的相似程度:
师兄批量仿写的教案虽多,但难免跑题、重复。康师傅心里有数:大师兄的出题只算“初稿池”,真正决定教案质量的是后面的逐条批改和层层筛选。
- 最长公共子序列$LCS(X, Y)$ 表示指令 $X$ 与 $Y$ 按顺序共有的最长字符序列长度,是文本相似度的核心指标。
- 归一化分母$\max(|X|, |Y|)$ 取两条指令长度的较大者,把相似度归一化到 0~1 区间。
- 去重判定当 $\text{ROUGE-L} \ge 0.7$ 时视为重复指令并剔除,小于 0.7 才当作“新指令”保留。
人工标注规范
批量教案再多,康师傅还是放心不下。他又请来几位老师傅,每人分一沓初稿,照着统一的“红本本”逐条批改:术语怎么用、步骤写几步、客人说“随便”该怎么应对、客人提了违规要求又该怎么婉拒。没有这本红本本,三位老师傅就会教出三套拳法。
现实中的高质量指令数据,尤其是垂直领域的部分,仍然大量依赖人工标注。人工标注不是“会写字就能干”,最关键的是先制定标注规范。一份合格的规范至少要回答四类问题:一是任务定义,这条指令到底要模型做什么;二是答案格式,是给列表还是给段落、长度限制多少;三是语气风格,面向 C 端用户要亲切还是严谨;四是边界情形,涉及敏感、违法、医疗建议等内容时必须拒答,并给出标准拒答话术。
团队建设也讲究分层:普通标注员负责初稿,质检员负责复核抽检,审核人负责疑难样本仲裁。为了提效,业界普遍采用“预标注 + 人工修改”的模式——先让 LLM 产出一版初稿,人工只做修订,而不是从零开始写。规范好不好,要看标注一致性:同一道题,两个标注员给出的答案是否一致。这个一致性通常用 Cohen's Kappa 系数衡量:
红本本写得越细,老师傅们批改出来的教案就越统一,小模才不会学了三个师傅的三套拳法,最后谁的都不像。
- 观测一致率$p_o$ 是两位标注员对同一批样本给出完全相同标注结果的比例。
- 偶然一致率$p_e$ 是根据各类别出现的先验概率,算出“两人纯靠猜也会一致”的期望比例。
- 扣除偶然$\kappa = \frac{p_o - p_e}{1 - p_e}$ 从实际一致性中扣掉运气成分,得到真正的共识程度。
- 合格线业界通常要求 $\kappa \ge 0.7$ 才算标注规范可行,否则要重新培训标注员或修订规范。
质量控制体系
教案初稿堆成小山,里面难免混进“把盐当糖”的错漏示范。康师傅立了三道筛子:第一道用尺子量——长度、格式不对的直接扔;第二道让舌头尝——读起来别扭的删掉;第三道请老师傅抽检——按比例抽查,发现系统性错误就回去修规则。
质量控制体系正是这三道筛子的工程化版本。第一层是启发式规则过滤:设定指令长度上下限、过滤含乱码或敏感词的样本、校验答案是否为空、是否与问题重复等。规则简单、速度快、可解释性强,能拦下大部分低级噪声。第二层是基于模型的方法,其中最常见的是困惑度(Perplexity)筛选:用一个语言模型给候选文本打分,文本越“出乎意料”,越可能是机器生成的怪句或幻觉样本。困惑度定义如下:
除了困惑度,还可以让强 LLM 给指令打分排序,或让两个模型互相打分求平均。第三层则是人工抽检:按 5%~10% 的比例随机抽验,发现问题就回溯修正规则或补标注。三道筛子层层过滤,把“幻觉放大”的噪声样本拦在训练集之外。筛完之后,留在教案里的每一页都经得起推敲,小模照着学才不会练歪。
- 字符条件概率$p_\theta(x_i \mid x_{<i})$ 是模型在已知前 $i-1$ 个字符时,正确预测第 $i$ 个字符的概率。
- 平均对数似然$\frac{1}{N} \sum_{i=1}^{N} \log p_\theta(x_i \mid x_{<i})$ 是整句所有字符对数概率的平均值。
- 指数还原$\exp(\cdot)$ 把负的平均对数概率还原成“困惑分数”,数值越小越好。
- 过滤判据实践中会给 PPL 设阈值,超过阈值(比如 95 分位)的文本直接淘汰。
多样性与难度分级
小模学会了番茄炒蛋,可客人点宫保鸡丁时他当场懵住。康师傅恍然大悟:教案不能只盯着一道菜练,得五味俱全、由浅入深。于是他把教案重新编排:鲁菜、川菜、粤菜样样都要有,先教家常小炒,再教宴席硬菜。
指令数据也一样,两个维度缺一不可。第一个维度是多样性:任务类型要覆盖问答、写作、改写、总结、代码、数学推理等常见场景,领域分布要均衡——不能十道题里八道是美食,剩下两道才是其他。第二个维度是难度分级:训练样本不能全是“1+1=2“级别,也不能全是研究生论文级别,要参考学生学习的”最近发展区”,先易后难、难易混排,让模型在舒适区外一点点进步。
如何量化多样性?可以用信息熵来衡量任务分布的均匀程度:
至于难度分级,除了人工设定,更聪明的做法是进化式扩展(Evol-Instruct):让 LLM 把一条简单指令不断“进化”成更难的版本——加约束条件、加推理步骤、加背景信息,再让 LLM 自己解答新题。WizardLM 就是靠这套方法,把 25 万条指令逐步加深,训练出了在复杂任务上表现亮眼的模型。见多识广、循序渐进的小模,终于从“只会一招”变成“样样拿得出手”。
- 类别占比$p_k$ 是第 $k$ 类任务(如问答、创作、代码)在指令库中的数量占比,且所有占比之和为 1。
- 逐类求和$-\sum_{k=1}^{K} p_k \log p_k$ 把每一类的信息量加权累加,得到整体的熵值。
- 熵值判读$H$ 越大分布越均匀;若某一类占比极高,熵值会明显变小,提示要补充其他类型。
开源数据集解析
康师傅决定给小模加课,于是去书铺买了两本名店教材:一本是连锁大饭店 Alpaca 家公开的“标准化菜谱”,足足 52k 道菜的示范;另一本是 ShareGPT 面包房贴出来的“顾客点单记录”,全是客人与服务生的真实对话。教材虽好,康师傅也知道不能照搬——名店的菜未必合自家客人的口味。
Alpaca 数据集来自斯坦福,用 Self-Instruct 方法自动生成 52k 条指令数据,优点是成本低、任务覆盖广,适合快速启动 SFT;缺点是模型自举会放大幻觉,且指令同质化明显,同一套模板生成的句子结构雷同。ShareGPT 数据集则来自用户与 ChatGPT 的真实对话,风格自然、多轮上下文丰富,是训练对话模型的好原料;但它是“野生”数据,噪声大、长短不均、混合多语言,直接使用会污染训练集。
使用开源数据集,核心动作是“清洗 + 配比”。清洗包括去重(用 ROUGE-L 把高度相似的样本合并)、去噪(过滤低质量与重复内容)、领域重写(把通用指令改写成本领域说法)。配比则要按业务目标混合多来源数据,通用、领域与安全三类样本的配比可以这样描述:
名店教材只能当参考。真正让小模出师的,是康师傅按自家口味重新配比、三道筛子反复滤过的“独家教案”——开源数据集同理,拿来补齐冷启动,但最终质量还得靠自己构建与把关。
- 三类数据源$D_{\text{通用}}$ 是通用问答指令,$D_{\text{领域}}$ 是垂直行业指令,$D_{\text{安全}}$ 是拒答与价值观边界样例。
- 加权系数$\alpha, \beta, \gamma$ 控制三类数据的占比,实践中常从 6:3:1 起步,按业务效果调整。
- 归一化约束$\alpha + \beta + \gamma = 1$ 表示三者是比例关系而非绝对数量,方便对比与调参。
AI 应用场景
场景一:智能客服的领域指令数据构建
阶段:数据处理与 SFT 训练阶段
解决的问题:通用指令数据让客服模型“会聊天但不懂业务”。传统做法是让业务专家从零手写几千条问答,速度慢、覆盖不全,且专家口径不一。借助 Self-Instruct 先让大模型按“种子工单”批量生成候选指令,再由资深坐席按标注规范审改,既能快速铺量,又能保证领域术语和专业口径统一。
具体案例:某电商团队把 300 条种子工单喂给 GPT-4,自动滚出 3 万条候选指令,经规则去重 + 困惑度过滤 + 坐席抽检后保留 1.2 万条高质量数据,再混入 2000 条安全拒答样例。微调后的客服模型一次解决率提升了 18%,投诉升级率下降 9%。
场景二:模型迭代前的分难度评测指令集构建
阶段:模型评估与回归测试阶段
解决的问题:每次 SFT 迭代后,都需要一套稳定的“考卷”来验证指令遵循能力是否回退。人工出题覆盖面窄、难度不可控。利用难度分级策略,把指令按“易(单轮问答)、中(多步推理)、难(长文本约束创作)”分档构建,再用熵检查任务分布是否均衡,保证评测集既稳定又有区分度。
具体案例:某大模型团队为每次微调迭代准备了 800 题分难度评测集,配合 LLM 打分器自动判分。某次新增 5000 条代码指令后,通过这套评测集发现数学推理分项下降 6 分,及时回滚并调整了数据配比。
Python 演示
import random SEED_INSTRUCTIONS = [ "写一首关于夏天的五言绝句。", "把这句话翻译成英文:今天天气真好。", "用一句话总结什么是机器学习。",] TEMPLATES = [ "请解释一下{concept}的基本原理。", "帮我写一个关于{topic}的公众号标题。", "把以下内容整理成要点:{content}", "用初学者能听懂的话介绍{concept}。",] CONCEPTS = ["梯度下降", "注意力机制", "过拟合", "反向传播", "学习率"]TOPICS = ["失眠", "Python", "健身", "读书笔记", "旅游攻略"]CONTENTS = ["人工智能正在改变生活", "数据是新时代的石油", "勤学苦练才能进步"] def generate_candidates(seed, n=4): candidates = [seed] for _ in range(n): t = random.choice(TEMPLATES) if "{concept}" in t: candidates.append(t.format(concept=random.choice(CONCEPTS))) elif "{topic}" in t: candidates.append(t.format(topic=random.choice(TOPICS))) else: candidates.append(t.format(content=random.choice(CONTENTS))) return candidates def overlap_similarity(a, b): set_a, set_b = set(a), set(b) if not set_a or not set_b: return 0.0 return len(set_a & set_b) / max(len(set_a), len(set_b)) def dedup_filter(candidates, threshold=0.7): kept = [] for c in candidates: if all(overlap_similarity(c, k) < threshold for k in kept): kept.append(c) return kept def quality_filter(candidates, min_len=8, max_len=50): return [c for c in candidates if min_len <= len(c) <= max_len] def main(): random.seed(42) all_kept = [] for seed in SEED_INSTRUCTIONS: cands = generate_candidates(seed) cands = quality_filter(cands) cands = dedup_filter(cands, 0.7) all_kept.extend(cands) print("种子: " + seed) print(" 生成并存活: " + str(len(cands)) + " 条") print("最终指令库: " + str(len(all_kept)) + " 条") for item in all_kept: print(" - " + item) if __name__ == "__main__": main()
SEED_INSTRUCTIONS = [...]人工编写少量种子指令,对应 Self-Instruct 的第一步。TEMPLATES = [...]用模板模拟大模型“生成”新指令的能力,实际工程中由 LLM 提示词完成。generate_candidates(seed, n=4)每条种子指令批量衍生 4 条候选,模拟自举扩量。overlap_similarity(a, b)用字符重合率近似计算两条指令的相似度,对应 ROUGE-L 的简化版。dedup_filter(candidates, threshold=0.7)相似度低于 0.7 才保留,模拟去重阈值。quality_filter(candidates, min_len=8, max_len=50)用长度范围过滤异常短或超长的噪声样本。random.seed(42)固定随机种子,让生成结果可复现,便于实验对比。
常见误区
误区总觉得 SFT 和预训练一样,数据量越大效果越好,于是拼命堆数据,甚至把几百万条网上爬来的问答直接灌进模型。
正解SFT 阶段的规律恰恰相反——质量优先于数量。LIMA 用 1000 条精选数据就能显著提升指令遵循能力,Alpaca 用 52k 条自举数据就够用。海量低质数据会让模型学到噪声和幻觉,少量高质量、多样化的数据反而更有效。就像给徒弟看一百遍错误的颠勺示范,不如看十遍标准示范。
为何常见:预训练阶段的“数据越多越好”深入人心,很多人把这条经验惯性迁移到了 SFT 上,忽略了两个阶段的目标完全不同。
误区以为让大模型自动生成指令和回答,就能坐等一份好数据集,完全不需要人工介入。
正解Self-Instruct 的本质是“大模型教大模型”,模型的幻觉和偏见会被自举过程放大。生成结果必须经过相似度去重、困惑度过滤和人工抽检三道关口,否则一条错误示范可能带坏一片同类样本。自动生成解决的是“量”的问题,“质”必须靠人工和规则兜底。
为何常见:自动化的“省事”光环让初学者忽略了数据质量链路的最后一环,而这一环恰恰最贵也最重要。
误区以为只要找几个懂业务的人,让他们“凭感觉”写出正确答案就行,规范写不写无所谓。
正解没有统一规范,十个人就有十种答案风格,模型学到的就是一团乱麻。规范必须明确任务定义、答案格式、长度范围、语气风格和拒答边界,还要用 Kappa 系数验收一致性。规范不是束缚,而是保证标注质量可复制的“红本本”。
为何常见:人工标注看起来是“写字”,容易被低估为简单劳动,忽略了它作为数据质量源头的重要地位。
误区从 HuggingFace 下载 Alpaca 或 ShareGPT,不清洗、不去重、不配比,直接拿去微调。
正解开源数据集各有先天缺陷:Alpaca 同质化严重、ShareGPT 噪声大且长短不均。直接使用会造成领域不匹配、安全边界缺失、多语言污染等问题。正确做法是先 ROUGE-L 去重、PPL 过滤,再用领域数据重写增强,最后按通用、领域、安全 6:3:1 的比例混合配比。
为何常见:开源社区的数据集“看起来干净”,人们容易忽略数据集的采集背景与自身业务场景的差异。
误区认为只要凑够“问题—答案”对就算指令数据,完全忽略系统提示、多轮对话、拒答样例和负样本的作用。
正解高质量的指令数据是有结构的:既要有单轮指令,也要有多轮对话上下文;既要有正面回答,也要有拒答样例告诉模型“什么不能答”;还需要负样本(如指令与回答不匹配的样本)帮助模型学会拒绝幻觉。只给模型看“正确问答”,它永远不会学会说“我不会”。
为何常见:“问答对”是初学者最容易理解的形态,而结构化的数据设计思想需要踩过坑、看过失败案例才能领悟。
面试题
Q1. SFT 阶段中,指令数据最核心的作用是什么?
- A.增加模型的参数量
- B.让模型学会按指令行事← 正确答案
- C.大幅缩短单轮训练耗时
- D.降低推理阶段的显存占用
答案:B。SFT 通过“指令—回答”配对让模型学会模仿,从而获得指令遵循能力,而不是改变模型结构或参数量。A 是预训练/模型设计的事,C、D 与数据内容无关。就像教案的作用是让徒弟学会做菜,而不是换一口更大的锅。
Q2. Self-Instruct 方法的第一步通常是做哪件事?
- A.准备少量高质量种子指令← 正确答案
- B.直接开始全量数据训练
- C.部署模型推理服务
- D.对模型做量化压缩
答案:A。Self-Instruct 是“由小滚大”的自举方法,第一步永远是人写一小撮种子指令,再让大模型模仿扩量。B 跳过了数据生成环节,C、D 是工程部署问题,与数据构建无关。
Q3. Alpaca 指令数据主要是通过什么方式生成的?
- A.完全由人工逐条编写标注
- B.调用大模型自动批量生成← 正确答案
- C.直接爬取网页新闻标题
- D.从学术论文中摘抄段落
答案:B。Alpaca 用 175 条种子指令配合 Self-Instruct 流程,让 LLM 自动生成 52k 条指令数据,成本仅数百美元。A 无法解释如此低的成本,C、D 都不是 Alpaca 的生成方式。
Q4. 用 ROUGE-L 相似度做指令去重时,通常保留相似度低于哪个阈值的指令?
- A.低于 0.7 视为新指令← 正确答案
- B.高于 0.7 视为新指令
- C.低于 0.1 视为新指令
- D.等于 1.0 视为新指令
答案:A。ROUGE-L 越接近 1 表示两条指令越像。实践中把相似度 ≥0.7 的指令判为重复并剔除,低于 0.7 才当作新指令保留。C 的 0.1 过于苛刻会把重复数据全部放进来,D 的 1.0 意味着只有完全相同的指令才会被去掉。
Q5. 指令数据质量控制通常包括哪些手段?
- A.启发式规则过滤与长度检查← 正确答案
- B.用困惑度筛选异常文本← 正确答案
- C.让大模型给指令打分排序← 正确答案
- D.随机丢弃一半训练数据
答案:ABC。质量控制是“规则 + 模型打分 + 人工抽检”的多层体系。A、B、C 分别是启发式层、统计层和模型层的常用手段。D 是随机丢弃,毫无依据,会破坏数据分布,不属于质量控制。
Q6. ShareGPT 数据集中的指令数据主要来自哪里?
- A.爬取门户网站的新闻
- B.用户与机器人的真实对话← 正确答案
- C.开源代码仓库的注释
- D.电商平台的商品评论
答案:B。ShareGPT 是用户分享的与 ChatGPT 等聊天机器人的真实对话记录,多轮上下文丰富,是训练对话模型的优质素材。A、C、D 与 ShareGPT 的采集来源无关。
Q7. 关于 SFT 指令数据规模与效果的关系,下列哪项符合经验结论?
- A.数据多多益善没有上限
- B.质优量精胜过量大质杂← 正确答案
- C.数据质量好坏无关紧要
- D.少于百万条必然无效
答案:B。幂律曲线显示数据量增加收益递减,而质量缺陷会直接教坏模型。LIMA 用 1000 条精选数据就能明显提升效果,Alpaca 用 52k 也足够,说明“质优量精”才是 SFT 数据的正确姿势。
Q8. Evol-Instruct(进化式指令扩展)的核心思路是什么?
- A.让模型把指令改难并自我解答← 正确答案
- B.用人工逐条重写全部数据
- C.将数据集切成多个训练批次
- D.仅对推理输入做数据增强
答案:A。Evol-Instruct 让 LLM 对简单指令做“进化”——加深推理、增加约束、丰富背景,再让模型为进化后的难题生成答案,实现难度分级自动化。B 仍是人工,C 是训练策略,D 只针对推理输入而非构造新数据。
Q9. 构建多样化指令数据时需要考虑哪些方面?
- A.任务类型覆盖广度← 正确答案
- B.领域分布均衡程度← 正确答案
- C.指令难度从易到难← 正确答案
- D.显卡显存容量大小
答案:ABC。多样性包含任务类型、领域分布和难度层级三个维度,用熵可以量化分布均匀度。D 是硬件资源问题,与数据内容的多样性无关。
Q10. 关于人工标注规范的制定,以下做法正确的是?
- A.明确答案格式与长度约束← 正确答案
- B.定义拒答与边界处理规则← 正确答案
- C.完全交由标注员自由发挥
- D.多轮抽检并计算一致性← 正确答案
答案:ABD。规范的目的是统一口径、控制质量。A 约束输出形态,B 划定安全边界,D 用 Kappa 系数验收一致性,都是标准做法。C 取消规范会让标注结果五花八门,模型学了只会更混乱。