你打开一个 AI Agent 应用,输入一句“帮我整理这周的所有邮件,把重要事项列出来,然后发一封总结给老板”。然后你看着它开始“思考”,调用邮件 API 读取内容,汇总要点,写草稿,最后发送——整个过程没有你的干预。这背后,Agent 经历了一个感知→规划→执行→观察→调整的循环,这个循环像一个微型的认知引擎,驱动着它完成复杂任务。

我最早接触 Agent 时,以为它就是把 ChatGPT 的每次回答连起来,加上自动调用工具的能力。但后来我发现,真正的 Agent 循环远比这精妙,而且每一步都藏着容易让人栽跟头的坑。
这个循环不是“一步一步”的线性流水线
很多人把“感知→规划→执行→观察→调整”理解成依次执行的五个步骤,就像工厂流水线。但实际上,它是一个持续迭代的闭环——规划可能发生在执行中,观察可能触发重新感知,调整几乎同时发生在每一步。如果你把 Agent 的日志打印出来,你会发现这五个词是交织在一起的,根本没有清晰的“阶段”边界。
那为什么还要这样拆开?因为这样拆,你才能看清 Agent 到底在哪个环节容易出问题。
感知:Agent 怎么“看”世界?
感知不是简单地读一下用户输入。对 Agent 来说,感知的对象包括:用户输入、工具调用返回的结果、API 的响应码、系统时间、对话历史、甚至之前的错误信息。在 Lilian Weng 那篇著名的 Agent 综述中,感知被归入“工具使用”和“记忆”模块,但它本质上是把外部状态的原始数据转成语言模型能理解的上下文。
举个例子:你让 Agent 查天气,它调用天气 API,返回的是 JSON:{"city": "北京", "temperature": 22, "condition": "晴"}。感知这一步,会把这个 JSON 放进提示词里,变成“天气查询结果:北京今天 22 度,晴”。对 LLM 来说,这就是它的“所见”。
但感知有个最大的坑:Agent 看到的东西可能不完整,甚至被人为截断。如果 API 返回几千行数据,上下文窗口装不下,感知就会丢失关键信息。很多 Agent 莫名其妙地做错决策,不是因为“笨”,而是因为它在感知阶段就已经“瞎”了。
规划:把模糊目标拆成可执行的子任务
规划是 Agent 最像“人”的环节。一个完整的 Agent 不会直接执行用户指令,而是先在内部生成一个计划。这个计划可能是一串任务列表,也可能是一系列“思考-行动-观察”的推理链条。
ReAct 论文把这种模式概括为 Thought → Action → Observation 的循环,每一个 Thought 就是一次微规划。比如面对“查找苹果公司最新财报并总结”这个任务,Agent 的规划可能是:Thought: 我需要先搜索苹果 2024 年财报,可能用搜索引擎;Action: 搜索“Apple 2024 annual report”;Observation: 获得了几个链接;Thought: 第二个链接看起来是官方 PDF,但我需要提取文本,可能需要调用文档解析工具……
规划最让人意外的地方是:Agent 的规划能力并不来自专门的规划算法,而是来自 LLM 的推理能力。也就是说,AI 能不能做好规划,全看它语言模型本身的“脑子”好不好使。这导致一个很现实的问题:如果 LLM 在某个任务上推理能力弱,那 Agent 的规划就会一塌糊涂。比如你让它做数学题,它可能规划出完全错误的解题步骤。
我踩过一个坑:让 Agent 帮我自动整理 Markdown 笔记并按话题分类,它规划出来的第一步是“读取所有文件”,第二步是“分析内容”,第三步是“生成分类”。看起来很合理,但实际执行时,读取 100 个文件后上下文直接爆了,第二步就崩溃了。这说明规划不能脱离资源限制,而 LLM 很难在规划时主动考虑上下文窗口这种“非语言”的约束。
执行:把想法变成动作,副作用不可逆
执行就是 Agent 调用工具、发送 HTTP 请求、写文件、发邮件等等。这个环节的核心不是“动作本身”,而是动作的结构化描述。在 LangChain 的 Agent 框架中,执行被抽象为 JSON 格式:{"action": "search", "action_input": "Apple 2024 财报"}。Agent 不直接操作工具,它输出这个 JSON,然后由执行器真正调用工具。
这种设计的好处是解耦了“决策”和“操作”,坏处是执行失败时,Agent 可能完全不知道发生了什么。比如你让它发一封邮件,它输出了正确的 JSON,但邮件服务器宕机了,执行器返回一个错误码。这个错误码会进入下一轮的“观察”,但 Agent 能不能理解这个错误,并做出正确的调整,就另说了。
执行还有一个反直觉的事实:Agent 有时候会“执行”一些它自己都不知道是什么的动作。比如一些 Agent 框架允许动态生成代码并执行,这相当于把执行权限完全下放给了 LLM。我见过一个 Agent 在调试时,为了测试某个 API,自己写了一段 Python 代码去疯狂请求,差点打爆了我的本地服务。所以执行这一步,权限控制远比想象中重要。
观察:不只看结果,还要看“元信息”
观察通常被理解为“看工具返回了什么”,但真正的观察要复杂得多。它要捕捉的不仅是返回内容,还包括:成功还是失败?耗时多久?返回的数据量有多大?有没有异常? 这些“元信息”决定了 Agent 接下来是继续执行,还是调整计划,还是直接放弃并向用户求救。
在 ReAct 的框架里,Observation 就是 Action 之后的环境反馈,它会被直接注入到下一个 Thought 的上下文中。所以观察的质量直接把控着整个循环的生命线。如果观察信息被简化(比如只返回“成功”二字),Agent 就失去了调整的依据,很容易陷入”重复执行—重复失败“的死循环。
我看过很多 Agent 的失败案例,根源都是观察环节太粗糙。比如一个 Agent 调用文件搜索 API,返回了一堆文件路径,但没返回文件大小和修改时间,结果 Agent 就对着一个 2GB 的视频文件反复尝试读取,每次都超时,每次都重试,像一只撞玻璃的蜜蜂。
调整:循环的灵魂,也是最容易“装死”的环节
调整就是 Agent 根据观察结果,修正自己的计划或行为。在 ReAct 循环中,调整表现为下一个 Thought 根据 Observation 做出改变:“上一次搜索没找到,我换个关键词试试”;在 AutoGPT 这类面向任务的 Agent 中,调整体现为任务列表的动态更新——AutoGPT 会在每次执行后重新评估任务优先级,甚至删除已完成或无效的任务。
但调整这一步,恰恰是 Agent 最容易“装死”的地方。你可能会看到 Agent 在日志里不断输出“我调整了策略”,但实际行为根本没变。这是因为LLM 的调整往往只是语言层面的,而不是真正的策略变更。它可能只是换了一种说法,而不是换了一个动作。
真正有效的调整,需要 Agent 在规划阶段就预设“如果失败,则尝试 B 方案”的备选路径。一些高级的 Agent 框架(如 BabyAGI 的改进版)会尝试在提示词中注入“反思”机制,让 Agent 回过头去检查之前的决策是否合理。但就算这样,调整的深度依然受限于 LLM 的推理深度——它不可能像人类一样,从失败中归纳出新的通用规则,只能针对当前这一条观察做局部修正。
一个具体例子:ReAct 循环的完整演绎
我们来看一个从 ReAct 论文中抽出的真实示例,你会更直观地感受这五个词是怎么交织的。任务:回答“卢浮宫的面积是多少?”
- Thought: 我需要搜索卢浮宫的基本信息,找面积数据。
- Action: search[卢浮宫]
- Observation: [搜索结果] 卢浮宫是法国巴黎的博物馆,占地 60,600 平方米……
- Thought: 搜索结果已经给出了面积 60,600 平方米,但我要确认这个数字是否准确,最好再查一个权威来源。
- Action: lookup[卢浮宫 面积]
- Observation: [维基百科片段] 卢浮宫面积 72,735 平方米(包括地下空间)
- Thought: 两个数字不一样,需要判断哪个更可信。第一个是占地面积,第二个可能包含了建筑总面积。问题问的是“面积”,通常指占地面积,但为避免歧义,我同时给出两个数字并解释。
- Action: finish[卢浮宫占地面积约 60,600 平方米,若包含地下空间则约 72,735 平方米。]
在这个过程里,感知(搜索结果的文本)、规划(决定再查一次)、执行(调用 search 和 lookup)、观察(数字冲突)、调整(给出解释性答案)全部融合在 8 个步骤中,没有哪个是孤立的。
为什么 Agent 循环经常“卡死”
如果你跑过 Agent 的长时间任务,你一定会遇到“转圈圈”的情况——Agent 反复执行同一个动作,或者不断重新规划但永远不进入执行。根源通常在这几个点:
- 上下文窗口过载:循环越长,历史信息越多,最终超出窗口,Agent 开始“遗忘”早期计划,陷入混乱。
- 观察信息不足:工具返回的信息太简单,Agent 无法判断是否成功,于是重复尝试。
- 规划与执行脱节:LLM 生成的规划很漂亮,但执行时工具根本不支持那个操作,Agent 却不会主动降级到更简单的方案。
- 缺乏终止条件:Agent 不知道什么时候该停。它可能无限地“再优化一下”,直到被强制中断。
这些问题都不是靠“更好的提示词”就能完全解决的,它们触及了 LLM 作为 Agent 大脑的根本局限:没有真正的世界模型,没有长期记忆,没有对“成本”的感知。
一张表说清人类认知和 Agent 循环的差距
| 维度 | 人类 | 今日 AI Agent |
|---|---|---|
| 感知 | 多模态、主动选择注意力 | 依赖文本上下文,被动接收 |
| 规划 | 可抽象、可类比、受资源约束 | 基于语言模型推理,不考虑资源 |
| 执行 | 精细肌肉控制,可随时终止 | 工具调用,副作用不可逆 |
| 观察 | 自动过滤无关信息,理解深层含义 | 只看到返回的文本,易忽略元信息 |
| 调整 | 从失败中学习,形成通用策略 | 局部修正,不会泛化经验 |
这张表不是要贬低 AI,而是要让你看清Agent 循环的边界在哪里。当你知道它不会“从失败中学习”,你就不会让它去处理可能造成实际损失的操作;当你知道它的感知是文本盲盒,你就会在工具设计时尽可能返回丰富的元信息。
“We propose ReAct, a simple yet effective method for synergizing reasoning and acting in language models … ReAct overcomes prevalent issues of hallucination and error propagation in reasoning tasks by interacting with a simple Wikipedia API.” —— ReAct 论文,这也是为什么 Agent 循环会从实验室走向工程实践。
最后说一句我自己的反思:当我真正理解了 Agent 循环的每一步后,我再也不把 Agent 当成“自动化员工”了。它更像一个需要精心设定观察窗口、随时准备接管、并且永远别让它碰到危险操作的工具。感知、规划、执行、观察、调整,这五个词描述的不是一个智能体,而是一个精心搭建的、在可控范围内运转的反馈系统。它离“智能”还很远,但离“有用”已经足够近了。
进阶阅读:Agent 架构背后的论文与项目
- ReAct: Synergizing Reasoning and Acting in Language Models —— 奠定“思考-行动-观察”循环的经典论文。
- LLM Powered Autonomous Agents —— Lilian Weng 的万字长文,系统梳理 Agent 的规划、记忆、工具使用。
- AutoGPT —— 让任务驱动型 Agent 走进大众视野的开源项目。
- BabyAGI —— 极简的自主任务管理 Agent,只有几百行代码,很适合理解循环本质。
原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/57.html