CoT-Self-Instruct
深度解析

一种创新的合成数据生成方法,通过引导大型语言模型在生成新指令前进行思维链推理和规划,创造出高质量、逻辑性强的合成数据。

2025年7月 Meta & NYU
思维链推理的抽象概念图

核心创新

"先思考,后生成,再筛选"的策略,赋予模型"思考后说话"的能力

性能突破

在数学推理基准测试上达到58.7%准确率,超越人类标注数据

应用广泛

适用于可验证推理和不可验证指令遵循任务,为社区提供新范式

1. CoT-Self-Instruct 概述与核心思想

1.1 背景:大模型对高质量合成数据的需求

在人工智能领域,大型语言模型(LLM)的崛起正深刻地改变着深度学习的范式,其发展高度依赖于大规模、高质量的训练数据[81]。然而,获取优质的人类标注数据面临着成本高昂、数据稀缺和隐私等多重挑战[81]

关键挑战

人类生成的数据本身可能存在偏见和错误,并非总是模型训练的理想选择。如何确保生成数据的整体"质量"和"有效性",一直是一个悬而未决的挑战。

1.2 核心思想:让模型"思考后说话"

来自 Meta 和 NYU 的研究者于 2025 年 7 月提出了一种全新的合成数据生成与筛选流程[81]。该方法的核心思想是引导大型语言模型(LLM)在生成新指令之前,首先利用思维链(Chain-of-Thought, CoT)对给定的种子任务进行推理和规划。

"先思考,后生成,再筛选"策略

graph LR A["种子指令"] --> B["思维链推理"] B --> C["分析与规划"] C --> D["生成新指令"] D --> E["自动筛选"] E --> F["高质量数据"] style A fill:#f0f9ff,stroke:#0ea5e9,stroke-width:2px,color:#0f172a style B fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#0f172a style C fill:#fef3c7,stroke:#f59e0b,stroke-width:2px,color:#0f172a style D fill:#f3e8ff,stroke:#8b5cf6,stroke-width:2px,color:#0f172a style E fill:#fef2f2,stroke:#ef4444,stroke-width:2px,color:#0f172a style F fill:#f0fdf4,stroke:#22c55e,stroke-width:2px,color:#0f172a

1.3 主要贡献与优势

利用推理创造高质量数据

引导 LLM 进行一步一步的"思考",产生更高质量的合成数据

自我筛选保证数据纯度

设计筛选机制,只保留最优质的部分用于模型训练

挑战传统观念

精心设计的合成数据训练效果可以全面超越人类专家级数据集

SOTA 性能

在多个高难度基准测试上取得领先性能

2. CoT-Self-Instruct 工作原理详解

2.1 核心流程:从种子指令到高质量合成数据

CoT-Self-Instruct 的核心流程是一个两阶段的方法,旨在生成高质量的、用于训练 LLM 的合成数据[95]

阶段一(生成)

指示 LLM 首先使用思维链(CoT)进行推理、分析和规划,然后再生成一个新的、复杂的提示。这是一种元认知推理过程。

阶段二(筛选)

对生成的合成数据进行严格筛选,只保留最高质量的样本。

2.2 步骤一:基于思维链(CoT)的合成指令创建

分析与反思:理解种子指令的领域与复杂度

第一步是引导 LLM 对给定的种子指令进行深入的分析与反思。这个过程旨在让模型理解种子指令的核心任务、所属领域、以及其内在的复杂性和难度。

例如:如果种子指令是一个数学问题,模型需要分析其涉及的数学概念(如代数、几何)、解题步骤的数量以及潜在的陷阱。

规划:构思新指令的生成策略

根据前一步的分析结果,制定一个详细的生成新指令的策略。这个策略可能包括确定新指令的主题、设定其难度级别、设计其结构以及选择合适的表达方式。

例如:如果分析结果表明种子指令是一个关于"计算两个数的和"的简单算术题,那么规划阶段可能会决定生成一个同样属于算术领域但略有不同的问题。

生成:输出与种子指令质量相当的新指令

根据制定的策略,生成一个全新的合成指令。这个新生成的指令旨在与种子指令在质量和复杂性上保持相似,但又具有足够的原创性。

例如:根据前面的规划,模型可能会生成"计算 7, 15, 和 23 的平均值"这样的新指令。

2.3 步骤二:合成指令筛选(Curation)

可验证任务筛选

基于答案一致性(Answer-Consistency)

如果一个生成的问题在其 CoT 生成阶段得出的答案,与后续多次独立求解时得到的多数投票答案不一致,则该问题被舍弃。

不可验证任务筛选

基于拒绝指令偏好(RIP)

通过奖励模型来评估生成指令的质量,根据模型对生成指令的回答的奖励模型分数分布来筛选提示。

3. CoT-Self-Instruct 与 Self-Instruct 的对比分析

3.1 Self-Instruct 的基本流程与局限性

Self-Instruct 是一种开创性的合成数据生成方法,其核心思想是利用 LLM 自身的能力来生成指令遵循样本[104]。其基本流程是从一个有限的种子任务集开始,引导 LLM 生成新的任务指令、输入和输出样本。

主要局限性

  • 主要依赖于对种子指令的模仿,缺乏对指令内在逻辑和复杂性的深入理解
  • 可能导致生成的数据在质量和多样性上存在不足
  • 如何有效地筛选出高质量的合成数据也是一个挑战

