ChatDev Thinking 模块深度解析:为 Agent 节点注入自省与反思能力

发布时间:2026/9/10 3:31:19

ChatDev Thinking 模块深度解析:为 Agent 节点注入自省与反思能力 ChatDev Thinking 模块深度解析为 Agent 节点注入自省与反思能力【免费下载链接】ChatDevChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration项目地址: https://gitcode.com/GitHub_Trending/ch/ChatDev本指南围绕 ChatDev 2.0LLM 驱动的多智能体协作框架中的 Thinking 模块展开讲解如何为 Agent 节点配置基于reflection的推理增强能力使模型在生成结果前后进行额外推理、自我审视并改进输出。读完本文你将掌握 Thinking 模块的架构分层、YAML 配置方式、内置反思模式的执行原理、与 Memory 的协作机制以及如何注册自定义 Thinking 模式。1. Thinking 模块定位在 Agent 节点的什么位置工作Thinking 模块是 ChatDev 2.0 为 Agent 节点提供的推理增强能力它允许模型在正式生成结果之前或之后额外地执行一次推理。典型的场景是自反思self-reflection——模型先生成一份初步回答再基于反思提示词审视自己的输出并给出改进版本最后以改进后的内容作为节点输出。从代码结构看该模块由三层构成配置层ThinkingConfig声明在 YAML 的nodes[].config.thinking下包含type与config两个字段见 entity/configs/node/thinking.py。管理器层ThinkingManagerBase是抽象基类定义了_before_gen_think与_after_gen_think两个时机的思考逻辑见 runtime/node/agent/thinking/thinking_manager.py。注册层通过register_thinking_mode()注册新的思考模式注册的同时会同步 Schema API使前端可视化配置界面自动展示可选模式见 runtime/node/agent/thinking/registry.py 与 schema_registry/registry.py。在 entity/configs/node/agent.py 的AgentConfig中thinking: ThinkingConfig | None None是一个可选字段且被标记为advanceTrue高级配置。这意味着不配置thinking时 Agent 节点照常工作只有显式声明后才启用推理增强。2. 架构分层与执行时机2.1 三个核心组件ThinkingConfig配置YAML 中nodes[].config.thinking的结构化表示。外层ThinkingConfig只负责承载type字符串与内层config对象type决定使用哪种已注册的思考模式config则是该模式专属的参数字段。在ThinkingConfig.from_dict中type会被送到get_thinking_schema()校验不支持的 type 会抛出ConfigError: unsupported thinking type xxx。ThinkingManagerBase管理器抽象基类构造时接收ThinkingConfig默认关闭两个开关self.before_gen_think_enabled False self.after_gen_think_enabled False子类按需开启。同时暴露thinking_concat_prompt默认{origin}\n\nThinking Result: {thinking}当思考结果不需要整体替换时会用该模板将原始内容与思考结果拼接。Registry注册中心register_thinking_mode()把模式名 → 配置类 管理器类登记进thinking_registry同时调用register_thinking_schema()将配置类同步到 Schema 注册表。因此 Schema API前端表单、设计模板导出能自动感知新增模式。2.2 两个执行时机时机开关属性用途生成前before_genbefore_gen_think_enabled在调用模型 API 之前执行思考用于输入预处理生成后after_genafter_gen_think_enabled在模型输出之后执行思考用于后处理或精炼内置的reflection模式只启用生成后思考after_gen_think_enabled True扩展开发者可以根据需求实现生成前思考。2.3 思考结果的三种返回策略ThinkingManagerBase.think()是统一入口逻辑如下生成前思考调用_before_gen_think()返回(think_result, replace_input)。若replace_inputTrue直接用思考结果替换原始输入否则用thinking_concat_prompt拼接。生成后思考调用_after_gen_think()返回(think_result, replace_gen)。若replace_genTrue直接用思考结果替换模型原始输出内置 reflection 即此行为否则拼接。未命中任何开关原样返回输入或生成内容优先raw字段。3. 配置示例与参数说明3.1 最小可运行配置以下 YAML 声明了一个启用 reflection 反思的 Agent 节点完整结构可参考 yaml_instance/demo_simple_memory.yamlnodes: - id: Thoughtful Agent type: agent config: provider: openai name: gpt-4o api_key: ${API_KEY} thinking: type: reflection config: reflection_prompt: | Please carefully review your response, considering: 1. Is the logic sound? 2. Are there any factual errors? 3. Is the expression clear? Then provide an improved response.字段说明字段类型必填说明thinking.typestring是思考模式类型当前内置reflection需与已注册模式名一致thinking.configobject是模式专属配置体reflection模式下必须包含reflection_promptthinking.config.reflection_promptstring是引导模型反思的提示词指定反思维度与期望的改进方向注意三点thinking.config块不能缺省。ThinkingConfig.from_dict在config缺失或为None时直接抛出ConfigError。${API_KEY}、${BASE_URL}等占位符由环境变量解析配置经 utils/env_loader.py 加载。在demo_simple_memory.yaml中可以看到一个真实用例写作 Agent 生成文章后通过 reflection 提示词Extract the first sentence of each paragraph, do not output anything else.将完整文章收敛为每段首句摘要直接体现生成后反思 → 结果替换的典型玩法。3.2 与 Memory 配置的组合示例nodes: - id: Writer With Reflection type: agent config: provider: openai name: gpt-4o base_url: ${BASE_URL} api_key: ${API_KEY} params: temperature: 0.1 max_tokens: 4000 tooling: [] thinking: type: reflection config: reflection_prompt: | Review your article and fix grammar, logic and factual errors, then output the improved full article. memories: - name: Paper Gen Memory top_k: 2 retrieve_stage: - gen这里的memories让反思阶段可检索历史记忆详见第 5 节。4. 内置模式Reflection 自反思4.1 执行流程reflection模式由SelfReflectionThinkingManager实现见 runtime/node/agent/thinking/self_reflection.py其注释说明该实现借鉴自 ChatDev 并做了适配。完整执行流程Agent 节点调用模型生成初始回答ThinkingManager将对话历史system 角色、用户输入、模型输出拼接为反思上下文使用reflection_prompt再次调用模型生成反思结果反思结果替换原始输出作为节点最终输出replace_genTrue。4.2 内部实现细节self.base_prompt Here is a conversation between two roles: {conversations} {reflection_prompt} self.reflection_prompt config.reflection_prompt or Reflect on the given information and summarize key points in a few words._after_gen_think构造的对话上下文为SYSTEM: {agent_role} USER: {input_payload.text} ASSISTANT: {gen_payload.text}若检索到 Memory则memory.text会作为首条消息前置到对话中。最终以一条 USER 消息base_prompt 模板调用agent_invoker完成一次模型调用返回(reflection_message.text_content(), True)——注意第二个返回值True表示用反思结果整体替换模型原始输出而非拼接。4.3 应用场景写作精修自动自查语法与逻辑问题后输出修订稿代码评审代码生成后自动进行安全性与质量检查复杂推理对多步推理结果进行校验与修正。5. 执行时机在 Agent 节点中的真实调用链从 runtime/node/executor/agent_executor.py 的AgentNodeExecutor.execute()可以看到 Thinking 在节点执行流水线中的确切位置构造输入ThinkingPayload_build_thinking_payload_from_inputs若配置了agent_config.thinking先调用_apply_pre_generation_thinking阶段PRE_GEN_THINKING_STAGE执行 Memory 检索_apply_memory_retrieval阶段GEN_STAGE调用模型生成_invoke_provider处理工具调用循环若模型返回 tool calls若配置了 thinking对模型输出构造gen_payload并调用_apply_post_generation_thinking阶段POST_GEN_THINKING_STAGE其返回值直接决定节点最终输出更新 Memory 存储_update_memory。两个应用函数都通过self.context.get_thinking_manager(node.id)获取管理器见 runtime/node/executor/base.py并在log_manager.thinking_timer中计时、通过record_thinking_process记录思考过程便于在运行日志中追踪每次反思的输入输出。值得注意的细节反思阶段使用的agent_invoker是执行器在节点上下文内构建的模型调用闭包_build_agent_invoker它复用同一 provider、client 与 call_options因此反思调用与主生成调用共享相同的重试策略与 token 追踪_invoke_provider内部统一处理。5.1 ThinkingPayload 与多模态支持ThinkingPayloadruntime/node/agent/thinking/thinking_manager.py是贯穿整个思考流程的数据容器字段说明text当前阶段的文本内容blocks多模态内容块图片、附件等来自输入消息或模型输出metadata附加元数据如来源inputs/model_output/memoryraw原始对象原始消息或文本未命中开关时原样返回执行器通过_build_thinking_payload_from_message(..., sourcemodel_output)将模型输出包装为gen_payloadMemory 检索结果则通过_memory_result_to_thinking_payload转换为memory参数传入思考函数使反思可以引用历史记忆。6. 与 Memory 的协作Thinking 模块可以访问 Memory 上下文具体路径为在 Agent 节点执行中_apply_pre_generation_thinking与_apply_post_generation_thinking都会先调用_retrieve_memory()检索结果经_memory_result_to_thinking_payload()转成ThinkingPayloadtext为检索结果的formatted_textblocks包含输入/输出快照的多模态块该 payload 作为memory参数传给thinking_manager.think()最终进入_before_gen_think/_after_gen_think。在SelfReflectionThinkingManager._after_gen_think中if memory and memory.text: conversations [memory.text] conversations即若反思阶段检索到历史记忆记忆文本会被前置到对话上下文让模型在反思时参考历史信息例如用户偏好、历史生成规范。配合memories配置如demo_simple_memory.yaml中top_k: 2、retrieve_stage: [gen]可让反思过程有据可依。关于 Memory 模块的更多配置参见 Memory 模块指南。7. 自定义 Thinking 模式扩展Thinking 模块的设计目标是可插拔新增一个思考模式只需四步。7.1 第一步定义配置类继承BaseConfig声明模式所需字段from entity.configs.base import BaseConfig, ConfigFieldSpec, require_str from typing import Mapping, Any class MyThinkingConfig(BaseConfig): my_prompt: str classmethod def from_dict(cls, data: Mapping[str, Any], *, path: str) - MyThinkingConfig: mapping require_mapping(data, path) return cls(my_promptrequire_str(mapping, my_prompt, path), pathpath) FIELD_SPECS { my_prompt: ConfigFieldSpec( namemy_prompt, display_nameMy Prompt, type_hintstr, requiredTrue, descriptionPrompt used for my thinking mode, ) }7.2 第二步实现管理器继承ThinkingManagerBase按需实现_before_gen_think或_after_gen_thinkfrom runtime.node.agent.thinking.thinking_manager import ( ThinkingManagerBase, AgentInvoker, ThinkingPayload, ) class MyThinkingManager(ThinkingManagerBase): def __init__(self, config: MyThinkingConfig): super().__init__(config) self.after_gen_think_enabled True # 启用生成后思考 self.my_prompt config.my_prompt def _before_gen_think(self, agent_invoker, input_payload, agent_role, memory): ... def _after_gen_think(self, agent_invoker, input_payload, agent_role, memory, gen_payload): message agent_invoker([Message(roleMessageRole.USER, contentself.my_prompt)]) return message.text_content(), True两个抽象方法的返回值约定见 thinking_manager.py 的文档字符串_before_gen_think返回(思考结果, 是否替换原始输入);_after_gen_think返回(思考结果, 是否替换原始生成内容)。7.3 第三步注册模式from runtime.node.agent.thinking.registry import register_thinking_mode register_thinking_mode( my_thinking, config_clsMyThinkingConfig, manager_clsMyThinkingManager, summaryCustom thinking mode description, )注册时若模式名已存在会抛出RegistryError。注册动作同时写入 Schema 注册表schema_registry/registry.py 的register_thinking_schema因此前端可视化工作台与设计模板会自动展示该模式及其字段。7.4 第四步导出设计模板运行以下命令更新前端选项python -m tools.export_design_template脚本位于 tools/export_design_template.py它从 Schema 注册表导出设计模板供前端表单与配置界面消费。内置模式的注册参考 runtime/node/agent/thinking/builtin_thinking.pyThinkingManagerFactory.get_thinking_manager()依据config.type从注册中心取出对应的 manager_cls 并注入类型化配置工厂逻辑也位于该文件。8. 最佳实践控制反思轮数当前 reflection 为单轮反思如需多轮迭代请在reflection_prompt中显式要求例如请重复审查直到通过所有检查项或在工作流中串联多个带反思的 Agent 节点参见 ChatDev_v1.yaml 的多 Agent 编排思路。提示词保持精炼过长的reflection_prompt会显著增加 token 消耗聚焦最重要的改进点即可。与 Memory 结合把重要反思结果写入 Memory供下游节点复用避免重复反思。监控成本反思会带来额外一次模型调用建议配合 token 追踪执行器中的token_tracker见 utils/token_tracker.py观察每个 Agent 节点的实际消耗同理也可利用 Agent 节点配置 中的retry策略保证反思调用的稳定性。复用共享的 agent_invoker反思调用复用节点主调用的 provider、client 与 call_options因此重试与限流配置对反思同样生效无需单独配置。9. 相关文档Agent 节点配置Memory 模块工作流编写指南【免费下载链接】ChatDevChatDev 2.0: Dev All through LLM-powered Multi-Agent Collaboration项目地址: https://gitcode.com/GitHub_Trending/ch/ChatDev创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 3:31:19

