CAMEL Self-Improving CoT 数据生成管线深度解析:从 STaR 迭代精炼到工程化落地
2026/9/14 1:43:13 网站建设 项目流程

CAMEL Self-Improving CoT 数据生成管线深度解析:从 STaR 迭代精炼到工程化落地

【免费下载链接】camel🐫 CAMEL: The first and the best multi-agent framework. Finding the Scaling Law of Agents. https://www.camel-ai.org项目地址: https://gitcode.com/GitHub_Trending/ca/camel

本文以 CAMEL 开源仓库中的 self_improving_cot_generation.md 为骨架,结合 self_improving_cot.py 源码、示例脚本 与单元测试,系统讲解 CAMEL 如何通过「生成 → 评估 → 反馈精炼」的迭代循环,蒸馏推理模型(如 DeepSeek-R1)产生高质量思维链(Chain-of-Thought, CoT)数据,并用这些数据微调小参数 LLM 以增强其推理能力。读完本文,你将掌握SelfImprovingCoTPipeline的完整参数语义、Agent 评估与奖励模型评估两种打分机制、动态批量处理与指数退避重试的底层实现,以及一套可直接运行的 CoT 数据生成工程方案。

一、为什么需要迭代式 CoT 管线

随着 DeepSeek-R1、OpenAI o3-mini 等推理模型的问世,业界验证了一条高效的推理能力迁移路径:从推理模型中蒸馏 CoT 数据,再用这些数据微调参数量更小的模型,从而以更低成本获得更强的复杂推理与代码生成能力。

但一次性(one-shot)的 CoT 生成往往产出不完整或次优的推理过程。CAMEL 给出的解法是自教推理(Self-Taught Reasoner,STaR)式的多步迭代循环(源码 docstring 中明确注明该管线实现了 STaR 论文的方法):

  1. 生成(Generate):为问题生成一条初始推理轨迹(reasoning trace);
  2. 评估(Evaluate):通过专门的评估 Agent 或奖励模型对轨迹打分并给出反馈;
  3. 精炼(Refine):reason agent 依据反馈改进推理轨迹。

循环持续进行,直到轨迹满足正确性、清晰度与完整性等质量阈值,或在达到最大迭代次数后停止。每一轮迭代都让模型从上一轮的输出与评估中学习,从而逐步逼近高质量推理过程。

二、管线的三个核心组件

从源码 self_improving_cot.py 的构造函数可以看出,自改进管线由三个核心角色构成:

组件类型职责
reason_agentChatAgent(必填)生成初始推理轨迹,并在收到反馈后生成改进版本
evaluate_agentChatAgent(可选)以批判性教师身份评估轨迹质量,输出三维评分与文本反馈
reward_modelBaseRewardModel(可选)提供数值化评分,覆盖正确性、连贯性、复杂度、简洁度等维度

其中reason_agent是唯一必填组件;evaluate_agentreward_model二选一即可驱动评估环节——两者都不提供时,管线只生成初始轨迹而不做评估与迭代(详见源码process_problemif self.evaluate_agent or self.reward_model:的守卫逻辑)。

三、CoT 数据生成:管线的核心环节

3.1 初始轨迹生成

reason_agent通过 REASONING_TEMPLATE 模板组织生成提示词:

Let's solve this step by step: Problem: {problem} 1. First, let's understand what we're asked 2. Let's break this down into parts 3. Let's solve each part systematically 4. Finally, let's verify our solution {few_shot_examples} Please show your complete reasoning process.
  • 输入:问题陈述(problem),可选提供 ground truth(solution)引导推理方向;可选few_shot_examples通过示例约束推理风格。
  • 输出:一段逐步展开的推理内容,作为可直接使用或进一步精炼的基础轨迹。

CAMEL 也支持通过提示工程让非推理型 LLM 生成轨迹——这正是 self_improving_cot_example.py 中用ModelType.DEEPSEEK_CHAT搭配温度 0 配置做生成器的原因。

3.2 轨迹评估:Agent 评估 vs 奖励模型

评估服务于两个目的:发现弱点(定位轨迹可改进之处)与提供反馈(指导精炼)。源码evaluate_trace方法(@retry_on_error装饰)实现了两条评估路径:

路径一:Agent 评估

evaluate_agent使用 EVALUATION_TEMPLATE 提示词,从三个维度打分(0–1):

  1. Correctness(正确性):每一步逻辑是否严谨、能否正确求解问题;
  2. Clarity(清晰度):推理是否易于理解、结构是否清晰;
  3. Completeness(完整性):推理是否包含所有必要步骤。

