Skip to main content

Agent:思考-行动-观察循环

Agent 是一种能够基于目标进行"思考-行动-观察"循环、能够自主调用工具来完成复杂任务的智能系统。Agent 本质上是对人类的模拟。

Agent 的核心定义

什么是真正的 Agent?

提示词 + LLM + Tools ≠ Agent

**三个本质差异:

简单问答 → 单次交互,任务完成

真正的 Agent:

  • 🧠 有目标导向
  • 🔄 有自主循环
  • 🛠️ 能自主决策调用工具
  • 📝 能从结果中学习调整

Agent 的本质:像实习生一样工作

理解 Agent 最直观的方式,是把它和一个刚入职的实习生对比。做一个类比:

假设你把实习生叫过来,丢一个明确的目标和所有需要的材料给他,就期望他自己 run 起来——可能吗?

实习生会怎么做

  • 拿到任务目标 → 自己想办法做计划
  • 结合手上工具和资源 → 边做边推进
  • 过程中可能遇到:环境跑不通、接口报错、不会配置……
  • 遇到问题会去看错误信息 → 调整 → 继续
  • 这是一个循环:目标 → 行动 → 观察 → 调整 → 继续

Agent 模拟的正是这个循环

这本质上是人类在思考自己的任务目标、再根据目标进行行动、在观察自己的行动的结果,在这个不断与环境进行交互的过程中去逐步达成你的计划。

这也是为什么 ReAct 论文是 Agent 领域的奠基之作——"思考-行动-观察"的循环定义了一切的起点。后面所有的多 agent、设计模式、workflow 框架,万变不离其宗。

Agent 的三个核心特征:

特征说明
自主性不需要人一步步引导,自己决定下一步做什么
目标导向始终朝着最终目标前进,不会跑偏了会调整
适应性根据环境反馈动态调整策略,遇到问题会尝试不同方法

Agent Loop:思考-行动-观察循环

经典 ReAct 框架

【论文】ReAct:Reasoning与Acting协同,让Agent边想边做的奠基之作

把 Thought → Action → Observation 三元组循环落到同一段 prompt 里,是 Agent Loop 最早也最经典的范式(arXiv 2210.03629)

ReAct(Reason + Act)是最经典的 Agent 工作模式:

3PMmiJ
用户问题

🔍 **思考(Thought):
分析当前状态,决定下一步做什么

⚡ **行动(Action):
选择并执行具体操作

👁️ **观察(Observation):
获取行动的结果

回到思考 → 行动 → 观察 ...
↓ (循环直到目标达成)
最终回答

ReAct工作原理

ReAct的工作流程可分为“初始化-循环迭代-终止输出”三个阶段,每个阶段的核心操作与逻辑衔接如下,完整展现TAO闭环的动态执行过程:

eDaFit

完整循环示例

用户:帮我看看这个项目的测试覆盖率怎么样

🔍 思考:用户想了解项目测试覆盖率。首先我需要找到测试相关的配置文件,然后运行测试生成覆盖率报告。

⚡ 行动:
Action: find_files
Action Input: pattern: package.json | pyproject.toml | requirements.txt

👁️ 观察:找到 package.json,里面有 test:coverage 脚本

🔍 思考:好的,有覆盖率脚本。让我运行它来获取覆盖率数据。

⚡ 行动:
Action: run_command
Action Input: command: npm run test:coverage

👁️ 观察:测试覆盖率报告生成,总体覆盖率 68%,其中:
- utils.js: 95% ✓
- auth.js: 45% ✗
- api.js: 30% ✗

🔍 思考:覆盖率偏低,特别是 auth 和 api 模块覆盖率很低。让我看看这两个文件没覆盖的部分是什么。

⚡ 行动:
Action: read_file
Action Input: path: coverage/lcov-report/index.html

👁️ 观察:auth.js 中登录验证逻辑没测试;api.js 中错误处理没测试。

🔍 思考:我现在有足够信息了。总结一下给用户。

【最终回答】
你的项目测试覆盖率情况:68%

主要问题:
1. auth.js 登录验证逻辑完全没测试
2. api.js 错误处理分支没测试

建议优先补充这两部分的测试用例。

循环的四个关键环节

1. 思考阶段(Reasoning)

**核心任务:

  • 评估当前距离目标还有多远
  • 分析已经获取到的信息够不够
  • 决定下一步应该做什么
  • 预判可能遇到的问题

优秀思考的特征

  • ✅ 具体,不是空泛的
  • ✅ 有明确的下一步计划
  • ✅ 会反思之前的行动是否有效
  • ✅ 会考虑有没有更好的方案

2. 行动阶段(Acting)

核心任务

  • 选择最合适的工具
  • 生成正确的调用参数
  • 执行具体操作

行动设计原则

  • 一次只做一件事
  • 操作要具体可验证
  • 失败要有备选方案

3. 观察阶段(Observing)

核心任务

  • 准确获取行动结果
  • 提取关键信息
  • 过滤噪声

观察的技巧

  • 结果太长时做摘要
  • 失败时记录错误信息
  • 注意隐含的信息也要捕捉

Agent 循环的终止条件

正常终止

✅ 目标达成

当 Agent 判断已经获取足够信息,可以完成任务了。

判断依据

  • 所有子任务都已完成
  • 所需信息都已收集
  • 可以给出最终答案

异常终止

❌ 无法继续

**达到最大步数限制

防止无限循环,通常设置 10-50 步的上限。

常见卡住场景

  • 反复调用同一个工具没有进展
  • 工具持续失败,没有其他方案
  • 进入死循环:A→B→A→B...

改进版 Agent Loop

加入反思环节

在每次循环中加入自我审查:

思考 → 行动 → 观察 → **反思** → 下一轮

这个方向对吗?
有没有更好的方法?
是不是走错路了?

加入记忆系统

短期记忆:当前任务的历史记录

长期记忆:从过去任务中学到的经验

加入规划能力

大目标
↓ 分解
子目标 1 → 子目标 2 → 子目标 3

逐个完成

最简单的 Agent 实现

纯 Python 实现(50 行代码:

from openai import OpenAI

client = OpenAI()

def simple_agent(question: str, max_steps: int = 10):
messages = [{"role": "user", "content": question}]

for step in range(max_steps):
# 思考 + 行动
response = client.chat.completions.create(
model="gpt-4",
messages=messages,
tools=AVAILABLE_TOOLS
)

message = response.choices[0].message

if not message.tool_calls:
# 没有工具调用,任务完成
return message.content

# 执行工具
for tool_call in message.tool_calls:
result = execute_tool(tool_call)

# 观察:把结果加回上下文
messages.append(message)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": result
})

return "达到最大步数限制"

Agent Loop 是智能的"发动机"。一次问答是"条件反射,循环才是"思考"。

参考资料