想象一间米其林后厨的操作台:主厨手握一叠基础菜谱,比如“番茄炒蛋”。他让助手们一批批改造菜谱——有人要求增加雕花摆盘、分层酱汁和双层火候(变难),有人要求改造成港式甜口、川式辣口或法式摆盘(变多),还有人立下铁律:菜谱不得超过十个步骤、核心主料不得更换(约束)。每改一版都要比上一版复杂一点,但又不允许一步跨成“太空料理级”,最后所有成型菜谱还要通过味蕾评委的淘汰筛选(质量过滤)。这套“主厨带徒弟”的菜谱进化流程,就是数据生成领域的主角——Evol-Instruct。它把少量种子指令交给大语言模型(LLM),通过深度进化(增加难度)与广度进化(增加多样性)自动生成规模更大、难度梯度合理、主题丰富的指令训练集,是合成数据生成在 LLM 时代最具代表性的方法之一,也是应对高质量训练数据稀缺问题的一剂良方。
掌握 Evol-Instruct 意味着你能为模型训练持续供给可扩展的“数据燃料”;在人工标注成本高昂、数据红利见顶的今天,这是 AI 数据工程师最值得投资的核心技能之一。
可视化演示
动态演示Evol-Instruct的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
Evol-Instruct:Evol Evol-Instruct核心 指令进化策略:加深与加广两条路 核心机制可视化 Evol-Instruct整体架构与关键组件
数据危机与动机
从前厅到后厨,主厨发现最近点单的新客越来越多,可手边能教给助手的经典菜谱翻来覆去只有那几十道。他每天花大价钱请食评人来写新菜谱,不仅等得久,费用还高得惊人。数据的世界同样如此:大模型性能与训练数据的数量和质量密切相关,可人工标注一条高质量指令动辄几元甚至几十元,一个微调项目需要数万条样本,预算立刻捉襟见肘。
Evol-Instruct 正是为解决“数据危机”而生的方法:与其每一条指令都靠人工写,不如先准备一小批精挑细选的种子指令,再让 LLM 自己充当“主厨助手”,把这些种子改写成更复杂、更多样、更高质量的新指令。这样,人工只需要负责画好起点和终点,中间的大规模重复劳动全部自动化。
从数学上看,Evol-Instruct 的产出可以表示为对种子数据集施加进化与筛选后的结果:
回到厨房的比喻:种子菜谱的质量决定了进化天花板。如果基础菜谱本身用料差、步骤乱,再怎么进化也难成米其林招牌。因此,Evol-Instruct 的第一步永远是“耐心挑选种子”,这也是它与纯随机构造指令最根本的区别。
---
- 种子数据集
D_seed是人工准备的少量高质量指令,好比后厨里最拿手的基础菜谱,是进化的起点和“基因库”。 - 进化操作
Evol(D_seed)表示对每条种子指令应用深度/广度进化算子,生成大量候选指令,对应助手们对基础菜谱的各种改造尝试。 - 质量过滤只有
Score(A, I) > τ的指令-回答对才被保留,对应主厨在试菜环节只留下真正能端上桌的成品。
指令进化的双维度
主厨给助手们定了两条改造路线:第一条是“做难”,比如把“番茄炒蛋”升级为“法式番茄果冻配溏心蛋”;第二条是“做多”,比如同一道菜拆出川菜、鲁菜、粤菜三个版本。前者是深度进化,后者是广度进化,两条路线共同保证了进化出来的指令既有挑战性,又覆盖足够宽的主题空间。
深度进化(Deep Evolution)通过给指令添加约束、增加推理步骤、要求更具体的输出格式来提升难度;广度进化(Breadth Evolution)则通过变换主题、改写风格、生成不同子任务来扩大指令的覆盖面。实际工程中,两条路线往往交替使用:先用深度进化把一条简单指令改难,再用广度进化把这个难版本改写成不同领域的变体。
深度进化的常见操作包括“添加一个必须用到的概念”“要求先给出推导再给结论”“限定输出必须为表格格式”;广度进化的常见操作包括“将场景改为金融行业”“把主角变成一位老人”“换一种文学体裁”。设计进化算子时需要注意:算子之间要有区分度,不能像两个厨师都只改盐量,那样只会产生大量同质化指令。
回到菜谱比喻:好的后厨会要求“每道菜至少有一种主料变化或一种技法升级”,这就是进化算子的意义——确保每一条新指令都不是旧指令的简单复读,而是真正意义上的“新菜”。
---
I'_d = \mathrm{LLM}\left( \mathrm{Prompt}_{\text{deep}} \oplus I \right), \qquadI'_b = \mathrm{LLM}\left( \mathrm{Prompt}_{\text{breadth}} \oplus I \right)- 深度进化分支把当前指令 I 与深度进化提示词拼接后交给 LLM,生成一个增加了额外约束或推理要求的新指令,目标是让任务更难。
- 广度进化分支把当前指令 I 与广度进化提示词拼接,让 LLM 生成主题、风格或场景不同的新指令,目标是让数据集覆盖更多领域。
- 提示词拼接符号这个
\oplus代表“将进化指令附加到原始指令后面”,让 LLM 明白自己是在改写哪一条指令。
约束进化守门
后厨里最怕什么?怕助手为了创新把菜改得面目全非:番茄炒蛋改成了“巧克力炒蛋”,顾客根本认不出来。约束进化(Constraint Evolution)就是主厨立下的规则手册:你可以加装饰、换配料,但核心主料不能换,菜谱步骤不能超过十个,成品必须仍然是一道“番茄炒蛋”。换到指令进化上,这些约束就是保证“进化结果与原始指令保持语义相关”的护栏。
在 WizardLM 等代表性工作中,约束进化包含三类规则:一是语义约束,要求新指令与原指令的相似度低于 0.9,防止产生太多雷同;二是完整性约束,要求指令长度不能爆炸、核心任务类型不能被改写;三是唯一性约束,禁止对同一指令反复做同一方向的简单加码,避免退化到套娃式重复。
约束进化还附赠一个好处:它天然抑制了“进化爆炸”。如果没有约束,一条指令经过五轮深度进化后可能变成两百字的怪物指令,不仅模型看不懂,连人工评审也无从下手。约束就像是菜谱上的“字数红线”,让每道菜在创新之余仍然是一道可食用的菜。
食材不能乱换,主料不能丢,规则越清晰,助手们的创造力才越有方向感。约束进化看似是“限制”,实则是确保数据质量不失控的最关键设计。
---
- 语义相似度检查计算新指令与原指令的相似度,若低于阈值 ε(一般取 0.9)则视为足够新,超过则拒绝,防止进化生成大量换汤不换药的数据。
- 长度上限检查要求新指令长度不超过 L_max。指令过长往往意味着约束堆积,反而干扰模型学习真正的意图。
- 接受决策两个条件同时成立才接受,任何一个不满足都整条淘汰,相当于两道关卡都要通过才能上菜。
复杂度递增策略
主厨带徒弟有个心法:学做菜要一道比一道难,但绝不能第一道就上佛跳墙。Evol-Instruct 的复杂度递增策略正是这个规律的算法化表达:每一轮进化出来的指令都应该比上一轮更难一些,但难度增长的幅度必须被限制在合理范围内,避免出现“从小学算术直接跳到偏微分方程”式的断层。
为什么不一次性把指令加到最难?原因很朴素:LLM 生成指令的能力也有限,如果目标难度远超其当前能力上限,生成结果是逻辑混乱的“四不像”,根本没法用。渐进式加压让每一轮的进化都建立在前一轮成功的基础上,既保证了数据质量可控,也让生成过程对 LLM 的能力要求更友好。
在实际的 Evol-Instruct 实现中,复杂度递增和进化是同一个提示词的两份要求:“请改写这条指令,使它更难一点,但不要难太多。”这种措辞让 LLM 同时理解目标和边界,生成的指令自然形成由易到难的平滑梯度,非常有利于后续模型训练的课程学习(Curriculum Learning)。
后厨的比喻再次收束:一道一道加难度,徒弟才能稳定进步。数据集的难度梯度越平滑,模型学起来就越稳——这是复杂度递增策略给训练带来最直接的好处。
---
- 当前复杂度C(I_t) 代表第 t 轮进化得到的指令的复杂度,可用指令长度、包含的推理步骤数、约束数等指标来衡量。
- 递增下界新指令复杂度必须严格大于上一轮,保证每轮都在向更进阶的方向前进。
- 递增上界新指令复杂度不能超过 α 倍的上一轮复杂度,α > 1 但接近 1,相当于“每次只上一个台阶”。
质量过滤环节
菜做好之后不能直接端给顾客,得先过味蕾评委这一关。Evol-Instruct 的“味蕾评委”就是质量过滤机制。它决定哪些进化指令最终进入训练集,哪些被丢进垃圾桶。这一环节直接决定了数据集的下限——哪怕进化过程再精巧,如果不过滤,垃圾数据照样会把模型带偏。
质量过滤通常包含三个维度的评估:第一是语言流畅性,指令和回答必须语法通顺、符合表达习惯;第二是回答正确性,需要让 LLM 生成预测答案,然后判断答案与指令是否匹配、事实是否成立;第三是困难度与信息量,太简单或与已有样本高度重复的指令会被削减权重甚至移除。
质量过滤的工程实现可以是纯规则(长度、关键词、去重),也可以结合小模型打分与 LLM 裁判,甚至让多个 LLM 投票。实际项目中通常以规则过滤为第一道闸,再用 LLM 裁判做精准判断,两层结合既快又准。
回到厨房:评委们各有分工,有人管口味、有人管卫生、有人管摆盘,各司其职才能保证端上桌的每一道菜都经得起检验。质量过滤就是 Evol-Instruct 的后厨评审团,它决定了整桌数据宴席的品质下限。
---
- 流畅性因子Fluency(A) 评价回答文本的语言质量,可以由规则或评分模型给出 0~1 之间的分数,对应试菜时的“入口顺不顺”。
- 正确性因子Correct(A, I) 判断回答是否真正解决了指令的诉求。常用做法是让另一个 LLM 做裁判,或与已知正确答案比对。
- 冗余度扣分项Redundancy(I) 衡量新指令与已有指令的重复程度,重复度越高扣分越多,确保数据集的信息密度。
与 Self-Instruct 对比
很多初学者会把 Evol-Instruct 和 Self-Instruct 搞混,毕竟它们都姓“Instruct”,都让 LLM 生成指令数据。但后厨里有两类人:一类是抄写员,把已有菜谱换个措辞重新录入,这是 Self-Instruct;另一类是进化型主厨助手,不仅抄,还会加步骤、改食材、升难度,这是 Evol-Instruct。两类方法的路线差异决定了数据质量的显著不同。
Self-Instruct 的典型做法是:给 LLM 一些种子指令和几个示例,让它“再生成一些类似的新指令”,然后过滤掉太相似的。它本质上是一次性的生成式采样,生成的指令在难度和复杂度上往往与种子相差不大,多样化有余但进阶不足。Evol-Instruct 则把“一次生成”变成“多轮进化”,每一轮都在上一轮基础上做深度或广度变异,相当于让抄写员升级成了研发主厨。
为什么进化式优势这么明显?因为递推意味着每一轮都可以在前一轮成果上叠加新约束,难度、多样性、信息量同步提升。Self-Instruct 生成的指令分布紧紧围绕在种子周围,而 Evol-Instruct 能沿着“难度轴”和“多样性轴”两个方向不断向外扩张,最终覆盖的指令空间远大于前者。
抄写员翻来覆去只能写出类似的句子,进化型主厨却能一代一代开发出新菜系。这正是 Evol-Instruct 在 WizardLM 等模型上取得显著效果提升的原因——训练数据不仅更多,而且更有层次、更有挑战性。
---
D_{\text{self}} = \{ \tilde I \sim \mathrm{LLM}(I_{\text{seed}}) \}, \qquadD_{\text{evol}} = \{ \hat I_t = \mathrm{Evol}(\hat I_{t-1}) \mid t = 1, \ldots, T \}- Self-Instruct 的生成方式每条新指令都是对种子指令的一次独立采样,不同采样之间互不影响,像复印机一样逐张输出。
- Evol-Instruct 的递推方式第 t 轮指令由第 t−1 轮指令进化而来,形成一条随轮次延伸的链条。
- 规模对比经过 T 轮进化后,即使每轮只生成 K 个变体,数据量也会增长到指数级,而 Self-Instruct 的规模只有种子数乘采样数。
工程落地实践
理论再美味,最终还是要进真实厨房接受考验。Evol-Instruct 的工程落地主要有三个环节:数据清洗管线、训练效果评估、提示词编写经验。数据清洗管线是整个流程的骨架,它把原始种子和进化中间产物中的脏数据剔除,保证进入训练的每一条数据都干净可用。
一条典型的 Evol-Instruct 工程流水线包含:种子指令收集 → 启发式过滤(去重、清洗 HTML、剔除过短数据)→ 多轮进化 → 质量过滤(规则 + LLM 裁判)→ 人工抽检 → 格式统一。每个环节都有独立的工具模块,方便替换和扩展。
提示词编写经验在工程中同样不可忽视:进化提示词要明确“做什么改动”和“不许做什么”,例如“请增加一个约束条件,但不要改变原指令的核心任务”;质量评估提示词则要引导 LLM 先给出评分理由再给分数,这样裁判更有依据。实践中,同一套提示词在不同基座模型上效果差异很大,务必针对当前模型做提示词调优。
从种子到清洗到训练再到评估,整条流水线形成了完整的闭环。后厨里每一道菜从选材到上桌都有标准流程,Evol-Instruct 的工程落地也一样:只有在每一环节都做到严谨稳定,数据的“品质”才能稳定转化为模型的“能力”。
---
- 原始数据过滤Filter(D_raw, criteria) 按预设规则剔除低质量数据,规则可以是长度阈值、重复率、特定格式错误等,对应厨房里先把烂菜叶摘掉。
- 去重操作Dedup() 进一步消除重复指令,防止模型在训练时对同一模式过拟合,相当于避免同一道菜反复端上桌。
- 评估闭环Eval 表示用清洗后的数据训练模型,并在一组基准任务上评估效果,得分反馈给前端调节进化轮数和过滤阈值。
AI 应用场景
多语言客服大模型的指令扩充
阶段:数据构建与增强
解决的问题:客服系统的真实用户问题涉及大量隐私,难以直接采集和标注;人工整理一套大而全的问答数据集成本极高。Evol-Instruct 可以在脱敏种子指令的基础上自动进化出覆盖退款、故障报修、投诉升级等多场景的训练指令,同时通过约束进化保证新指令不偏离客服业务的核心语义。
具体案例:某电商客服团队从历史工单中人工整理出 200 条脱敏种子指令,使用 Evol-Instruct 进化三轮后扩充到 6000 条候选指令,经规则过滤和 10% 人工抽检后保留 4800 条。微调后的意图分类模型准确率提升了约 8 个百分点,且对长尾问题的召回率显著上升。
教育辅导领域的阶梯式题目生成
阶段:数据生成与评估
解决的问题:智能教育平台需要为不同水平的学生生成难度呈阶梯分布的练习题。传统人工出题覆盖率有限、难度梯度不连续,Evol-Instruct 的深度进化天然适合把同一知识点改写为“基础题→进阶题→挑战题”的难度序列。
具体案例:某在线教育平台将初中数学 80 个核心知识点的种子题目输入 Evol-Instruct,每道种子进化出 5 个难度层级,经质量过滤后得到 3000 余道带难度标签的练习题。用于微调讲题模型后,学生答疑满意度提升了 12%,题目重复投诉量下降了 40%。
Python 演示
# -*- coding: utf-8 -*-"""Evol-Instruct 简化演示:种子指令 -> 深度/广度进化 -> 约束过滤""" def simulate_llm(text: str, mode: str) -> str: """模拟一个只会添加后缀的简易 LLM,用于演示进化算子。""" if mode == "deep": return text + ",要求补充一个反方观点" if mode == "wide": return text + ",并把场景改成医疗行业" return text def evolve_instruction(seed: str, rounds: int) -> list: """对单条种子做 rounds 轮进化,返回生成出来的候选指令列表。""" evolved = [seed] cur = seed for r in range(rounds): if r % 2 == 0: cand = simulate_llm(cur, "deep") else: cand = simulate_llm(cur, "wide") if cand not in evolved: evolved.append(cand) cur = cand return evolved def constraint_filter(pool: list, min_len: int) -> list: """质量过滤:去掉太短或重复的指令。""" seen = set() result = [] for text in pool: if len(text) >= min_len and text not in seen: seen.add(text) result.append(text) return result def main() -> None: seeds = ["请解释什么是贝叶斯定理", "帮产品经理设计数据看板", "给新员工介绍安全规则"] all_instructions = [] for seed in seeds: all_instructions.extend(evolve_instruction(seed, rounds=4)) final = constraint_filter(all_instructions, min_len=8) print(f"种子指令 {len(seeds)} 条,进化候选 {len(all_instructions)} 条,过滤后 {len(final)} 条") for item in final: print("-", item) if __name__ == "__main__": main()
def simulate_llm(text: str, mode: str) -> str:定义一个模拟 LLM 的函数,根据模式返回添加了“反方观点”或“医疗场景”的新指令,对应深度进化和广度进化。if mode == "deep": return text + ",要求补充一个反方观点"深度进化的核心动作:给指令附加新的论证要求,让任务更难。evolved = [seed]; cur = seed用列表记录所有进化出来的候选指令,用cur追踪当前最新版本,对应进化链条上的当前节点。if cand not in evolved:去重判断,只把从未出现过的新指令加入候选池,模拟约束进化中的唯一性规则。constraint_filter(pool, min_len)质量过滤函数,用集合seen保证每条指令只保留一次,同时过滤长度不达标的低质量数据。for seed in seeds: all_instructions.extend(evolve_instruction(seed, rounds=4))循环处理所有种子,每颗种子进化 4 轮,观察从“种子少”到“候选多”的膨胀过程。print(f"种子指令 {len(seeds)} 条,进化候选 {len(all_instructions)} 条,过滤后 {len(final)} 条")打印统计信息,直观展示“进化的爆炸式扩展 + 过滤的收敛”两个核心特征。
常见误区
误区有些同学觉得 Evol-Instruct 是“数据永动机”,只要随便写几句“给我写一篇文章”丢进去,进化几轮就能得到大批高质量训练数据。如果效果不好,就怪进化算法不行。
正解种子指令的质量直接决定了进化结果的上限。种子本身表述模糊、任务类型单一,进化出来的指令只会更模糊、更混乱。WizardLM 等成功案例中,种子指令都经过仔细筛选,覆盖了多种任务类型且有明确的颗粒度。Evol-Instruct 是“放大器”,不是“无中生有器”。
为何常见:因为进化流程看起来全是自动化,人们容易忽略前期的数据挑选工作,而恰恰是种子选择付出的人工最决定成败。
误区一些初学者把深度进化理解为“无限加约束”,以为把指令改得又长又难就能提升模型能力。结果生成的指令连原文都不通顺,模型训练后反而变得答非所问。
正解复杂度递增策略明确要求难度只能小幅提升。越过 LLM 能力上限的指令生成的是逻辑断裂的噪声数据,过滤时也过不了质量关。正确的做法是让难度阶梯平滑上升,每一步都确保候选指令可读、可答、可评判。
为何常见:直觉上“难题 = 高价值”很诱人,但忽略了数据质量与难度的动态平衡,难度提升必须以可生成为前提。
误区有同学看到两者都是“让 LLM 生成指令”,就认为它们是同一种技术的两个马甲,面试时也答不出本质区别。
正解Self-Instruct 是单轮的生成式采样,新指令是种子指令的“近亲”变体;Evol-Instruct 是多轮的迭代进化,新指令在每一轮累积复杂度和多样性,最终能远超种子指令的能力范围。二者的数据分布形态和可扩展性完全不同。
为何常见:两者在代码实现上都很短小,表面上都是“给 LLM 一个提示词,拿到一串输出”,让人误以为没有本质差异。
误区一些工程师觉得只要把候选指令丢给 GPT-4 打一次分,过滤就完成了,没必要写规则、设阈值。结果数据集里还是混入大量格式错乱和重复数据。
正解有效的过滤需要多级组合:规则过滤先剔除格式问题、重复样本和超长数据;LLM 裁判再对语义正确性、困难度做精准评估;最后还要人工抽检确认裁判的尺度没有问题。单靠一次 LLM 打分既不可靠,也不可解释。
为何常见:因为大型模型评分看起来“很智能”,尤其 LLM 输出的打分理由往往很有说服力,让人忽视了规则层的基础保障作用。
面试题
Q1. Evol-Instruct 主要面向哪一任务?
- A.提升模型推理速度
- B.自动生成高质量指令数据← 正确答案
- C.增强图像数据扩充
- D.优化分布式训练调度
答案:B。Evol-Instruct 的核心目标是自动生成高质量指令训练数据。它不涉及推理速度优化、图像数据扩充或分布式调度。选项 B 准确对应其“数据生成”的本质角色。
Q2. 深度进化与广度进化的核心区别是?
- A.前者增加难度,后者增加多样性← 正确答案
- B.前者提高速度,后者提升精度
- C.前者减少数据,后者增加数据
- D.两者只是提示词措辞不同
答案:A。深度进化通过添加约束和推理步骤让指令变难,广度进化通过变换主题和风格让指令变多。选项 A 是二者的本质区别;选项 B、C、D 均与 Evol-Instruct 的机制不符。
Q3. 约束进化中的语义相似度阈值通常要求什么?
- A.大于 0.9,保证与原指令相关
- B.小于 0.9,保证生成足够多样← 正确答案
- C.等于 0.5,保持完全随机
- D.不做任何相似度限制
答案:B。约束进化要求新指令与原指令的相似度低于阈值(通常 0.9),否则认为新指令没有发生有效进化、只是换汤不换药,应被拒绝。
Q4. 约束进化可能包含哪些规则?
- A.控制指令长度上限← 正确答案
- B.禁止改变核心任务意图← 正确答案
- C.要求新指令与原指令低相似度← 正确答案
- D.必须使用英文生成指令
答案:ABC。长度控制、意图保持和低相似度都是约束进化的典型护栏,确保进化后的指令“新而不乱”。选项 D 并非通用规则,Evol-Instruct 面向多语言场景时可自由选择生成语言。
Q5. 为什么复杂度递增要求控制每次涨幅?
- A.防止生成超出模型能力范围的指令← 正确答案
- B.为了降低总体数据生产成本
- C.为了让指令更容易被人工审核
- D.为了减少进化的迭代轮数
答案:A。如果每轮复杂度增长过大,LLM 生成出来的指令可能逻辑断裂、无法回答,严重拉低数据质量。小幅递增保证每一步进化都建立在可生成、可验证的基础上。
Q6. 质量过滤中的“困难度”通常如何衡量?
- A.指令包含的字数多少
- B.多个基座模型回答失败或答错的比例← 正确答案
- C.人工标注单条数据花费的时间
- D.指令中数字符号出现的次数
答案:B。困难度的常用做法是让多个预训练模型尝试回答该指令,统计答错或无法回答的比例。比例越高说明指令越有挑战性。字数、标注时长和数字数量都不能可靠反映认知难度。
Q7. 与 Self-Instruct 相比,Evol-Instruct 的优势有哪些?
- A.通过多轮迭代让指令越来越复杂← 正确答案
- B.沿难度和多样性两个方向同时扩展← 正确答案
- C.不需要任何种子指令
- D.能够覆盖远超种子的指令分布空间← 正确答案
答案:ABD。进化式递推让指令在复杂度与多样性上双轴扩张,覆盖空间显著大于 Self-Instruct。但 Evol-Instruct 同样需要种子指令作为起点,所以选项 C 错误。
Q8. Evol-Instruct 属于以下哪类技术?
- A.模型量化压缩
- B.合成数据生成← 正确答案
- C.硬件加速推理
- D.模型部署优化
答案:B。Evol-Instruct 用 LLM 自主生成新的指令训练数据,是合成数据生成(Synthetic Data Generation)下的代表性方法。它与量化、推理加速和部署优化没有直接关系。
Q9. 以下哪个属于质量过滤的正确工程做法?
- A.只保留进化后字数最多的指令
- B.规则过滤与多模型评估相结合← 正确答案
- C.丢弃所有被判定为简单的指令
- D.只依赖单个模型的一次打分
答案:B。成熟的过滤流程先用规则剔除格式和重复问题,再用多个模型或 LLM 裁判做语义评估,最后辅以人工抽检。选项 A、C 过于片面,选项 D 不可靠,正确答案是组合策略。
Q10. 一个完整的 Evol-Instruct 流水线包含哪些必要环节?
- A.种子指令清洗与去重← 正确答案
- B.多轮深度与广度进化← 正确答案
- C.回答正确性与流畅性评估← 正确答案
- D.对模型权重进行剪枝压缩
答案:ABC。种子清洗、多轮进化、质量评估是 Evol-Instruct 三大核心环节。模型权重剪枝属于模型压缩范畴,与数据生成流水线无关,因此选项 D 错误。