评估结果通过response_format=AgentTraceEvaluation强制为结构化 JSON(见 AgentTraceEvaluation 数据模型:correctnessclaritycompletenessfeedback四个字段),反馈文本能指出"推理不清"或"答案错误"等具体改进点,比基于规则的匹配更通用、更灵活。

路径二:奖励模型评估

当传入reward_model时,管线内部会构造Evaluator(reward_model=reward_model)(实现见 evaluator.py),将「问题 + 轨迹」作为消息列表交给奖励模型打分:

  • 若奖励模型返回单一分数,则归一到{"overall": score}
  • 若返回多维分数(如 correctness、coherence、helpfulness),则原样透传并自动生成反馈。

测试 test_self_improving_cot_pipeline.py 中test_reward_model_single_score_evaluationtest_reward_model_multi_score_evaluation分别覆盖了这两种打分形态。示例脚本中还预留了NemotronRewardModel(NVIDIA Nemotron-340B-Reward)的接入方式,可通过ModelType.NVIDIA_NEMOTRON_340B_REWARD启用。

3.3 迭代精炼:自改进循环

process_problem中的循环逻辑完整实现了「反馈集成 → 推理改进 → 重新评估 → 阈值检查」四步:

  1. 反馈集成:评估结果中的feedback作为改进依据——重写含糊部分、补齐缺失步骤、修正逻辑;
  2. 推理改进reason_agent基于 IMPROVEMENT_TEMPLATE 生成改进版轨迹,模板同时注入问题、上一版轨迹与反馈文本:
    Based on this feedback, generate an improved reasoning trace: Problem: {problem} {solution} Previous Trace: {trace} Feedback: {feedback} Generate a new, improved reasoning trace that addresses the feedback.
  3. 重新评估:改进版轨迹用同一套机制(Agent 或奖励模型)再次评估,确认改进是否生效;
  4. 阈值检查:满足质量阈值或达到max_iterations上限即终止。

阈值检查逻辑由 _check_score_threshold 实现:

  • score_thresholdfloat时,要求所有维度分数都 >= 阈值
  • score_thresholddict时(如{"correctness": 0.8, "coherence": 0.7}),按维度逐项校验,未指定的维度使用默认值 0;
  • 反馈生成器 _generate_feedback 会自动列出未达标维度(如 "Need improvement in: correctness, clarity")作为下一轮改进提示。

每次迭代的轨迹与评估结果都会被记录为TraceIteration(含iteration序号、轨迹文本与评估对象),形成完整的improvement_history改进历史,便于事后审计与数据筛选。

四、管线初始化与参数详解

SelfImprovingCoTPipeline的全部参数及其语义如下(与源码 self_improving_cot.py 保持一致):

参数类型默认值说明
reason_agentChatAgent必填负责生成与改进推理轨迹的 Agent
problemsList[Dict]必填待处理的问题字典列表(必须含"problem"键,可选"id"/"type"/"solution"
max_iterationsint3最大改进轮数;设为0则只生成初始轨迹、不做迭代
score_thresholdfloat/Dict[str, float]0.7质量阈值;浮点数作用于平均分,字典按维度分别设阈值,未指定维度默认0.7(奖励模型路径)或0(Agent 路径)
rejection_sampling_nOptional[int]None拒绝采样候选数:一次生成 N 条候选轨迹,评估后择优(见第六节)
evaluate_agentOptional[ChatAgent]None评估轨迹质量的 Agent;为None且无奖励模型时不做评估
reward_modelOptional[BaseRewardModel]None奖励模型;为None时使用 Agent 自评估
output_pathOptional[str]None结果输出文件路径;为None时仅返回结果、不落盘
few_shot_examplesOptional[str]None少样本示例文本,注入生成提示词约束推理风格
batch_sizeOptional[int]None并行处理批大小;None时由BatchProcessor按资源动态决定(默认 10)
max_workersOptional[int]None最大线程数;None时根据 CPU/内存负载动态计算
solution_patternstrr'\\boxed{(.*?)}'正则(含一个捕获组),从答案文本中提取最终答案
trace_patternOptional[str]None从轨迹文本提取答案的正则;为None时复用solution_pattern

此外,problems字典在进入处理前会经过 validate_problem_format 校验:"problem"键必须存在且为字符串,可选的id/type/solution字段类型不合法会抛出ValueError

完整可运行示例

以下是 CAMEL 官方示例 self_improving_cot_example.py 的完整流程(需先设置export DEEPSEEK_API_KEY=""):

import json import os import time from camel.agents import ChatAgent from camel.configs import DeepSeekConfig from camel.datagen import SelfImprovingCoTPipeline from camel.models import ModelFactory from camel.types import ModelPlatformType, ModelType model = ModelFactory.create( model_platform=ModelPlatformType.DEEPSEEK, model_type=ModelType.DEEPSEEK_CHAT, model_config_dict=DeepSeekConfig(temperature=0).as_dict(), ) def main(): current_dir = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(current_dir, 'gsm8k_dataset.json'), 'r') as f: problems = json.load(f) reason_agent = ChatAgent( """Please reason step by step, and put your final answer within \\boxed{}.""", model=model, ) evaluate_agent = ChatAgent( """You are a highly critical teacher who evaluates the student's answers with a meticulous and demanding approach.""" ) # 可为不同维度设置不同阈值 score_threshold = { "correctness": 0.9, "clarity": 0.9, "completeness": 0.6, } # 或统一阈值:score_threshold = 0.9 pipeline = SelfImprovingCoTPipeline( reason_agent=reason_agent, evaluate_agent=evaluate_agent, problems=problems, output_path='self_improving_cot_output.json', max_iterations=3, score_threshold=score_threshold, ) results = pipeline.generate(rationalization=False) print(f"Processed {len(results)} problems") if __name__ == "__main__": main()

