Skip to main content

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

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

Agent 的核心定义

什么是真正的 Agent?

提示词 + LLM + Tools ≠ Agent

**三个本质差异:

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

真正的 Agent:

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

### Agent 的三个核心特征:

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

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

### 经典 ReAct 框架

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

用户问题 ↓ 🔍 **思考(Thought): 分析当前状态,决定下一步做什么 ↓ ⚡ **行动(Action): 选择并执行具体操作 ↓ 👁️ **观察(Observation): 获取行动的结果 ↓ 回到思考 → 行动 → 观察 ... ↓ (循环直到目标达成) 最终回答


### 完整循环示例

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

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

⚡ 行动: 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 行代码:

```python
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 是智能的"发动机"。一次问答是"条件反射,循环才是"思考"。