第4节:在 ReAct 循环中剥离独立的 Thinking 阶段

Agent Harness 专题

上一节:第3节:核心心脏,手写 Agent 的 Main Loop

本节:第4节:在 ReAct 循环中剥离独立的 Thinking 阶段

下一节:待更新

如果现在就把真实的前沿大模型接入这个基础循环,并且给它挂载上能够修改本地代码的 editbash 工具,你会遭遇一个极其普遍但又令人抓狂的现象:大模型变得极其"冲动"。

当你给它一个复杂的任务:"帮我分析整个订单模块的并发逻辑,并重构它"时。它可能连其他文件都没看,瞬间就发出了一个 edit 工具的调用请求,去盲目修改它看到的第一个文件。

这一讲,我们需要在底层架构上强制剥离出一个独立的Thinking慢思考阶段,可以让我们的Agent莽夫变成一个架构师

大模型的快慢思考

  • 系统 1(快思考) :直觉的、本能的、自动的。比如你看到 2+2 立刻就能想到 4

  • 系统 2(慢思考) :逻辑的、深思熟虑的、需要消耗精力的。比如让你计算 17 × 24,你必须拿出一张草稿纸,一步步推导。

提示词工程的破产与驾驭工程的解法

Chain of Thought(思维链,CoT) 技术这就相当于给了大模型一张"草稿纸",让它在输出最终答案前,先把中间推理过程写出来。

这就相当于给了大模型一张"草稿纸",让它在输出最终答案前,先把中间推理过程写出来。

但在 Agent 的工具调用(Function Calling)场景下,这种单纯的提示词工程彻底破产了。因为 AI 工程师在构建长程 Coding Agent 时,发现了一个致命的规律:

(当工具可用时,模型倾向于迅速采取行动,而不是深入思考。)

如果你在系统提示词里写:"请你先仔细规划,然后再调用工具"。大模型往往会无视这句话。只要它在上下文的 Schema 里看到了诱人的 bashedit 工具,它的预测概率就会瞬间坍塌,转而生成一段 JSON 参数去调用工具。

如何解决呢?既然提示词管不住它的"手",那我们就用架构锁住它的"手"!驾驭工程(Harness Engineering)给出的解法是:机制决定行为

在每一次大模型采取行动前,Harness 引擎会向它发起一次没有附带任何工具 Schema 的纯文本 API 请求。在这个绝对没有工具诱惑的"小黑屋"里,模型别无选择,只能乖乖地输出一段纯文本的深度推理与规划。

等它想清楚了,Harness 会把这段推理记录追加到上下文中,然后再发起第二次附带工具的请求,让它去执行。

这就是工业级 Agent 循环中的 Two-Stage ReAct(两阶段 ReAct 循环)。

Two-Stage ReAct 循环

代码实战:在 Main Loop 中剥离 Thinking 阶段

第 1 步:改造 AgentEngine,增加思维开关

第 2 步:重构 Main Loop,实现两阶段流转

运行与验证:升级 Mock Provider

复制代码

2026-05-11T20:13:35.518+08:00 INFO 70816 --- [ main] com.example.javaclaw.Main : 欢迎来到 my-claw 引擎启动序列 2026-05-11T20:13:35.519+08:00 INFO 70816 --- [ main] com.example.javaclaw.Main : 架构蓝图搭建完毕,等待各核心模块注入! 2026-05-11T20:13:35.519+08:00 INFO 70816 --- [ main] com.example.javaclaw.Main : ========= 2026-05-11T20:13:35.521+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine] 引擎启动,工作目录: D:\Code\Agent Harness\harness-learning 2026-05-11T20:13:35.522+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine] 慢思考模式是否启动: true 2026-05-11T20:13:35.522+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : ========== [Turn 1] 开始 ========== 2026-05-11T20:13:35.522+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine][Phase 1] 剥夺工具访问权,强制进入慢思考与规划阶段... 2026-05-11T20:13:35.523+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : 🧠 [内部思考 Trace]:【推理中】目标是检查当前目录文件。我不能直接查询,需要先计划并选择合适的工具。 2026-05-11T20:13:35.523+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine][Phase 2] 恢复工具挂载,等待模型采取行动... 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine][Action] 模型请求调用 1 个工具... 🤖 [对外回复]: 我要执行我刚才计划的步骤。 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : -> 🛠️ 执行工具: bash, 参数: {"command":"ls -la"} 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : -> ✅ 工具执行成功 (返回 51 字节) 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : ========== [Turn 2] 开始 ========== 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine][Phase 1] 剥夺工具访问权,强制进入慢思考与规划阶段... 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : 🧠 [内部思考 Trace]:【推理中】目标是检查当前目录文件。我不能直接查询,需要先计划并选择合适的工具。 2026-05-11T20:13:35.524+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine][Phase 2] 恢复工具挂载,等待模型采取行动... 🤖 [对外回复]: 根据工具返回的结果,我看到了 main.go,任务圆满完成! 2026-05-11T20:13:35.525+08:00 INFO 70816 --- [ main] c.example.javaclaw.engine.AgentEngine : [Engine] 模型未请求调用工具,任务宣告完成。

