智能体的规划与推理
规划和推理是智能体的"大脑"中最关键的部分——它决定了 Agent 如何将一个复杂目标分解为可执行的步骤,并在执行过程中动态调整策略。本章深入讲解 Agent 规划和推理的核心方法,这些方法最终都会落地到单智能体架构之中。
规划和推理是智能体的"大脑"中最关键的部分——它决定了 Agent 如何将一个复杂目标分解为可执行的步骤,并在执行过程中动态调整策略。本章深入讲解 Agent 规划和推理的核心方法,这些方法最终都会落地到单智能体架构之中。
理解提示工程与工具调用
ReAct:推理与行动的交替、任务分解(Task Decomposition)、反思与自我修正(Reflection)
行动系统 · 智能体深度解析
文章导航
- 引言
- 1. ReAct:推理与行动的交替
- 1.1 核心思想
- 1.2 ReAct 的优势
- 2. 任务分解(Task Decomposition)
- 2.1 Plan-and-Execute 模式
- 2.2 递归任务分解
- 2.3 HuggingGPT 的任务分解
- 3. 反思与自我修正(Reflection)
- 3.1 Reflexion 框架
- 3.2 反思的具体流程
- 3.3 自我验证(Self-Verification)
- 4. 高级推理策略
- 4.1 Tree-of-Thought(ToT)
- 4.2 Least-to-Most 推理
- 5. 规划的实际实现
- 5.1 LangGraph 中的状态图
- 5.2 动态重规划
- 6. 本章小结
- 相关章节
- 延伸阅读
点击图中节点可定位到对应正文。
引言
规划和推理是智能体的"大脑"中最关键的部分——它决定了 Agent 如何将一个复杂目标分解为可执行的步骤,并在执行过程中动态调整策略。本章深入讲解 Agent 规划和推理的核心方法,这些方法最终都会落地到单智能体架构之中。
1. ReAct:推理与行动的交替
1.1 核心思想
ReAct(Reasoning + Acting)是最经典的 Agent 推理框架,它在提示工程的思维链(CoT)基础上,将"思考"和"行动"交替进行:
用户: "帮我查一下 Elon Musk 旗下有哪些公司"
Thought 1: 我需要搜索 Elon Musk 的公司信息
Action 1: search("Elon Musk companies list")
Observation 1: 搜索结果:Tesla, SpaceX, X (Twitter), Neuralink, The Boring Company...
Thought 2: 我找到了主要公司列表,让我获取更详细的信息
Action 2: get_details("Tesla, SpaceX, X, Neuralink, Boring Company")
Observation 2: Tesla-电动车; SpaceX-航天; X-社交媒体; Neuralink-脑机接口; Boring Company-隧道
Thought 3: 我已经有足够的信息来回答了
Final Answer: Elon Musk 旗下主要公司包括:
1. Tesla - 电动汽车和清洁能源
2. SpaceX - 航天和太空探索
3. X(原 Twitter)- 社交媒体平台
4. Neuralink - 脑机接口技术
5. The Boring Company - 隧道和基础设施1.2 ReAct 的优势
| 优势 | 说明 |
|---|---|
| 可解释性 | 每步的 Thought 让推理过程透明 |
| 可调试性 | 出错时可以看到在哪一步出了问题 |
| 灵活性 | 根据 Observation 动态调整下一步行动 |
| 可追溯 | 完整的推理链便于审计 |
2. 任务分解(Task Decomposition)
2.1 Plan-and-Execute 模式
先规划完整方案,再逐步执行:
用户: "帮我创建一个项目周报"
Step 1 - 规划阶段:
Plan:
1. 获取本周的项目进度数据
2. 获取本周的会议纪要
3. 收集团队成员的工作汇报
4. 汇总和分析数据
5. 生成周报文档
6. 发送给相关干系人
Step 2 - 执行阶段:
Execute Step 1: query_project_status(week="current")
Execute Step 2: get_meeting_notes(week="current")
Execute Step 3: collect_team_reports(week="current")
Execute Step 4: analyze_data(status, notes, reports)
Execute Step 5: generate_report(analysis)
Execute Step 6: send_email(report, recipients)2.2 递归任务分解
对于复杂任务,进行多层分解:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Level 1 分解:
├── 1. 需求分析
├── 2. 系统设计
├── 3. 编码实现
├── 4. 测试
└── 5. 部署根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Level 2 分解(以"3. 编码实现"为例):
├── 3.1 数据库设计
├── 3.2 后端 API
│ ├── 3.2.1 用户注册 API
│ ├── 3.2.2 登录 API
│ └── 3.2.3 权限管理 API
├── 3.3 前端页面
│ ├── 3.3.1 登录页面
│ ├── 3.3.2 用户列表页面
│ └── 3.3.3 权限配置页面
└── 3.4 集成根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
Level 3 分解(以"3.2.1 用户注册 API"为例):
├── 定义数据模型
├── 编写路由处理器
├── 输入验证
├── 密码加密
├── 数据库存储
└── 编写单元测试2.3 HuggingGPT 的任务分解
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
执行依赖关系:
Task 1 → Task 2 → Task 3(顺序执行)3. 反思与自我修正(Reflection)
3.1 Reflexion 框架
Agent 执行失败后,反思错误并改进:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
第 1 次尝试:
任务: 编写一个函数计算斐波那契数列
行动: 生成代码 → 运行测试 → 失败(超时)
反思: "递归实现太慢了,大数时会超时"根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
第 2 次尝试:
行动: 改用迭代实现 → 运行测试 → 通过
反思: "迭代实现正确且高效"
存储经验: "斐波那契数列应使用迭代而非递归"3.2 反思的具体流程
def reflexion_loop(task, max_attempts=3):
memory = []
for attempt in range(max_attempts):
# 思考 + 行动
thought = llm.generate(f"""
任务: {task}
之前的尝试: {memory}
请思考如何解决这个任务。
""")
action = llm.generate(f"基于思考,执行什么操作?")
observation = execute(action)
# 评估结果
result = evaluate(observation)
if result.success:
return result
# 反思
reflection = llm.generate(f"""
任务: {task}
我的行动: {action}
结果: {observation}
为什么失败了?下次应该怎么改进?
""")
memory.append({
"attempt": attempt + 1,
"action": action,
"result": observation,
"reflection": reflection
})
return "未能完成任务"3.3 自我验证(Self-Verification)
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
生成答案: "北京的人口约为 2100 万"
↓
自我验证: "这个答案合理吗?让我验证一下..."
↓
验证方法: search("北京人口 2024")
↓
验证结果: "搜索结果显示北京常住人口约 2188 万"
↓
修正答案: "北京常住人口约 2188 万(2024 年数据)"4. 高级推理策略
4.1 Tree-of-Thought(ToT)
让模型探索多条推理路径,选择最优方案:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
路径 A: 3 + 5 = 8, 8 + 7 = 15, 15 + 8 = 23 → 不行
路径 B: 3 × 5 = 15, 15 - 7 = 8, 8 + 8 = 16 → 不行
路径 C: 8 - 5 = 3, 3 × 3 = 9, 9 + 7 = 16 → 不行
路径 D: 5 - 3 = 2, 2 × 8 = 16, 16 + 7 = 23 → 不行
路径 E: 8 / (7 - 5) = 4, 4 × 3 = 12 → 不行
路径 F: (5 - 3) × (7 + 8) = 2 × 15 = 30 → 不行
...4.2 Least-to-Most 推理
从最简单的子问题开始,逐步解决更复杂的问题:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
分解:
1. 最简单的子问题:如果全是鸡,有多少只脚?
→ 35 × 2 = 70 只脚
2. 实际比全鸡多多少只脚?
→ 94 - 70 = 24 只脚
3. 每只兔比鸡多几只脚?
→ 4 - 2 = 2 只脚
4. 所以有多少只兔?
→ 24 / 2 = 12 只兔
5. 有多少只鸡?
→ 35 - 12 = 23 只鸡5. 规划的实际实现
5.1 LangGraph 中的状态图
# 用状态图表示 Agent 的规划流程
from langgraph.graph import StateGraph
graph = StateGraph(AgentState)
# 添加节点
graph.add_node("plan", planning_node) # 规划
graph.add_node("execute", execution_node) # 执行
graph.add_node("reflect", reflection_node) # 反思
graph.add_node("replan", replanning_node) # 重新规划
# 添加边
graph.add_edge("plan", "execute")
graph.add_conditional_edges("execute", should_continue, {
"success": END,
"failure": "reflect"
})
graph.add_edge("reflect", "replan")
graph.add_edge("replan", "execute")5.2 动态重规划
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
初始计划: A → B → C → D根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
执行 A: 成功 ✓
执行 B: 失败 ✗ (发现新信息)
↓
反思: B 失败是因为 X,需要改用方法 Y
↓
重规划: A → B' → C' → D' (根据新信息调整计划)
↓
执行 B': 成功 ✓
执行 C': 成功 ✓
执行 D': 成功 ✓6. 本章小结
| 方法 | 核心思想 | 适用场景 |
|---|---|---|
| ReAct | 思考-行动交替 | 通用 Agent 任务 |
| Plan-and-Execute | 先规划后执行 | 步骤明确的复杂任务 |
| Reflexion | 失败后反思改进 | 需要试错的任务 |
| ToT | 探索多条路径 | 搜索和优化问题 |
| Least-to-Most | 从简到难 | 数学和逻辑推理 |
| 动态重规划 | 根据执行结果调整计划 | 不确定性高的任务 |
相关章节
- 什么是智能体 — 规划与推理在智能体整体中的定位
- 提示工程(Prompt Engineering) — 思维链(CoT)等推理技巧的基础
- 单智能体架构 — 规划与推理能力的落地形态
延伸阅读
- Yao, S. et al. (2023). "ReAct: Synergizing Reasoning and Acting in Language Models". ICLR
- Shinn, N. et al. (2023). "Reflexion: Language Agents with Verbal Reinforcement Learning". NeurIPS
- Yao, S. et al. (2023). "Tree of Thoughts: Deliberate Problem Solving with Large Language Models". NeurIPS
- Wang, L. et al. (2023). "Plan-and-Solve Prompting". ACL