嵌入式分散加载实战:STM32内存布局与链接脚本详解

做嵌入式这几年,如果要我挑一个“学的时候觉得枯燥,用起来真香,出了问题掉头发”的知识点,分散加载绝对排前三。很多朋友在STM32裸机或者RTOS项目里一直用默认的链接配置,直到某天自绘PCB换了颗外部SDRAM、或者要给Boo…

2026/9/10 3:31:19

STM32 PWM调光实战:从TIM3配置到LED呼吸灯与RGB混色

简介:这套压缩包以STC12C2052单片机为核心,完整演示了利用PWM脉宽调制技术调节LED灯亮度的过程,面向单片机初学者和电子爱好者,用于学习无级调光、占空比概念及PWM模块配置。包内共55个文件,以C源码、Keil工程&#xf…

2026/9/10 3:31:19

C++实现AVL树:旋转操作、插入删除与验证全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 4:41:26

硬件应届生核心竞争力:工具实操、故障归因与成本意识

1. 招聘启事里没写的“真实需求清单”“硬件工程师(应届)”——这行字在招聘网站上出现的频率,可能比你每天喝的咖啡次数还高。但真正点开详情页,你会发现:JD(职位描述)写得像一份通用说明书&am…

2026/9/10 4:41:26

CANN/ge融合Pass捕获张量示例

Sample Usage Guide 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Tensor…

2026/9/10 4:41:26

AB编码器测速全解析:原理、定时器配置与工程实战

作为一个常年跟电机、小车、自动化设备打交道的嵌入式工程师,我对 AB 编码器测速这个需求再熟悉不过了。不管你是做平衡车、AGV、机械臂关节还是简单的循迹小车,只要涉及到闭环控制,速度反馈就绕不开编码器。而增量式 AB 编码器,基…

2026/9/10 4:36:26

如何在 ESP-IDF 中快速获取 WiFi TSF 时间戳:一份完整指南

如何在 ESP-IDF 中快速获取 WiFi TSF 时间戳:一份完整指南 【免费下载链接】esp-idf Espressif IoT Development Framework. Official development framework for Espressif SoCs. 项目地址: https://gitcode.com/GitHub_Trending/es/esp-idf 想在 ESP-IDF 项…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/8 7:15:15

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/7 16:23:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码