1. CoT-Self-Instruct 概述与核心思想
1.1 背景:大模型对高质量合成数据的需求
在人工智能领域,大型语言模型(LLM)的崛起正深刻地改变着深度学习的范式,其发展高度依赖于大规模、高质量的训练数据 。然而,获取优质的人类标注数据面临着成本高昂、数据稀缺和隐私等多重挑战 。更有研究指出,人类生成的数据本身可能存在偏见和错误,并非总是模型训练的理想选择 。在这样的背景下,合成数据,即通过算法人工生成的数据,成为了一条极具前景的技术路径。一个创新的合成数据生成方法是 Self-Instruct,它利用 LLM 自身的能力来产生新的指令样本 。其基本流程是:提供少量“种子”指令,然后让 LLM 模仿这些例子生成更多类似的指令。尽管后续出现了许多变体,旨在增加生成指令的复杂性或多样性,但如何确保生成数据的整体“质量”和“有效性”,一直是一个悬而未决的挑战 。
1.2 核心思想:让模型“思考后说话”
为了解决上述挑战,来自 Meta 和 NYU 的研究者于 2025 年 7 月发布了论文《CoT-Self-Instruct: Building high-quality synthetic prompts for reasoning and non-reasoning tasks》,提出了一种全新的合成数据生成与筛选流程 。该方法的核心思想是引导大型语言模型(LLM)在生成新指令之前,首先利用思维链(Chain-of-Thought, CoT)对给定的种子任务进行推理和规划,然后基于此生成一个质量和复杂性都相似的新合成指令 。最后,通过自动化指标对生成的数据进行严格筛选,以确保最终用于训练的数据都是高质量的 。这种 “先思考,后生成,再筛选” 的策略,旨在赋予模型“思考后说话”的能力,从而显著提升模型在推理和非推理任务上的表现,甚至超越了现有的人工标注数据集 。
1.3 主要贡献与优势
CoT-Self-Instruct 的主要贡献在于提出了一种通用且高效的合成数据流水线,为社区提供了一种系统性地、低成本地创造高质量训练数据的新范式 。其核心优势在于:
- 利用推理来创造高质量数据:在生成新指令前,先引导 LLM 进行一步一步的“思考”(即 Chain-of-Thought),从而产生更高质量的合成数据 。
- 自我筛选以保证数据纯度:创建数据后,设计了一套筛选机制,只保留最优质的部分用于模型训练 。
- 挑战“人类数据是黄金标准”的传统观念:实验结果表明,经过精心设计和筛选的合成数据,其训练效果可以全面超越现有的、被广泛使用的人类专家级数据集 。
- 在多个高难度基准测试上取得 SOTA 或领先性能:使用 CoT-Self-Instruct 数据训练的模型,在多个高难度的推理和对话基准测试上取得了 state-of-the-art(SOTA)或领先的性能,直接推动了模型能力的提升 。
2. CoT-Self-Instruct 工作原理详解
2.1 核心流程:从种子指令到高质量合成数据
CoT-Self-Instruct 的核心流程是一个两阶段的方法,旨在生成高质量的、用于训练 LLM 的合成数据 。
阶段一(生成) :该方法并非简单地模仿种子提示,而是指示 LLM 首先使用思维链(CoT)进行推理、分析和规划,然后再生成一个新的、复杂的提示。这是一种元认知推理过程 。
阶段二(筛选) :对生成的合成数据进行严格筛选,只保留最高质量的样本 。
2.2 步骤一:基于思维链(CoT)的合成指令创建
2.2.1 分析与反思:理解种子指令的领域与复杂度
在 CoT-Self-Instruct 流程中,第一步是引导 LLM 对给定的种子指令进行深入的分析与反思。这个过程旨在让模型理解种子指令的核心任务、所属领域、以及其内在的复杂性和难度。例如,如果种子指令是一个数学问题,模型需要分析其涉及的数学概念(如代数、几何)、解题步骤的数量以及潜在的陷阱。这种分析与反思的过程,使得模型不仅仅是简单地复制或轻微修改种子指令,而是能够真正“理解”其结构和要求,为后续生成高质量、同等级复杂度的新指令奠定基础。这一步骤是 CoT-Self-Instruct 区别于传统 Self-Instruct 方法的关键,它引入了更深层次的认知处理,从而提升了生成数据的质量和多样性。
2.2.2 规划:构思新指令的生成策略
在完成了对种子指令的分析与反思之后,LLM 会进入规划阶段。在这个阶段,模型会根据前一步的分析结果,制定一个详细的生成新指令的策略。这个策略可能包括确定新指令的主题、设定其难度级别、设计其结构(例如,是否需要多步推理)以及选择合适的表达方式。例如,如果分析结果表明种子指令是一个关于“计算两个数的和”的简单算术题,那么规划阶段可能会决定生成一个同样属于算术领域但略有不同的问题,比如“计算三个数的平均值”。这个规划过程确保了新生成的指令在质量和复杂性上与原始种子指令相当,从而维持了数据集的整体一致性和高质量。
2.2.3 生成:输出与种子指令质量相当的新指令
在规划阶段完成后,LLM 会根据制定的策略,生成一个全新的合成指令。这个新生成的指令旨在与种子指令在质量和复杂性上保持相似,但又具有足够的原创性,以避免简单的重复。例如,根据前面的规划,模型可能会生成“计算 7, 15, 和 23 的平均值”这样的新指令。通过这种方式,CoT-Self-Instruct 能够系统性地扩展初始的种子数据集,生成大量高质量、多样化的训练样本,而无需人工干预。这种“思考后说话”的生成方式,使得合成数据的质量得到了显著提升,为后续的模型训练提供了更优质的“养料”。
2.3 步骤二:合成指令筛选(Curation)
2.3.1 可验证任务筛选:基于答案一致性(Answer-Consistency)
对于可验证的推理任务(如数学和逻辑推理),CoT-Self-Instruct 引入了一种名为“答案一致性”(Answer-Consistency)的筛选方法 。该方法的核心思想是,如果一个生成的问题在其 CoT 生成阶段得出的答案,与后续多次独立求解该问题时得到的多数投票答案不一致,则该问题被舍弃 。这是一种强大的自我修正机制,能够有效过滤掉那些本身存在错误、模糊不清或过于困难的问题。通过这种方式,可以确保最终保留的合成数据都是高质量、可验证且对模型训练有益的。例如,如果一个生成的数学问题,其 CoT 推理过程得出的答案是“42”,但后续让模型独立求解 5 次,其中有 4 次答案都是“44”,那么这个问题就会被认为是不一致的,从而被筛选掉。
2.3.2 不可验证任务筛选:基于拒绝指令偏好(RIP)
对于不可验证的通用指令遵循任务(如写作、编程等),CoT-Self-Instruct 采用了“拒绝指令偏好”(Rejecting Instruction Preferences, RIP)方法进行筛选 。RIP 方法通过奖励模型(Reward Model)来评估生成指令的质量。具体来说,它会根据模型对生成指令的回答的奖励模型分数分布来筛选提示 。如果一个指令能够引导模型生成高质量、符合要求的回答,那么它就会被保留下来。反之,如果指令模糊不清、引导性差,导致模型生成的回答质量低,那么它就会被筛选掉。这种方法为评估和筛选非可验证任务的合成数据提供了一种有效的自动化手段,确保了最终用于训练的数据都是高质量的。
3. CoT-Self-Instruct 与 Self-Instruct 的对比分析
3.1 Self-Instruct 的基本流程与局限性
Self-Instruct 是一种开创性的合成数据生成方法,其核心思想是利用 LLM 自身的能力来生成指令遵循样本 。其基本流程是:从一个有限的种子任务集开始,引导 LLM 生成新的任务指令、输入和输出样本,然后通过启发式方法自动过滤掉低质量或重复的样本,最后将剩余的有效任务添加到任务池中,用于对原始模型进行微调 。尽管 Self-Instruct 在提升模型指令遵循能力方面取得了显著成效,但它也存在一些局限性。最主要的问题是,它主要依赖于对种子指令的模仿,缺乏对指令内在逻辑和复杂性的深入理解,这可能导致生成的数据在质量和多样性上存在不足 。此外,如何有效地筛选出高质量的合成数据,也是 Self-Instruct 面临的一个挑战。
3.2 CoT-Self-Instruct 的关键改进:引入思维链规划
CoT-Self-Instruct 在 Self-Instruct 的基础上进行了关键性的改进,其核心在于引入了思维链(CoT)推理机制 。与 Self-Instruct 直接模仿生成不同,CoT-Self-Instruct 要求 LLM 在生成新指令之前,首先对种子指令进行一步一步的“思考”,即进行推理和规划 。这个过程使得模型能够更深入地理解种子指令的结构、逻辑和复杂性,从而能够生成在质量和复杂度上与之相当,但又具有足够原创性的新指令。这种“先思考,后生成”的策略,从根本上提升了合成数据的质量和有效性,使得生成的数据不再是简单的模仿,而是经过了深度认知处理后的产物。
3.3 性能对比:在推理与指令遵循任务上的差异
实验结果有力地证明了 CoT-Self-Instruct 相较于标准 Self-Instruct 的优越性 。
在可验证推理任务上:
- CoT-Self-Instruct:在不进行任何数据筛选的情况下,平均准确率达到 53.0%。
- 标准 Self-Instruct:平均准确率仅为 49.5% 。
在不可验证指令遵循任务上:
- CoT-Self-Instruct:在 DPO 训练下,平均得分为 53.9。
- 标准 Self-Instruct:平均得分为 47.4 。
这些数据清晰地表明,无论是在需要精确答案的推理任务,还是在答案开放的通用任务中,CoT-Self-Instruct 生成的合成数据在质量上都显著优于标准 Self-Instruct 方法生成的数据。
4. 实现细节与代码示例
4.1 实现框架与关键组件
CoT-Self-Instruct 的实现框架主要包含以下几个关键组件:
- 种子数据集:用于启动生成过程的初始指令集合。对于推理任务,可以使用 s1k 数据集中的可验证推理指令;对于非推理任务,可以使用经过筛选的 Wildchat 指令 。
- 大型语言模型(LLM) :用于执行分析、规划、生成和筛选等任务。根据任务类型,可以选择不同的模型,例如 Qwen3-4B 系列模型用于生成推理数据,LLama 3.1-8B-Instruct 用于生成非推理数据 。
- 思维链(CoT)提示模板:用于引导 LLM 进行一步一步的推理和规划。
- 筛选机制:根据任务类型选择不同的筛选方法,如 Answer-Consistency 用于可验证任务,RIP 用于不可验证任务 。
- 训练方法:用于在生成的合成数据上对模型进行微调,例如 GRPO(一种强化学习算法)用于推理任务,DPO(直接偏好优化)用于非推理任务 。
4.2 伪代码示例:模拟 CoT-Self-Instruct 流程
以下是一个简化的 Python 伪代码示例,用于模拟 CoT-Self-Instruct 的核心流程:
import random
class LargeLanguageModel:
def __init__(self):
# 模拟 LLM 的响应
self.responses = {
"分析以下任务:计算 2 + 2 的值。请输出分析文本:": "这是一道简单的数学加法题,目的是测试模型的计算能力。",
"基于以下分析,制定生成新任务的计划:这是一道简单的数学加法题,目的是测试模型的计算能力。请输出计划:": "生成一道类似的简单数学加法题,例如 '计算 3 + 5 的值'。",
"根据以下计划,生成一个新的任务:生成一道类似的简单数学加法题,例如 '计算 3 + 5 的值'。请输出新任务:": "计算 3 + 5 的值。",
"计算 3 + 5 的值。": "8"
}
def analyze(self, seed_instruction):
prompt = f"分析以下任务:{seed_instruction}。请输出分析文本:"
return self.responses.get(prompt, "无法分析该任务。")
def plan(self, analysis):
prompt = f"基于以下分析,制定生成新任务的计划:{analysis}。请输出计划:"
return self.responses.get(prompt, "无法制定计划。")
def generate(self, plan):
prompt = f"根据以下计划,生成一个新的任务:{plan}。请输出新任务:"
return self.responses.get(prompt, "无法生成新任务。")
def solve(self, instruction):
return self.responses.get(instruction, "无法解答该问题。")
def answer_consistency_filter(instruction, model, num_trials=3):
"""模拟答案一致性筛选"""
# 获取 CoT 生成阶段的答案
cot_answer = model.solve(instruction)
# 多次独立求解
answers = [model.solve(instruction) for _ in range(num_trials)]
# 计算多数投票答案
majority_answer = max(set(answers), key=answers.count)
# 检查一致性
if cot_answer == majority_answer:
return True, instruction
else:
return False, None
def cot_self_instruct(seed_instruction, model):
"""CoT-Self-Instruct 的主函数"""
print(f"种子指令: {seed_instruction}")
# Step 1:分析
analysis = model.analyze(seed_instruction)
print(f"分析结果: {analysis}")
# Step 2:规划
plan = model.plan(analysis)
print(f"规划结果: {plan}")
# Step 3:生成
new_instruction = model.generate(plan)
print(f"生成的新指令: {new_instruction}")
# Step 4:筛选 (以可验证任务为例)
is_valid, filtered_instruction = answer_consistency_filter(new_instruction, model)
if is_valid:
print(f"筛选通过,保留指令: {filtered_instruction}")
return filtered_instruction
else:
print("筛选未通过,丢弃该指令。")
return None
# 使用示例
model = LargeLanguageModel()
seed = "计算 2 + 2 的值。"
synthetic_data = cot_self_instruct(seed, model)
4.3 与现有 Self-Instruct 代码库的结合思路
虽然 CoT-Self-Instruct 引入了新的思维链推理和筛选机制,但其核心流程与 Self-Instruct 有相似之处,因此可以考虑在现有的 Self-Instruct 代码库基础上进行扩展。主要的结合思路如下:
- 修改指令生成模块:在原有的指令生成逻辑中,加入 CoT 推理的步骤。即在生成新指令之前,先调用 LLM 进行分析和规划。
- 增加筛选模块:在生成指令之后,增加一个筛选模块,根据任务类型实现 Answer-Consistency 或 RIP 筛选算法。
- 调整数据格式:为了支持 CoT 推理,可能需要在数据格式中增加相应的字段,用于存储分析、规划和推理过程。
通过这种方式,可以充分利用现有 Self-Instruct 代码库的基础设施,同时引入 CoT-Self-Instruct 的核心创新,从而更高效地实现这一新方法。
5. 性能表现:在数学推理与指令遵循任务上的评估
5.1 在可验证推理任务上的表现
5.1.1 数学推理数据集(MATH, AMC, AIME)上的准确率
在多个高难度的数学推理基准上,使用 CoT-Self-Instruct 生成的数据训练的模型表现出色 。例如,在 MATH500、AIME 2024、AMC 23 和 GPQA Diamond 等数据集上,该方法生成的合成数据显著优于现有的训练数据集 。具体来说,当训练数据量增加到 10k 时,模型的平均准确率达到了惊人的 58.7% 。这一结果充分证明了 CoT-Self-Instruct 在生成高质量、可用于提升模型推理能力的合成数据方面的有效性。
5.1.2 与其他合成数据集(s1k, OpenMathReasoning)的对比
与现有的知名合成数据集相比,CoT-Self-Instruct 生成的数据在训练模型方面表现出显著的优势 。
| 训练数据集 | 平均准确率 |
| :--- | :--- |
| CoT-Self-Instruct (10k 数据) | 58.7% |
| CoT-Self-Instruct (5k 数据) | 57.2% |
| OpenMathReasoning | 47.5% |
| s1k (人工标注数据) | 44.6% |
数据来源:
从上表可以看出,无论是与更大规模的 OpenMathReasoning 数据集,还是与人工标注的 s1k 数据集相比,CoT-Self-Instruct 生成的数据都能带来更高的模型性能。这表明,由 CoT-Self-Instruct 生成的“高质量合成数据”在某些方面比“人类黄金数据”更有效 。
5.2 在不可验证指令遵循任务上的表现
5.2.1 指令遵循基准(AlpacaEval 2.0, Arena-Hard)上的得分
在不可验证的、更开放的指令遵循任务上,CoT-Self-Instruct 同样表现出色 。在 AlpacaEval 2.0 和 Arena-Hard 这两个公认的指令遵循能力评估基准上,使用该方法生成的指令训练的模型,其性能超越了使用人类编写或标准 Self-Instruct 提示训练的模型 。在更高级的在线 DPO 训练设置中,CoT-Self-Instruct 结合 RIP 筛选的得分高达 67.1,展现了其在提升模型通用指令遵循能力方面的巨大潜力 。
5.2.2 与人类编写指令及标准 Self-Instruct 的对比
与使用人类编写的 WildChat 指令和标准 Self-Instruct 方法生成的指令相比,CoT-Self-Instruct 生成的指令在质量上再次胜出 。
| 训练数据生成方法 | 训练方法 | 平均得分 |
| :--- | :--- | :--- |
| CoT-Self-Instruct + RIP 筛选 | 在线 DPO | 67.1 |
| 人类指令 (WildChat) | 在线 DPO | 63.1 |
| CoT-Self-Instruct | DPO | 53.9 |
| 标准 Self-Instruct | DPO | 47.4 |
| 人类指令 (WildChat) | DPO | 46.8 |
数据来源:
从上表可以清晰地看到,无论是在离线 DPO 还是在线 DPO 训练设置下,使用 CoT-Self-Instruct 生成的数据训练的模型,其性能都显著优于使用人类数据或标准 Self-Instruct 数据训练的模型。
5.3 数据筛选机制对性能的提升效果
数据筛选机制在 CoT-Self-Instruct 流程中扮演着至关重要的角色,能够显著提升最终生成数据的质量和模型性能 。
在可验证推理任务上:
- 在不进行任何筛选的情况下,CoT-Self-Instruct 的平均准确率为 53.0%。
- 应用 Answer-Consistency 筛选 后,性能提升至 57.2%(在 2926 个训练样本上) 。
在不可验证指令遵循任务上:
- 在未应用 RIP 筛选的情况下,CoT-Self-Instruct 的平均得分为 53.9。
- 应用 RIP 筛选 后,性能进一步提升至 54.7 。
这些结果有力地证明了,无论是针对可验证任务还是不可验证任务,精心设计的筛选机制都能够有效地过滤掉低质量的合成数据,从而确保用于模型训练的数据集具有更高的纯度和有效性,最终带来模型性能的显著提升。
6. 总结与未来展望
6.1 CoT-Self-Instruct 的核心价值与意义
CoT-Self-Instruct 的提出,为解决大型语言模型面临的“数据瓶颈”问题提供了一个极具价值和启发性的新方向 。其核心价值和意义在于:
- 提供了一种系统性的高质量合成数据生成范式:通过“先思考,后生成,再筛选”的策略,为社区提供了一种低成本、高效率地创造高质量训练数据的新方法 。
- 挑战了“人类数据是黄金标准”的传统观念:实验结果有力地证明,经过精心设计和筛选的合成数据,其训练效果可以全面超越现有的、被广泛使用的人类专家级数据集 。
- 推动了模型在推理和指令遵循两大核心能力上的提升:在多个高难度的基准测试上取得了 SOTA 或领先的性能,直接推动了模型能力的提升 。
6.2 应用场景与未来研究方向
CoT-Self-Instruct 的应用场景非常广泛,几乎可以应用于任何需要大量高质量指令数据进行模型微调的场景,例如:
- 数学和科学推理:生成大量具有挑战性的数学、物理、化学等学科的推理问题,用于提升模型的科学素养和逻辑推理能力。
- 代码生成与理解:生成各种编程语言的代码片段、算法题和调试任务,用于训练更强大的代码模型。
- 创意写作与内容生成:生成各种风格、体裁的写作任务,如诗歌、小说、剧本等,用于激发模型的创造力。
- 多语言任务:将该方法应用于不同的语言,生成多语言的指令数据,用于提升模型的多语言处理能力。
未来的研究方向可以包括:
- 探索更先进的推理和规划机制:除了思维链,是否可以引入其他更复杂的认知架构,如思维树(Tree of Thought)等,以进一步提升生成数据的质量。
- 研究更普适的自动化筛选指标:开发能够同时适用于可验证和不可验证任务的通用筛选方法,进一步降低对特定领域知识的依赖。
- 将该方法应用于更小规模的模型:研究如何将该方法应用于参数规模更小的模型,以降低计算成本,并探索其在模型蒸馏和知识迁移中的应用潜力。