AI Agent 循环:Think-Act-Observe 的核心机制
AI Agent 的核心运行模式是一个不断重复的循环:思考(Think)、行动(Act)、观察(Observe)。理解这个循环,是理解一切 Agent 系统的基础。
什么是 Agent Loop?
一个 AI Agent 本质上是一个由 LLM 驱动的决策系统。它不是一次性输出答案,而是通过迭代循环逐步完成任务。每一轮循环中,Agent 会经历三个阶段:
Think → Act → Observe 循环:
┌─────────────┐
│ Think │ ← Agent 分析当前状态,决定下一步该做什么
│ (思考) │
└──────┬──────┘
↓
┌─────────────┐
│ Act │ ← Agent 执行一个动作(调用工具、生成文本等)
│ (行动) │
└──────┬──────┘
↓
┌─────────────┐
│ Observe │ ← Agent 获取动作的结果,更新对任务的理解
│ (观察) │
└──────┬──────┘
↓
判断是否完成?→ 是 → 输出最终结果
↑ 否
└── 回到 Think
这个循环的精妙之处在于:Agent 不需要一开始就制定完整的计划,而是通过每一步的观察来动态调整策略。
Think 阶段:推理与规划
在思考阶段,Agent 会分析当前的任务状态,决定下一步应该采取什么行动。这是 Agent 与普通 LLM 调用最核心的区别。
思考阶段的典型内容:
"我需要回答用户的问题:2024年诺贝尔物理学奖得主是谁?"
"我目前没有这个信息,需要搜索。"
"我应该先搜索 '2024 Nobel Prize Physics'。"
"搜索结果提到了 John Hopfield 和 Geoffrey Hinton。"
"我需要确认这是否完整,可能还需要搜索更多细节。"
思考过程可以是显式的(通过 CoT 链式思考),也可以是隐式的(模型内部决策)。显式思考有助于调试和理解 Agent 的行为。
Act 阶段:执行动作
根据思考的结果,Agent 会选择并执行一个具体动作。常见的动作类型包括:
| 动作类型 | 示例 | 适用场景 |
|---|---|---|
| 工具调用 | 搜索网页、执行代码、查询数据库 | 需要外部信息或计算 |
| 文本生成 | 撰写回答、生成代码 | 直接输出结果 |
| 子任务分解 | 将复杂问题拆分为子问题 | 复杂推理任务 |
| 交互询问 | 向用户请求更多信息 | 信息不完整时 |
# 动作选择的简化实现
def select_action(thought, available_tools):
"""
根据思考结果选择要执行的动作
"""
# LLM 根据当前状态决定动作
action = llm.predict(f"""
当前状态:{thought}
可用工具:{available_tools}
请决定下一步行动,输出 JSON 格式的动作。
""")
return parse_action(action)
Observe 阶段:获取反馈
执行动作后,Agent 会收到一个观察结果(Observation)。这个结果会被加入到 Agent 的上下文中,供下一轮思考使用。
观察的几种形式:
工具返回结果:
搜索 "2024 Nobel Prize Physics" →
"John J. Hopfield 和 Geoffrey E. Hinton 获得 2024 年诺贝尔物理学奖"
代码执行结果:
执行 "print(2**10)" → 输出 "1024"
错误信息:
执行 "fetch(url)" → "Error: Connection timeout"
用户反馈:
询问用户 → 用户回复 "我想要更详细的解释"
观察结果的质量直接决定了 Agent 的表现。如果工具返回的信息不准确或不完整,Agent 的后续决策也会受到影响。
ReAct 模式
ReAct(Reasoning + Acting)是将 Think-Act-Observe 循环形式化的经典框架。它要求 Agent 在每一步都生成显式的思考过程:
ReAct 格式示例:
问题:苹果公司的现任 CEO 是谁?他是什么时候上任的?
Thought 1: 我需要查找苹果公司的现任 CEO 信息。
Action 1: Search["苹果公司 现任 CEO"]
Observation 1: 苹果公司现任 CEO 是蒂姆·库克(Tim Cook),自 2011 年 8 月起担任该职务。
Thought 2: 我已经找到了答案。蒂姆·库克自 2011 年 8 月起担任苹果 CEO。
Action 2: Finish["苹果公司现任 CEO 是蒂姆·库克,于 2011 年 8 月上任。"]
Observation 2: 任务完成。
ReAct 的优势在于:思考过程是可审计的,你可以清楚地看到 Agent 为什么做出某个决策。
停止条件
Agent Loop 必须有明确的停止条件,否则会无限循环。常见的停止条件包括:
- 任务完成:Agent 判断已经获得了足够的信息或完成了目标
- 最大步数:达到预设的最大迭代次数(如 10 步、20 步)
- 工具失败:连续多次工具调用失败,Agent 决定放弃
- 用户中断:用户主动终止 Agent 的运行
- 成本限制:Token 消耗超过预算
# 带停止条件的 Agent Loop
def agent_loop(task, max_steps=10):
for step in range(max_steps):
thought = think(task, history)
if thought.action == "finish":
return thought.final_answer
if thought.action == "need_more_info":
info = ask_user()
history.append(observation(info))
continue
result = execute(thought.action)
if result.error and consecutive_failures > 3:
return "无法完成任务:工具连续失败"
history.append(observation(result))
return "达到最大步数限制,任务未完成"
常见失败模式
1. 无限循环
Agent 反复执行相同的操作而没有进展。通常发生在 Agent 无法从观察中获取新信息时。
失败示例:
Thought: 我需要搜索 X
Action: Search["X"]
Observation: 未找到结果
Thought: 我需要搜索 X
Action: Search["X"] ← 重复!
Observation: 未找到结果
...(无限循环)
2. 偏离目标
Agent 在多步推理后偏离了原始任务,开始处理不相关的事情。
3. 过早终止
Agent 在还没有收集足够信息时就过早地给出了最终答案。
4. 工具误用
Agent 选择了错误的工具,或者以错误的参数调用工具。
总结
AI Agent 的 Think-Act-Observe 循环是所有 Agent 系统的核心机制。通过不断迭代,Agent 能够逐步完成复杂任务,而不需要预先规划完整的执行路径。理解这个循环的工作原理和常见失败模式,是构建可靠 Agent 系统的第一步。