generate(rationalization=False)是管线入口:内部通过asyncio事件循环驱动_batch_process_problems并行处理所有问题,最终返回List[ProblemResult]的字典序列,并(在设置output_path时)将结果写入文件。rationalization=True时,改进环节会把 ground truth 一并注入提示词,引导模型对照标准答案精炼。

五、批量处理与 API 稳定性保障

5.1 动态批量处理

早期逐个串行生成 CoT 的尝试暴露出两大问题:耗时不可扩展API 请求瓶颈(大量请求导致限速或偶发断连)。CAMEL 因此引入并行BatchProcessor(实现见 commons.py),核心能力包括:

  • 将任务切分为批次,用ThreadPoolExecutor并发提交;
  • 动态调整批大小:按成功率与单批耗时调整——backoff_factor=0.8用于失败时收缩,success_factor=1.2用于成功时扩张,批大小被钳制在min_batch_size=1max_batch_size=20之间;
  • 资源感知:CPU 使用率超过cpu_threshold=80%、内存超过memory_threshold=85%时自动缩减 worker 与批大小;max_workers未指定时按 CPU 核心数与当前负载估算(如负载高时取cpu_count // 4,空闲时取cpu_count - 1);
  • 每批结束后调用adjust_batch_size(batch_success, processing_time)并输出含批大小、worker 数、CPU/内存占用、平均耗时与错误率的进度日志。

_batch_process_problems_batch_evaluate_traces两个异步方法分别承担生成与评估阶段的并行调度,as_completed收集结果时单条失败不会拖垮整批。

5.2 指数退避重试

即使有批处理,LLM API 请求仍可能因网络波动或远端不稳定而失败。CAMEL 在camel.utils中提供retry_on_error装饰器(commons.py):

def retry_on_error(max_retries: int = 3, initial_delay: float = 1.0): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): delay = initial_delay for attempt in range(max_retries + 1): try: return func(*args, **kwargs) except Exception as e: if attempt == max_retries: raise time.sleep(delay) delay *= 2 # 指数退避:1s → 2s → 4s raise return wrapper return decorator

generate_reasoning_traceevaluate_traceimprove_tracegenerate_reasoning_trace_rejection均以@retry_on_error()装饰,任何瞬时错误都会按指数退避自动重试(默认最多 3 次,等待时间 1s、2s、4s 逐次翻倍),保证生成/评估/精炼环节的稳定流转。

六、模型切换与实时文件写入

6.1 多模型调度

为增强容错与连续性,可向ChatAgent传入模型列表——当某个模型不可用时自动切换,保持推理不中断。参考 self_improving_cot_example_with_r1.py(需设置DEEPSEEK_API_KEYFIREWORKS_API_KEY等环境变量):

from camel.models import ModelFactory from camel.types import ModelPlatformType, ModelType evaluate_model = ModelFactory.create( model_platform=ModelPlatformType.DEFAULT, model_type=ModelType.DEFAULT, ) # 通过多家服务商接入 DeepSeek-R1,互为备份 reason_model_1 = ModelFactory.create( model_platform=ModelPlatformType.DEEPSEEK, model_type=ModelType.DEEPSEEK_REASONER, ) reason_model_2 = ModelFactory.create( model_platform=ModelPlatformType.OPENAI_COMPATIBLE_MODEL, model_type="accounts/fireworks/models/deepseek-r1", api_key=os.getenv("FIREWORKS_API_KEY"), url="https://api.fireworks.ai/inference/v1", model_config_dict={"max_tokens": 4096}, ) reason_agent = ChatAgent( system_message="Answer my question and give your final answer within \\boxed{}.", model=[reason_model_1, reason_model_2], )

