Day 34 / 共 68 天 · 阶段 6 Agent 核心

ReAct 模式:边想边做

昨天(Day 33)你知道了 Agent 主循环每圈先"想"再"做"。今天把这个"想"拆开,看它最经典、几乎所有 Agent 都在用的套路——ReAct(Reason + Act,推理 + 行动):让 Agent 把"思考 → 行动 → 观察"明明白白交替写出来。我们会读一条真实的 Agent 轨迹,搞懂为什么"逼它先想再做"能大幅提高靠谱程度。学完你就能看懂几乎任何 Agent 日志;明天(Day 35)升级到更宏观的"先规划再执行"。

📍 你在阶段 6(Agent 核心 D33-38)的位置
D33 Agent 是什么 D34 ReAct D35 规划 D36 记忆 D37 状态&断点 D38 手写最小 Agent
💡 用一个类比兜住今天(今天全程沿用「侦探破案」的世界观) 好侦探破案不是闷头乱抓人,而是边想边查:Thought(思考)=推理"凶手应该左撇子,我得去查嫌疑人惯用手";Action(行动)=真的去调档案、问证人;Observation(观察)=拿到线索"张三是左撇子";再回到思考"那重点查张三……"。一圈圈直到破案。ReAct 就是让 Agent 像侦探一样,把每一步的"内心独白(想)"和"实际动作(做)"都摊开来,而不是蒙着头直接下结论。今天你要学会读侦探的"办案笔记"。
L01

光"做"不"想"会翻车

🤔 痛点让模型直接"看到任务就调工具",它常常调错、调重、或漏掉判断——像新手侦探一见谁可疑就先铐起来,结果抓错人。为什么?因为它没停下来把思路捋一遍
💡 本质研究和实践都发现:让模型在动手前先用文字"把理由想出来",决策质量明显更高(这其实是 Day 17 思维链 CoT 的延伸——把"想"和"做"编织在一起)。ReAct 的名字就是 Reason(想) + Act(做):强制它每次行动前先写一句"我为什么要这么做"。侦探先推理再取证,比逮谁算谁靠谱得多。
📝 举个例子:不想 vs 先想 任务:"这两个城市哪个现在更热?"
不想直接做:一上来只查了北京,忘了查上海,直接回答"北京热"——漏了对比。
ReAct 先想:"要比较,得分别查两地气温,再对比。先查北京。"→ 查北京(28℃)→ "还需上海。"→ 查上海(31℃)→ "31>28,上海更热。"
那句"要分别查两地"的思考,救了这次回答
L02

ReAct 三拍:Thought / Action / Observation

🤔 痛点ReAct 到底规定了什么格式?我该让模型输出成啥样?
💡 本质就三个标签轮流出现,对应侦探的"想—查—得":
Thought(思考):一句内心独白——现在情况如何、下一步该干嘛、为什么。
Action(行动):点名要调的工具 + 参数(如 查天气(城市="上海"))。
Observation(观察):工具返回的结果(这一拍是你的代码填进去的,不是模型编的)。
然后回到 Thought,如此往复,直到某个 Thought 得出"够了",输出 Final Answer(最终答案)
ReAct 一圈:想 → 做 → 看(得到结果),再回到想 Thought模型:内心独白 Action模型:调哪个工具 Observation你的代码:填结果 带着新观察回到 Thought…直到想通→Final Answer
图注:关键分工——Thought/Action 是模型"吐"出来的,Observation 是你的程序执行工具后"塞"回去的。模型绝不能自己编 Observation!
👶 这和 Day 33 的"想→动手→看"是一回事吗?是!ReAct 就是给那三拍起了正式名字并规定了写法。Day 33 讲"循环长什么样",今天讲"每一拍具体写成啥格式、为什么要显式写出思考"。同一个循环,越看越熟——这是好事。
L03

一条真实轨迹:读懂侦探的办案笔记

🤔 痛点光说格式没感觉,来看一条完整的 ReAct 轨迹长什么样——这也是你以后天天要看的 Agent 日志。
💡 本质任务:"我们上周和上上周,哪周订单更多?"看 Agent 怎么一圈圈破这个"案子"👇(Observation 那几行是程序填的真实数据):
用户任务:上周和上上周,哪周订单更多?

Thought: 要比较两周,得分别查两周的订单数。先查上周。
Action:  query_orders(week="上周")
Observation: 1280 单                          ← 程序执行工具后填回

Thought: 上周 1280。还需要上上周的数据才能比。
Action:  query_orders(week="上上周")
Observation: 1050 单                          ← 程序又填回

