想象一位经验丰富的老教师,手里只有五道精心设计的样例题。他不可能把整本练习册都用人工手抄出来,但他做了件聪明的事:先照着这五道样例题的风格,自己给自己拟出一批新题目;再逐题检查,把错题、废题、重复题全部扔掉;最后把留下的好题装订成册,发给学生练习。Self-Instruct 做的正是这件事——让大模型基于少量人工种子指令,自己生成、筛选、去重,最终产出一套大规模指令训练数据。这本“练习册”不是找昂贵的数据公司代写的,而是模型自己出题、自己批改得来的。整个过程看似简单,却藏着成本、质量、多样性三重博弈。读完这篇文章,你会明白小数据如何撬动大模型训练,以及为什么“自己教自己”也能让模型变得更听话。
对 AI 从业者而言,掌握 Self-Instruct 意味着你能用极低的标注预算撬动一张高质量指令数据集,这是数据工程与模型微调中最实用的降本增效技能之一。
目录
可视化演示
展示从种子指令自举生成指令数据的完整流水线、ROUGE-L多样性去重相似度矩阵,以及合成数据与人工标注数据的性能对比。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Self-Instruct自举生成流程 从少量种子指令出发通过LLM自举扩展 质量过滤规则移除低质量生成指令 ROUGE-L去重保证指令集多样性 D = dedup(filter(LLM(seeds))) 自举循环实现低成本大规模数据构建
为什么需要:练习册不能全靠手抄
老教师的办公室堆着厚厚一沓空白练习册,学生下个月就要考试,可编写新题的速度远远跟不上需求。如果每道题都请一位专家人工出题,成本高得离谱;如果直接拿旧题目应付,学生只会机械重复,能力提升有限。人工标注指令数据的困境正是如此:一条高质量指令、输入和输出,往往需要标注员反复推敲,算上质检和返工,成本可能接近数美元一条。要凑齐上万条指令来微调一个大模型,预算会迅速失控。
于是研究者想到一个反直觉的问题:既然大模型已经读过海量文本,也见过不少“提问-回答”的语料,能不能让它自己模仿种子题出题?这就是 Self-Instruct 的出发点。它不靠更多人工,而是靠模型自身的生成能力,把几十条种子指令扩展成几万条指令数据。和请专家逐条写题相比,这种“让模型自产数据”的方式能大幅降低数据构建的成本。
当然,免费的东西往往需要付出其他代价。模型生成的数据不一定准确,不一定符合人类偏好,还可能大量重复。因此 Self-Instruct 不是简单的“生成就完事”,而是一套“生成—过滤—去重—再训练”的闭环流程。它像一位勤快但粗心的老师,先出题,再自己审题,最后才把好题放进练习册。
从这个角度看,Self-Instruct 的关键不是“让模型会出题”,而是“如何低成本地出好题”。它用一小把高质量种子,换来一本可用的练习册,这正是它在数据工程中最迷人的地方。
种子指令:起点的几道好题
老教师很清楚,如果样例题本身很烂,后面的新题也会烂。所以他格外珍视手里的五道样例题,每道都覆盖不同的题型:有选择题、有简答题、有应用题。Self-Instruct 也一样,第一步需要人工准备一组种子指令,这些指令数量不用多,但必须覆盖不同的任务类型。
在原始论文中,研究者只用了 175 条人工编写的种子任务。这些任务涵盖了写作、改写、分类、问答、头脑风暴等多种指令类型,每条指令往往还配有一个或几个“输入-输出”实例。这些种子就像是老教师手里的“好题模板”,决定了大模型后续自举的方向和边界。如果种子只覆盖翻译,生成的数据就会偏向翻译;如果种子覆盖足够广,生成的数据才可能具备通用性。
种子指令的另一个作用,是让生成过程有迹可循。大模型并不是凭空变出新题,而是在提示词里看到若干条种子指令后,模仿它们的句式、格式和语气去续写新指令。这就像老师给学生看范文,学生照着范文的骨架写新作文。没有范文,写作容易跑题;有了几篇高质量范文,写作才可能稳定发挥。
所以种子指令是整个 Self-Instruct 流程的“起点”。它不需要多到堆满仓库,但需要精挑细选、分布合理。用一句话概括:花少量人工成本,买一个高质量的方向感。
自举生成:让模型模仿样题出题
有了种子指令后,老教师让助教对着五道样例题开始“仿写”。助教每看五道题,就尝试写出一道新题;接着再为新题配一个“题干背景”和“标准答案”;然后继续用这些新题作为样例,去生成下一道更新的题。这个过程是循环的,像滚雪球一样越滚越大。
Self-Instruct 的自举生成也是如此。它会构造一个提示词模板,把若干条种子指令和对应的输入输出放进模板,然后让大模型补全最后一条“新指令”。模型按词元逐个生成,每一步都根据已经生成的前缀来决定下一个词。形式上可以写成:
生成新指令只是第一步。模型还需要为每条新指令生成一个输入(可选)和期望输出。Self-Instruct 会设计“先生成输入再生成输出”和“先生成输出再生成输入”两种路线,并把它们都作为候选数据,从而增加样本的多样性。整个过程会反复迭代:一批新题通过后,又可以作为下一轮提示词里的样例,让雪球继续滚下去。
用老教师的比喻来说,自举生成就是“用已写出的好题当作新范文,继续仿写更多题”。大模型在这个过程中不断拿自己的产出喂给自己,这也是“自举”二字的含义。
- 新指令概率$P(I_{\text{new}} \mid E, S)$ 表示“在看过示例模板和种子题之后,生成这条新指令”的整体概率,概率越高说明模型越倾向于这么写。
- 连乘符号$\prod_{t=1}^{T}$ 把从第 1 个词元到第 T 个词元的每一步概率乘起来,相当于把写题的每一步连贯成一个完整句子。
- 逐词生成$P(w_t \mid w_{<t}, E, S)$ 表示在已知前面所有词元 w_<t、示例模板和种子题的前提下,模型选下一个词 w_t 的概率。它决定了句子是否通顺、风格是否贴近种子题。
质量过滤:把错题和废题挑出来
助教很勤奋,但也很粗心。他会写出“请描述图片内容”这种让纯文本模型无法完成的题,也会写出“输出为空”的题,甚至会把“输入”和“输出”混在一起。老教师知道,如果不把这些废题挑出来,练习册会被大量垃圾题污染。于是 Self-Instruct 设置了多道质量过滤规则。
第一道是无关词过滤。模型可能生成需要看图片、听音频、看图表的多模态指令,而当时的基座模型只能处理文本,所以凡是包含图片、图形、视频等敏感词的指令,都会被直接丢弃。第二道是检查输入输出是否完整、是否对应。如果指令要求“请回答”,却没有输入上下文,或输出为空,就会被判定为低质样本。第三道是让模型自己当“质检员”:用语言模型判断新任务是否合理、是否像一条可执行的指令。
这些过滤规则听起来朴素,却非常关键。没有它们,Self-Instruct 生成的数据里可能混入大量“看着像题、实际没法做”的废题。就像老教师不能把助教交上来的草稿直接装订成册,必须一道题一道题地审,宁可少收,不能收错。
经过质量过滤,数据集从“数量大”变成了“质量可用”。不过过滤之后还有一个隐藏问题:剩下的题可能彼此高度相似,这时就需要多样性去重登场了。
多样性去重:同一道题不要抄十遍
老教师发现,助教出题时有个偷懒习惯:把“帮我写一封信”改成“帮我写一封邮件”,就当作一道新题。表面上看题目数量很多,实际上只是同一道题的换皮。如果练习册里塞满这种近亲题目,学生刷十遍也学不到新东西。
Self-Instruct 也面临同样的问题。大模型生成的指令很容易在句式上高度雷同。为了解决这个问题,论文使用了基于 ROUGE-L 的相似度指标:比较两条指令文本的最长公共子序列,占较长文本的比例。如果比例超过阈值,就认为它们是重复的,只保留其中一条。
去重不仅能减少冗余,还能保护数据集的多样性。Self-Instruct 希望最终题库里的指令覆盖尽可能多的表达方式,而不是被少数几种句式垄断。多样性越强,模型在微调时见过的任务分布就越广,指令跟随能力也就越稳健。
回到老教师的练习册,去重就是“把同义反复的题目合并,只留最有代表性的一道”。这样一来,练习册页数少了,但训练价值反而更高。
- 最长公共子序列$\mathrm{LCS}(A,B)$ 表示从两条文本中按顺序各取一些字符,能组成的最大公共部分。它不要求字符连续,因此能抓住“换了个词”这种近似重复。
- 取较长长度$\max(|A|, |B|)$ 是 A 和 B 中更长的长度,用来把相似度归一化到 0 到 1 之间,避免长文本天然占便宜。
- 相似度比值$\text{sim}(A,B)$ 越接近 1,说明两条指令越像;Self-Instruct 通常设一个阈值,如 0.7,超过就丢弃新生成的重复指令。
效果评估:合成练习册用起来怎么样
练习册编好后,到底有没有用,老教师心里也没底。他决定先让班里成绩中等的学生试做,再和名师单独出题的学生对比。Self-Instruct 的效果评估思路与此类似:用合成数据微调一个大模型,再在公开基准上测试它的指令跟随能力。
原始实验中最常被引用的结果是:只靠 175 条种子任务生成约 5.2 万条指令数据,用这些数据微调 GPT-3,在 SuperNI 等指令理解基准上取得了显著提升,相对提升幅度可达约 33%。这说明合成数据并非“没有营养的刷题”,它确实能让大模型更清楚“用户要我做什么”。
但和人工标注数据对比时,合成数据并不总能完胜。人工数据质量更稳定、噪音更少,在事实性、开放域对话等任务上仍有优势。Self-Instruct 的优势在于性价比:它可以用不到人工数据十分之一的成本,把模型能力拉到接近大型人工数据集的水平。对很多资源有限的团队来说,这已经是非常划算的选择。
此外,Self-Instruct 还有不错的领域泛化能力。只要换一组领域相关的种子指令,它就能为金融、医疗、法律等垂直领域快速生成指令数据。就像老教师只要拿到几道物理样例题,就能让助教为物理试卷批量出题。当然,出题质量依旧依赖种子质量和后续筛选。
局限与展望:练习册还不能完全替代名师
老教师很快发现了练习册的不足:助教出题时偶尔会把错误答案写得一本正经,学生刷题后反而把错误记牢了。Self-Instruct 也有类似问题——模型生成的数据中若混入错误或偏见,这些错误会被“自产自销”的过程放大。因为后续微调模型学到的正是这些生成数据,一旦数据有系统性偏差,模型也会继承偏差。
另一个局限是多样性受种子指令限制。如果种子指令只有几种固定句式,无论生成多少条,最终都只是在同一片小区域里打转。Self-Instruct 不可能凭空创造完全超出种子分布的新任务。它更像一个“扩写器”,而不是“创造者”。
正因如此,后来的研究者提出了一系列改进思路:先用更强模型生成数据再用弱模型训练,让多种模型互相出题,或者在生成过程中加入更严格的人类偏好对齐。这些方法都可以看作 Self-Instruct 的后续演进。它没有解决所有问题,但打开了一扇门:数据不一定只能靠人写,模型自己也完全可以参与创造训练材料。
对从业者来说,理解 Self-Instruct 的局限比记住它的成功更重要。它是一本便宜但需要审校的练习册,而不是包治百病的名师讲义。只有把生成、过滤、去重、人类质检串成一条流水线,这本练习册才能真正发挥价值。
AI 应用场景
智能客服意图库的快速冷启动
阶段:数据准备 / 指令微调
解决的问题:传统做法是让业务专家编写大量客服意图样本,例如“我想退款”“怎么查物流”,一条条人工整理既慢又贵。Self-Instruct 可以用 50 条种子意图指令,让大模型批量生成上万条同风格的用户提问,再经质量过滤和去重后用于训练客服意图分类模型,大幅缩短冷启动周期。
具体案例:某电商团队希望搭建一个覆盖退款、物流、售后、优惠券等 20 个意图的分类器。他们为每个意图写 3 条种子问题,共 60 条种子,然后调用大模型生成 2 万条候选问法,过滤掉包含图片链接或答案为空的数据,最后去重得到约 1.2 万条高质量训练集,一周内就完成了意图模型的首轮上线。
垂直领域问答数据扩充
阶段:领域数据合成
解决的问题:金融、法律、医疗等领域的问答数据稀缺且隐私敏感,外部购买成本极高。Self-Instruct 允许团队只提供少量领域种子问答,让大模型基于公开文档和内部规范生成更多问答对,再经过人工抽检和过滤,形成可用的指令微调数据集。
具体案例:一家保险科技公司想微调一个 7B 参数模型来回答理赔政策问题。他们从产品手册中整理出 80 条种子问答,使用 Self-Instruct 生成 1 万条候选问答,过滤掉涉及个人隐私和输出过长的样本后,配合人工抽检修错,最终把模型在内部测试集上的正确率从 58% 提升到 79%。
Python 演示
from difflib import SequenceMatcher class SelfInstructDemo: def __init__(self, seed): self.seed_instructions = seed self.candidate_instructions = [] self.kept_instructions = [] self.final_instructions = [] self.mock_new_instructions = [ "把这段商品文案改成朋友圈风格", "请把用户投诉翻译成正式英文", "用一句话总结这篇客服记录", "为这张图片写一句宣传语", "请回答关于天气的问题" ] def generate_candidates(self): # 用种子指令仿造出候选新指令 for seed in self.seed_instructions: for i in range(2): new_item = "请仿照" + seed + "设计一个新任务" + str(i) self.candidate_instructions.append(new_item) # 模拟大模型额外生成的一些候选 for item in self.mock_new_instructions: self.candidate_instructions.append(item) def quality_filter(self): banned = ["图片", "天气", "无法回答", "?", "?"] self.kept_instructions = [] for item in self.candidate_instructions: if len(item) < 4: continue if any(word in item for word in banned): continue self.kept_instructions.append(item) def deduplicate(self, threshold=0.85): result = [] for item in self.kept_instructions: duplicate = False for old in result: similarity = SequenceMatcher(None, item, old).ratio() if similarity > threshold: duplicate = True break if not duplicate: result.append(item) self.final_instructions = result def run(self): self.generate_candidates() self.quality_filter() self.deduplicate() return self.final_instructions if __name__ == "__main__": demo = SelfInstructDemo(["写一首关于秋天的诗", "把菜谱翻译成英文"]) result = demo.run() print("最终保留指令数量:", len(result)) for instruction in result: print(instruction)
self.seed_instructions = seed保存少量人工种子指令,相当于老教师手里的样例题。generate_candidates(self)模拟大模型根据种子指令生成候选新指令,实际项目中可替换为语言模型 API。banned = ["图片", "天气", "无法回答", "?", "?"]定义质量过滤规则,把涉及多模态或含糊表达的候选题丢弃。len(item) < 4过滤掉过短的无效指令,这类指令往往缺少足够信息。SequenceMatcher(None, item, old).ratio()用字符级相似度模拟 ROUGE-L 去重,相似度超过阈值就视为重复。self.final_instructions = result保存去重后的最终指令列表,作为微调模型的数据集。
常见误区
误区Self-Instruct 就是让大模型随便生成数据,人工什么都不用做,丢给它一个主题就能自动产出数据集。
正解Self-Instruct 非常依赖人工编写的种子指令、质量过滤规则和最终抽检。种子指令决定数据方向,过滤规则决定数据下限。就像老教师必须先给出五道高质量样例题,助教才知道该怎么出题。
为何常见:因为“自动生成”四个字太有迷惑性,让初学者忽略了生成之前和生成之后大量的人工设计。
误区既然合成数据便宜,那就让模型拼命生成,量越大训练效果越好。
正解数据量只有在多样性和质量有保障时才有意义。如果不做去重,模型会被少数重复句式带偏;如果不过滤,错误样本会教坏模型。大量低质重复数据不如少量多样高质数据。
为何常见:人们习惯把“数据量”等同于“模型能力”,忽略了 Self-Instruct 中过滤去重环节的价值。
误区以后再也不需要人工标注了,模型自己生成的数据可以完全替代人类写的指令。
正解Self-Instruct 适合做数据冷启动和规模化扩展,但事实准确性、价值观对齐、开放域对话等场景仍需要人工数据或人工抽检。合成练习册能帮学生提分,却无法完全替代名师的耐心点拨。
为何常见:合成数据在基准测试上的亮眼表现,让人误以为它已经全面超越人工数据,忽略了真实业务中的复杂噪声。
误区用 Self-Instruct 生成训练数据后,大模型会学到这些新知识,所以懂得更多。
正解Self-Instruct 的主要作用是提升模型的指令跟随能力,而不是给模型注入事实知识。生成的数据来自模型已有知识,模型只是在学习和模仿“如何按指令作答”。它更像整理已有知识,而非增加新知识。
为何常见:因为训练数据看起来包含很多新问题,让人误以为这些问题本身代表了新知识。
面试题
Q1. Self-Instruct 的核心思想是什么?
- A.完全依靠人工标注海量数据
- B.用少量种子指令让模型自举扩展← 正确答案
- C.用固定模板批量生成训练数据
- D.从无监督语料中直接学习指令
答案:B。Self-Instruct 的本质是从少量人工种子指令出发,让模型仿照种子生成更多指令并构成训练集。它不是完全人工,也不是简单模板,更不是无监督预训练。
Q2. Self-Instruct 流程最开始需要准备什么?
- A.几百万条公开的问答数据集
- B.少量人工编写的种子指令← 正确答案
- C.一个已经微调好的超大模型
- D.一份清洗完毕的网页语料
答案:B。Self-Instruct 的起点是少量高质量种子指令,通常只需要百条量级。它不依赖海量问答或网页语料,因为那些语料会被模型在预训练阶段见过。
Q3. 大模型生成新指令时,本质上是做什么?
- A.从词表中逐个预测最合适的词元← 正确答案
- B.从数据库里检索最相似的句子
- C.用规则对模板做字符串拼接
- D.对已有答案进行最大似然排序
答案:A。语言模型生成文本时,每个词元都根据前面已经生成的词元计算概率分布,再逐个采样或取最大概率词元。这正是自回归生成的基本原理。
Q4. 为什么 Self-Instruct 生成后必须做质量过滤?
- A.因为生成结果太多会拖慢训练速度
- B.因为模型可能生成答非所问或无法执行的内容← 正确答案
- C.因为要删除所有低频词以提升效率
- D.因为要压缩数据集占用的存储空间
答案:B。模型自生成的数据里可能包含多模态指令、空输出、输入输出不对应等问题。质量过滤就是把这些“看着像题但没法做”的废题剔除,保证训练数据可用。
Q5. 判断两条指令是否重复时,Self-Instruct 常用什么方法?
- A.比较两个句子的字符总数是否相等
- B.计算两条指令的 ROUGE-L 相似度← 正确答案
- C.检查两条指令是否包含相同标点
- D.查询两条指令在词表里的编号
答案:B。Self-Instruct 使用 ROUGE-L 之类的文本相似度指标,比较最长公共子序列占较长文本的比例。超过阈值就认为重复,从而去除近义或换皮的指令。
Q6. Self-Instruct 生成的一条完整训练样本通常包含哪些部分?
- A.指令文本← 正确答案
- B.输入上下文← 正确答案
- C.期望输出答案← 正确答案
- D.GPU 显存占用配置
答案:ABC。一条指令样本的核心是指令、输入和输出三要素。GPU 显存属于训练环境配置,与数据本身无关。
Q7. 关于 Self-Instruct 的效果,下列说法正确的是哪一项?
- A.合成数据效果必然超过全部人工数据
- B.能提升指令跟随能力,但并非完美无缺← 正确答案
- C.只对翻译和改写任务有效
- D.生成数据越多模型能力一定越强
答案:B。Self-Instruct 在 SuperNI 等基准上能显著提升模型指令跟随能力,但相比人工数据仍有不足,且数据量不是越多越好。它有效,但不完美。
Q8. Self-Instruct 的质量过滤规则需要关注哪些问题?
- A.过滤包含图片、图形等无法处理的指令← 正确答案
- B.过滤输出为空或输入输出不对应的样本← 正确答案
- C.过滤和已有指令高度重复的内容← 正确答案
- D.删除所有句子中带主语的指令
答案:ABC。质量过滤针对的是无法执行、答案缺失和重复冗余三类问题。删除带主语的句子没有任何意义,反而会破坏语言结构。
Q9. 为什么去重能提升合成数据的训练价值?
- A.去重能减少重复样本对模型的过度强化← 正确答案
- B.去重能直接增加模型参数量
- C.去重能让每条数据都变成多选题
- D.去重后数据就完全不需要质量过滤
答案:A。重复数据会让模型过度拟合少数句式,导致泛化能力下降。去重让模型看到更多样的任务表达方式,从而增强指令跟随能力,但并不能替代质量过滤。
Q10. Self-Instruct 的局限性包括哪些?
- A.生成过程可能放大模型自身的错误← 正确答案
- B.指令多样性受种子指令范围限制← 正确答案
- C.无法完全替代所有人工标注场景← 正确答案
- D.已经保证一定不会生成有偏见的回答
答案:ABC。模型自生成的数据会继承甚至放大模型已有偏差;种子指令覆盖范围决定了数据多样性上限;在事实校验和价值观对齐等场景仍需人工介入。它并不能消除偏见。