Files

93 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: ai.agent-design.react-planning
title: Agent 推理模式:ReAct、Plan-and-Execute、反思和 Agentic RAG
type: lesson
domain: ai
stack: [agent-design]
tags: [ReAct, Plan-and-Execute, 规划, 反思, Agentic RAG, 工作流 vs Agent]
level: intermediate
prerequisites: [ai.function-calling.tool-loop]
est_hours: 3
related: [ai.agent-design.context-skills-multiagent, ai.langgraph.state-graph, ai.agent-design.interview]
week: [10, 11]
order: 1
---
# Agent 推理模式:ReAct、Plan-and-Execute、反思和 Agentic RAG
## 解释说明
### 先问:真的需要 Agent 吗?
| 形态 | 特点 | 适合 |
| --- | --- | --- |
| 单次调用 | 一个提示词一次输出 | 分类、提取、改写 |
| **工作流(Workflow)** | 步骤由代码固定,模型只完成其中的环节 | 流程明确的业务:工单分类 → 起草 → 审批 |
| **Agent** | 模型自己决定下一步做什么、调用什么工具、何时结束 | 步骤不固定、需要探索的任务:排查问题、调研、复杂查询 |
企业里大多数需求用工作流就够了,更可控、更便宜、更好评测。Agent 用在确实需要灵活性的地方,并且要有步数、预算、权限的边界。面试时能说出这个判断,比背模式名更重要。
### 常见模式
| 模式 | 做法 | 优点 | 缺点 |
| --- | --- | --- | --- |
| **ReAct**(推理 + 行动) | 循环:思考 → 调用工具 → 观察结果 → 再思考,直到给出答案 | 简单通用,现代工具调用 Agent 基本都是这个循环 | 每步都调用大模型,长任务容易跑偏 |
| **Plan-and-Execute**(先规划后执行) | 先生成完整计划(步骤列表),再逐步执行;失败时把错误反馈给规划器重新规划 | 全局视角,步骤可展示给用户确认,执行步骤可以用便宜模型 | 计划可能不切实际,需要重新规划机制 |
| **反思(Reflection)** | 生成后让模型(或另一个模型)按标准检查并修改 | 提升质量 | 成本和延迟翻倍;检查标准要明确 |
| **Agentic RAG** | 由 Agent 决定是否检索、改写查询、多次检索、选择数据源、检查答案是否有依据 | 能处理多跳、模糊问题 | 延迟高,必须有最大步数 |
### 规划的工程要点
- 计划用**结构化输出**(步骤列表:工具、参数、依赖),而不是自由文本。
- 每一步有状态(待执行 / 完成 / 失败),可展示、可恢复(用 LangGraph 检查点)。
- 失败时把**具体错误**反馈给规划器;设置最大重新规划次数,超过后转人工。
- 有副作用的步骤在执行前让用户确认计划。
## 案例
运营人员说“生成 9 月各大区销售报表并发给运营组”。Plan-and-Execute:规划出“查询销售数据 → 生成图表 → 发送”三步并展示给用户;第一次查询因为缺少月份参数失败,错误反馈给规划器后修正参数,第二次执行成功。整个过程每一步的状态都在界面上可见。
## 代码示例
完整可运行版本:[examples/agent-patterns/patterns.py](examples/agent-patterns/patterns.py)。Plan-and-Execute 核心:
```python
def plan_and_execute(goal: str, max_replans: int = 2):
log, feedback = [], None
for attempt in range(max_replans + 1):
steps = plan(goal, feedback) # 真实项目:大模型输出结构化计划
for s in steps:
s.result = TOOLS[s.tool](s.args)
if "error" in s.result:
s.status = "failed"
feedback = f"{s.tool} 失败:{s.result['error']}" # 具体错误反馈给规划器
break
s.status = "done"
else:
return steps, log # 全部成功
return steps, log + ["超过最大重新规划次数,转人工"]
```
输出:
```text
第 1 次规划:['query_sales', 'make_chart', 'send_report']
query_sales 失败:缺少 month 参数
第 2 次规划:['query_sales', 'make_chart', 'send_report']
最终步骤状态: [('query_sales', 'done'), ('make_chart', 'done'), ('send_report', 'done')]
```
## 易错点
- 所有需求都做成 Agent:流程固定的用工作流。
- 没有最大步数 / 最大重新规划次数,失败时无限循环、成本失控。
- 计划是自由文本,无法校验和展示。
- 反思步骤没有明确标准(“检查一下有没有问题”),模型只会说“没问题”。
- 只测最终答案,不测中间过程(工具调用序列、步数)。
## 面试常问
- ReAct 是什么?和 Plan-and-Execute 有什么区别?
- 工作流和 Agent 怎么选?
- Agentic RAG 和普通 RAG 的区别?