Thought: 上周 1280 > 上上周 1050,上周更多,差 230 单。信息够了。
Final Answer: 上周订单更多(1280 单 vs 上上周 1050 单,多 230 单)。
读法:竖着扫一遍 Thought 就能看懂 Agent"想了啥、为啥这么走";出错时也顺着 Thought 找是哪一步想歪了——这就是 ReAct 最实用的好处:可读、可调试。你以后排查 Agent 问题,90% 时间在读这种轨迹。
📝 举个例子:出错的轨迹一眼看穿 若某条轨迹里出现 Thought: 上周 1280,够了 就直接 Final Answer——你一眼看出:它漏查了上上周就下结论。问题定位到具体某个 Thought,比对着一个只会说"结果不对"的黑盒好排查一万倍。
L04

为什么"先想"真能变强

🤔 痛点多输出几行"思考",不就是多费点 token?凭什么能让它更准?
💡 本质三个实打实的好处:
把大问题拆成小步——"要比较→得分别查→先查A"这种拆解,让模型每一步只需想清一件小事,不容易漏(呼应明天的"规划")。
让隐含判断显性化——它得写出"31>28 所以上海热",错误逻辑一写出来就容易被自己或你发现。
给你可调试的轨迹——出问题能定位到具体哪一步想歪(L03)。
本质是:逼模型"把思路说出来",相当于给它一块草稿纸,而人在有草稿纸时算数也更准。

👶 小白:那 Thought 会不会被用户看到?显得啰嗦?

👨‍🏫 老师:通常不给终端用户看——Thought/Action/Observation 是 Agent 的"内部办案笔记",只在日志/后台留存供你调试;给用户的只有最后那句 Final Answer。所以别担心啰嗦,内部想得越清楚,给用户的答案越靠谱。现在很多产品还会把思考过程折叠成"正在思考…"给用户瞄一眼,增加信任感,但那是产品选择,不是必须。

L05

常见坑与对策

🤔 痛点ReAct 用起来有哪些新手常踩的坑?提前知道能少走弯路。
💡 本质三个高频坑,记住对策即可:
现象对策
模型自己编 Observation它假装"查到了 1280",其实没真调工具严格分工:Observation 只能由你的代码填;检测到它自己编就打断
Thought 里就把活干了"我算了下是 1280"——没真调工具就下结论提示里强调"计算/查询必须用工具,不许口算"
陷入死循环反复 Thought→Action 同一个,不收敛设步数上限(Day 32);把已试过的记进历史让它别重复
👶 现在大多"自带 ReAct",还用手写格式吗?好消息:现在主流模型 + Function Calling(Day 29)已经把 ReAct 的"想和做"内建了——你给工具、它自己会先想再调、看结果再想,不用你手写 Thought: 这种文本模板。所以ReAct 更多是一种"思维框架"而非必须手抄的格式。理解它,是为了看懂 Agent 行为、写好提示、排查问题;真写代码时,交给 Function Calling 循环(Day 32 那套)即可。
L06

今日小结 + 动手 10 分钟

🧠 今天你应该能回答

  • ReAct 是哪两个词的缩写?对应侦探破案的哪三步?
  • Thought / Action / Observation 分别是谁产生的?(尤其:Observation 归谁填?)
  • 能顺着一条 ReAct 轨迹讲清 Agent 每步在干嘛、错在哪吗?
  • "先想再做"为什么能提升可靠性(说出至少两条)?
  • ReAct 三个常见坑及对策?为什么现在常说"它是思维框架而非手抄格式"?

✋ 动手 10 分钟:手写一条 ReAct 轨迹(你当模型的"想")

不用代码,拿这个任务,像 L03 那样把轨迹补全——你负责写 Thought/Action,Observation 我给你(模拟工具返回)。这是把 ReAct 刻进脑子的最快方法:

# 任务:北京今天适合洗车吗?(规则:今明两天都不下雨才适合)
# 可用工具:get_weather(city, day)  → 返回 "晴"/"雨"

# 请你补全 Thought 和 Action,Observation 已给:
Thought: ____(提示:要看今明两天,先查今天)
Action:  get_weather(city="北京", day="今天")
Observation: 晴

Thought: ____(今天晴,但规则要两天都不下雨,还得查明天)
Action:  ____
Observation: 雨

Thought: ____(明天有雨,按规则……)
Final Answer: ____

# 参考:最后应得出"不适合洗车(明天有雨)"。
# 体会:正是"规则要两天"这句 Thought,避免了只看今天就乱下结论。

做完再故意写一条"错误轨迹"(比如只查今天就下结论),然后指出它错在哪一句 Thought——练成这种"读轨迹揪错"的眼力,你排查 Agent 的能力就成了。

明日预告 · Day 35:ReAct 是"走一步想一步",适合探索型任务。但面对复杂大任务("做一份竞品调研报告"),边走边想容易迷路。明天学规划(Planning)与任务分解:让 Agent 先列一份计划、把大任务拆成子任务,再逐个击破——就像侦探先列侦查提纲,再按纲办案。
← Day 33 · Agent 到底是什么 Day 35 · 规划与任务分解 →