3.2 CoT-Self-Instruct 的关键改进:引入思维链规划

CoT-Self-Instruct 在 Self-Instruct 的基础上进行了关键性的改进,其核心在于引入了思维链(CoT)推理机制[81]。与 Self-Instruct 直接模仿生成不同,CoT-Self-Instruct 要求 LLM 在生成新指令之前,首先对种子指令进行一步一步的"思考"。

核心改进:从模仿到认知

这种"先思考,后生成"的策略,从根本上提升了合成数据的质量和有效性,使得生成的数据不再是简单的模仿,而是经过了深度认知处理后的产物。

3.3 性能对比:在推理与指令遵循任务上的差异

实验结果有力地证明了 CoT-Self-Instruct 相较于标准 Self-Instruct 的优越性[92]

任务类型 方法 平均准确率/得分
可验证推理任务 CoT-Self-Instruct 53.0%
标准 Self-Instruct 49.5%
不可验证指令遵循任务 CoT-Self-Instruct (DPO) 53.9
标准 Self-Instruct (DPO) 47.4

关键发现

无论是在需要精确答案的推理任务,还是在答案开放的通用任务中,CoT-Self-Instruct 生成的合成数据在质量上都显著优于标准 Self-Instruct 方法生成的数据。

4. 实现细节与代码示例

4.1 实现框架与关键组件

CoT-Self-Instruct 的实现框架主要包含以下几个关键组件:

种子数据集

用于启动生成过程的初始指令集合,如 s1k 数据集或 Wildchat 指令

大型语言模型

Qwen3-4B 或 LLama 3.1-8B-Instruct 等模型

思维链提示模板

用于引导 LLM 进行一步一步的推理和规划

筛选机制

Answer-Consistency 或 RIP 筛选方法

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 推理,可能需要在数据格式中增加相应的字段,用于存储分析、规划和推理过程。

5. 性能表现:在数学推理与指令遵循任务上的评估

5.1 在可验证推理任务上的表现

数学推理数据集(MATH, AMC, AIME)上的准确率

在多个高难度的数学推理基准上,使用 CoT-Self-Instruct 生成的数据训练的模型表现出色[92]。例如,在 MATH500、AIME 2024、AMC 23 和 GPQA Diamond 等数据集上,该方法生成的合成数据显著优于现有的训练数据集。

58.7%

CoT-Self-Instruct (10k 数据) 平均准确率

与其他合成数据集的对比

训练数据集 平均准确率
CoT-Self-Instruct (10k 数据) 58.7%
CoT-Self-Instruct (5k 数据) 57.2%
OpenMathReasoning 47.5%
s1k (人工标注数据) 44.6%

关键发现:由 CoT-Self-Instruct 生成的"高质量合成数据"在某些方面比"人类黄金数据"更有效。

5.2 在不可验证指令遵循任务上的表现

指令遵循基准(AlpacaEval 2.0, Arena-Hard)上的得分

在不可验证的、更开放的指令遵循任务上,CoT-Self-Instruct 同样表现出色[92]。在 AlpacaEval 2.0 和 Arena-Hard 这两个公认的指令遵循能力评估基准上,使用该方法生成的指令训练的模型,其性能超越了使用人类编写或标准 Self-Instruct 提示训练的模型。

67.1

在线 DPO (RIP 筛选)

53.9

离线 DPO

与人类编写指令及标准 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

5.3 数据筛选机制对性能的提升效果

数据筛选机制在 CoT-Self-Instruct 流程中扮演着至关重要的角色,能够显著提升最终生成数据的质量和模型性能[92]

可验证推理任务

无筛选 53.0%
Answer-Consistency 筛选 57.2%
性能提升 +4.2%

不可验证指令遵循任务

无 RIP 筛选 53.9
RIP 筛选 54.7
性能提升 +0.8

结论:无论是针对可验证任务还是不可验证任务,精心设计的筛选机制都能够有效地过滤掉低质量的合成数据,从而确保用于模型训练的数据集具有更高的纯度和有效性。

6. 总结与未来展望

6.1 CoT-Self-Instruct 的核心价值与意义

CoT-Self-Instruct 的提出,为解决大型语言模型面临的"数据瓶颈"问题提供了一个极具价值和启发性的新方向[81]

系统性范式

通过"先思考,后生成,再筛选"的策略,为社区提供了一种低成本、高效率地创造高质量训练数据的新方法

挑战传统

实验结果证明,经过精心设计和筛选的合成数据,其训练效果可以全面超越人类专家级数据集

能力提升

在多个高难度的基准测试上取得了 SOTA 或领先的性能,直接推动了模型能力的提升

6.2 应用场景与未来研究方向

应用场景

数学和科学推理

生成具有挑战性的数学、物理、化学等学科的推理问题

代码生成与理解

生成各种编程语言的代码片段、算法题和调试任务

创意写作与内容生成

生成各种风格、体裁的写作任务,如诗歌、小说、剧本等

多语言任务

应用于不同的语言,生成多语言的指令数据

未来研究方向

探索更先进的推理和规划机制

除了思维链,是否可以引入其他更复杂的认知架构,如思维树(Tree of Thought)等

研究更普适的自动化筛选指标

开发能够同时适用于可验证和不可验证任务的通用筛选方法

应用于更小规模的模型

研究如何将该方法应用于参数规模更小的模型,降低计算成本