阶段4(上):LangGraph、Function Calling、MCP(SDK 2.x)、Agent 评测与运维、Agent 设计专题;run_examples 设置 RUN_EXAMPLES=1

This commit is contained in:
Shikui Wang committed 2026-10-23 16:06:54 +08:00
1 parent 6650f7eb6d
commit caaec830b3
38 files changed
+3515 -64

No files matched your search

@@ -0,0 +1,92 @@
---
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 的区别?