Ch14 Agent原理
Agent 原理与 ReAct
一句话理解
Agent = 感知 (Perceive) + 思考 (Think) + 行动 (Act) + 观察 (Observe) 的自主循环系统。Agent 不是”被程序控制的工具”,而是”能自主决策和执行的数字实体”——它感知环境、推理下一步、执行动作、观察结果,然后根据观察调整策略,持续循环直到完成任务。
核心概念
Agent 的定义
Agent 是一个能够自主感知环境、做出决策、执行动作并从结果中学习的系统。与传统的程序不同,Agent 的决策者不是”人预先编写的逻辑”,而是”模型在运行时的推理”。
Agent 的四个核心能力
| 能力 | 英文 | 说明 | 本 Vault 中的实现 |
|---|---|---|---|
| 感知 | Perceive | 获取环境信息:文件系统、API响应、用户输入 | 读取 .md 文件、导航文件夹结构 |
| 思考 | Think | 推理下一步:分析信息、分解任务、制定计划 | 分析摘要、判断需要哪些全文 |
| 行动 | Act | 执行动作:调用工具、读写文件、发送消息 | 读取文件、创建笔记、调用 MCP 工具 |
| 观察 | Observe | 评估结果:检查输出、验证正确性、调整策略 | 检查读取结果、判断信息是否足够 |
ReAct 循环的完整工作流
ReAct (Reasoning + Acting) 是 Agent 的核心执行模式。它不是简单的”推理→行动”,而是”推理→行动→观察→推理→行动→观察→…”的持续循环。
ReAct 循环的四个阶段
┌──────────────────────────────────────────────────┐
│ ReAct 循环 │
│ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Perceive │─────→│ Think │ │
│ │ 感知环境 │ │ 推理下一步│ │
│ └──────────┘ └──────────┘ │
│ ↑ │ │
│ │ ↓ │
│ ┌──────────┐ ┌──────────┐ │
│ │ Observe │←─────│ Act │ │
│ │ 观察结果 │ │ 执行动作 │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ └──── 任务完成? ───┘ │
│ 否 → 继续循环 │
│ 是 → 输出结果 │
└──────────────────────────────────────────────────┘
每个阶段详解
Perceive(感知)
Agent 通过多种渠道感知环境:
- 用户输入(自然语言指令)
- 文件系统(读取文件、列出目录)
- API 响应(工具调用返回的结果)
- 对话历史(之前的交互记录)
- 系统状态(时间、内存、上下文窗口使用情况)
Think(思考)
Agent 基于感知到的信息进行推理:
- 分析用户意图:用户真正想要什么?
- 分解任务:复杂任务可以拆分为哪些子任务?
- 制定计划:执行顺序是什么?有哪些依赖?
- 选择工具:需要调用哪些工具?
- 评估风险:这个行动可能有什么后果?
Act(行动)
Agent 执行具体的动作:
- 调用工具(MCP Tool Call)
- 读写文件
- 发送消息
- 搜索知识库
- 执行代码
Observe(观察)
Agent 检查行动的结果:
- 工具调用成功了吗?
- 返回的数据符合预期吗?
- 信息足够回答用户了吗?
- 需要调整策略吗?
- 发现错误需要修正吗?
ReAct 循环示例
用户提问:“帮我整理本周的会议纪要”
循环 1:
Perceive: 用户想整理本周会议纪要
Think: 需要先获取本周的会议列表
Act: 调用日历 API 获取本周会议
Observe: 获取到 5 个会议,3 个有纪要链接
循环 2:
Perceive: 5 个会议,3 个有纪要
Think: 需要获取 3 个会议的纪要内容
Act: 调用妙记 API 获取 3 个纪要
Observe: 3 个纪要获取成功,长度分别为 2000、1500、3000 字
循环 3:
Perceive: 3 个纪要内容在手
Think: 需要汇总关键信息,按主题分类
Act: 分析纪要内容,提取关键决策和行动项
Observe: 提取出 8 个关键决策,12 个行动项
循环 4:
Perceive: 信息已整理完毕
Think: 任务完成,可以输出最终报告
Act: 生成结构化报告
Observe: 报告已生成,用户确认满意
循环结束 → 输出报告
Agent vs 传统程序
| 维度 | 传统程序 | Agent |
|---|---|---|
| 决策者 | 人(开发者预先定义逻辑) | 模型(运行时推理和决策) |
| 执行方式 | 确定性流程(if-else, for, while) | 动态推理(根据观察调整策略) |
| 错误处理 | 开发者预先定义 try-catch | 自我观察、自我纠错 |
| 灵活性 | 只能处理预定义的情况 | 能处理未预见的开放情况 |
| 工具使用 | 代码中硬编码调用 | 动态选择和组合工具 |
| 任务范围 | 封闭的、可预见的 | 开放的、需要推理的 |
| 可解释性 | 代码逻辑可追溯 | 推理过程(Thought)可追溯 |
| 开发方式 | 编写代码逻辑 | 设计环境和约束 |
Agent 的关键组件
规划 (Planning)
Agent 需要将复杂任务分解为可执行的步骤。规划能力决定了 Agent 处理复杂任务的上限。
规划策略:
- ReAct 风格:边推理边行动,适合探索性任务
- Plan-and-Execute 风格:先制定完整计划,再逐步执行,适合确定性任务
- 分层规划:高层目标 + 低层子任务,适合复杂多层次任务
记忆 (Memory)
Agent 的记忆系统分为两个层次:
| 记忆类型 | 存储内容 | 生命周期 | 实现方式 |
|---|---|---|---|
| 短期记忆 | 当前对话历史、最近的操作结果 | 当前会话 | 上下文窗口中的消息 |
| 长期记忆 | 用户偏好、领域知识、学习到的经验 | 跨会话 | 向量数据库、文件系统、笔记 |
工具使用 (Tool Use)
Agent 通过工具与外部世界交互。工具是 Agent 能力的延伸。
| 工具类型 | 示例 | 本 Vault 中的工具 |
|---|---|---|
| 信息检索 | 搜索引擎、数据库查询 | 文件搜索、WikiLink 追踪 |
| 数据处理 | 计算、分析、转换 | 文本处理、表格生成 |
| 外部操作 | 发送邮件、创建文档、执行代码 | 创建笔记、写文件 |
| 知识管理 | 读写笔记、搜索知识库 | 读取摘要、加载全文 |
反思 (Reflection)
反思是 Agent 区别于简单 Tool Calling 的关键能力。Agent 在执行每个动作后,观察结果并反思:
- 这个结果符合预期吗?
- 需要调整策略吗?
- 发现了什么新信息?
- 当前路径是否还正确?
ReAct 的局限与演进
| 局限 | 说明 | 解决方案 |
|---|---|---|
| 无限循环 | Agent 可能陷入循环无法终止 | 设置最大步数、时间限制 |
| 错误累积 | 早期错误导致后续一系列错误 | 反思机制、定期自我检查 |
| 上下文膨胀 | 每步都追加到上下文,窗口耗尽 | 上下文压缩、摘要历史 |
| 工具选择错误 | 选择了错误的工具导致失败 | 多工具候选、失败后重试 |
| 缺乏全局规划 | 边做边想可能缺乏全局视角 | Plan-and-Execute 模式 |
相关笔记
- 第14章 · Agent 是怎么工作的 - Agent 工作原理章节
- 概念-ReActAgent - ReAct Agent 详解
- ReAct 循环(深挖) - ReAct 循环深度分析
- Loop 工程:让 AI 自己转起来 - Loop 工程详解
- 第16章 · 多个 AI 怎么配合工作 - 多 Agent 协作章节
- 对话到 Agent 演化 - 对话到 Agent 演化
- MCP+A2A 双协议生态 - MCP+A2A 双协议生态
来源
- ReAct 论文: https://arxiv.org/abs/2210.03629 (Yao et al., 2022)
- Anthropic Building Effective Agents: https://www.anthropic.com/engineering/building-effective-agents
- Lilian Weng Agent 博客: https://lilianweng.github.io/posts/2023-06-23-agent/
- Plan-and-Execute 论文: https://arxiv.org/abs/2305.04091
- ReAct 与 Tool Use 对比: https://blog.langchain.dev/react-vs-tool-use/