该示例还演示了「以 R1 为生成器 + 默认模型为评估器」的典型蒸馏配置,以及max_iterations=0时"仅蒸馏不迭代"的高吞吐模式(配合GET_REASONING_CONTENT=true提取推理内容)。

6.2 原子化 JSON 实时更新

为避免进程中断导致全量结果丢失,管线采用边处理边落盘策略:每个问题处理完成后立即加锁(threading.Lock)更新output_path文件。写入通过 safe_write_json 的两段式原子操作完成:

def safe_write_json(self, file_path, data): temp_path = file_path + ".tmp" with open(temp_path, "w") as f: json.dump(data, f, indent=2, ensure_ascii=False) os.replace(temp_path, file_path)

先写.tmp临时文件再os.replace原子替换,从根本上杜绝部分写入损坏输出文件;同时 clean_json 会把 NaN/Inf 等非法浮点值归一为None,保证 JSON 始终合法可读。每条问题结果以ProblemResult结构(idtypeproblemsolutionfinal_traceagent_evaluate_successboxed_answer_successimprovement_history)写入data['traces'],形成可直接用于 SFT 的数据集。

七、拒绝采样与答案一致性校验

对应文档 roadmap 中"集成拒绝采样"的规划,源码已实现该能力:rejection_sampling_n=N时,generate_reasoning_trace_rejection会一次生成 N 条候选轨迹(若底层模型配置支持n参数则单次调用返回多个候选,否则循环采样),逐条评估并计算平均分,优先选择达标且得分最高的轨迹;若无候选达标,则回退到平均分最高的候选。

此外,process_problem 收尾时会用solution_pattern/trace_pattern正则(默认\boxed{(.*?)})分别从标准答案与最终轨迹中提取最终答案做字符串比对,产出boxed_answer_success布尔标志——这是判断轨迹最终答案是否与 ground truth 一致的硬性校验,与评估得分(agent_evaluate_success)互为补充。

八、测试与验证

仓库为管线提供了完整的单元测试覆盖(test/datagen/test_self_improving_cot_pipeline.py),验证了以下关键行为:

  • 初始化默认值(max_iterations=3score_threshold=0.7)与批参数透传;
  • generate_reasoning_trace会先reset()step()
  • Agent 评估正确解析correctness/clarity/completeness/feedback四字段;
  • 奖励模型单分(归一到overall)与多分(维度原样透传)两种路径;
  • improve_trace的反馈注入行为;
  • 完整process_problem流程与improvement_history记录;
  • 字典形式score_threshold的逐维度判定。

这些测试既是行为契约,也方便你在接入自定义评估/奖励模型后快速回归验证。

九、CAMEL 在 CoT 数据生成上的下一步

文档同时披露了 CAMEL 在自改进 CoT 方向上的路线图:

  1. 实时监控仪表盘:可视化吞吐量、错误率、运行成本、数据质量等指标,支撑运营监控;
  2. 性能增强:进一步提升处理性能并强化错误处理,使系统更健壮;
  3. 前沿研究方案:持续整合合成数据生成领域的最新研究;
  4. 拒绝采样(Rejection Sampling):将拒绝采样方法正式融入SelfImprovingCoTPipeline(如上文所述,源码已先行实现)。

结语

CAMEL 的自改进 CoT 管线为思维链数据蒸馏提供了一套完整范式:

  • 灵活评估:Agent 评估与奖励模型评估双通道,适配不同场景的评分与反馈需求;
  • 持续改进:迭代精炼保证每条轨迹持续逼近期望质量;
  • 高效处理:批量并发在保证系统平衡的同时提升吞吐;
  • 稳定健壮:指数退避重试机制增强系统可靠性;
  • 一致输出:原子化动态文件写入确保部分结果始终被有效保留。

更进一步的实践,可继续阅读仓库内关联材料:使用 DeepSeek-R1 蒸馏数学推理数据的 self_improving_math_reasoning_data_distillation_from_deepSeek_r1.ipynb,以及 self_improving_cot.py 源码与两个官方示例脚本,亲手复现一套"生成—评估—精炼"的推理数据流水线。

【免费下载链接】camel🐫 CAMEL: The first and the best multi-agent framework. Finding the Scaling Law of Agents. https://www.camel-ai.org项目地址: https://gitcode.com/GitHub_Trending/ca/camel

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询