看到这里,你是否体会到了 Harness 驾驭工程的魅力?我们没有在 Prompt 里写一句"求求你先思考再行动",仅仅是通过在架构层面做了一次精妙的剥离拦截 ,大模型的行为范式就发生了根本性的翻覆。

反思:静态慢思考的局限性

我们目前在 AgentEngine 中引入的 EnableThinking 是一个静态的全局开关

只要在启动时传了 true,大模型在未来的几十轮(Turn)交互中,每一轮都必须先被关进"小黑屋"强制做一次纯文本的推理与规划(Phase 1),然后再去执行动作(Phase 2)。

对于诸如"帮我写一个 Web 服务器"这样复杂的开局任务,强制慢思考确实能极大地提升成功率。但是,当任务进行到中后期,大模型仅仅只是需要逐个完成一些简单微小的任务时,强制它做一次慢思考,不仅显得极其啰嗦,还会白白浪费大量的 API Token 成本和响应时间。

那么,如何才能让大模型在宏观上拥有长程的规划能力,而在微观执行上又能在简单任务时做到"免思考、极速响应"呢?

我们会在后面的记忆沉淀:引入 Plan Mode中揭晓,我们将探讨"慢思考"与"Plan 模式"的本质区别。

总结

今天,我们在上一讲基础 Main Loop 的框架内,完成了一次非常高级的架构重构。

  1. 洞察模型的"冲动"陷阱 :我们从理论上揭示了当工具 Schema 存在于请求上下文中时,大模型(作为系统 1)天生倾向于立刻采取行动,而忽视全局规划。提示词层面的约束对此收效甚微。

  2. 两阶段 ReAct (Two-Stage ReAct) :借鉴业界顶级框架的实践,我们在代码层面上强制将 ThinkingAction 物理拆分。

  3. 驾驭工程的四两拨千斤 :在具体实现时,我们通过在第一次调用 Provider 时传入 availableTools = nil,极其优雅地"逼迫"大模型输出纯文本的思考轨迹(Thinking Trace),并将其固化为接下来的上下文,利用其自回归特性引导精准的行动。

现在,这台引擎不仅有强健的心跳,更拥有了深邃的思考能力。但是,一直依赖 Mock 的假肢是没有成就感的。

相关推荐
ws2019071 小时前
从芯片到架构:AUTO TECH China 2026聚焦汽车计算新赛道
大数据·人工智能·科技·汽车
littlebigbar1 小时前
让AI自己说说,AI 智能体在软件测试中能做什么?
人工智能·测试工具
IT23101 小时前
国产OpenClaw产品崛起:博云BoClaw如何破解AI智能体的「安全与自主」双命题
人工智能·安全
小北的AI科技分享1 小时前
API管理的五种路径:五款工具的功能侧写与数据支撑
大数据·人工智能·api管理
展示猪肝1 小时前
Vue2 + FastAPI + Dify 实现 AI 医疗预检分诊助手:从问诊追问到医生审核闭环
人工智能·vue·fastapi·dify
容器魔方1 小时前
“驾驭工程”下一跳?JiuwenClaw AgentTeam开启“协同工程”全新范式
人工智能·云原生·容器·架构·开源
夕小瑶1 小时前
Codex上线手机端啦!免费用户可用
人工智能
极客老王说Agent1 小时前
2026供应商寻源新范式:实在Agent供应商寻源智能助理核心功能与落地案例深度解析
人工智能·ai·chatgpt
科智咨询1 小时前
2026 AI智能体落地纪实:谁在用?用在哪?
大数据·人工智能·科技·aigc