智能体经典范式构建:ReAct、Plan-and-Solve 与 Reflection
如果说 2023 年是 AutoGPT 引爆 Agent 概念的一年,那么 2024 年则是这些概念逐渐沉淀、范式逐渐清晰的一年。
在实践中,三种经典范式逐渐脱颖而出:ReAct、Plan-and-Solve 和 Reflection。
它们不是相互替代的关系,而是可以组合在一起,构建出强大的智能体系统。
ReAct:推理与行动的交响
ReAct(Reasoning + Acting)可能是最经典的 Agent 范式。它的思想简单而优雅:
思考 → 行动 → 观察 → 思考 → 行动 → ...
核心思想
人类解决问题时,不会一次性给出所有步骤,而是:
- 思考当前情况
- 采取一个行动
- 观察结果
- 基于结果调整下一步思考
ReAct 就是让 AI 模仿这个过程。
实现模式
一个典型的 ReAct 循环:
while not task_complete:
# Thought: 分析当前情况
thought = llm.generate(
f"当前状态:{current_state}\n"
f"目标:{goal}\n"
"我应该怎么做?"
)
# Action: 选择并执行行动
action = parse_action(thought)
observation = execute_action(action)
# 更新状态,继续循环
current_state = update_state(observation)
经典案例:问答系统
用户问:”科罗拉多造山带是如何形成的?”
Thought 1:用户问的是科罗拉多造山带的形成过程,我需要搜索相关信息。
Action 1:搜索 “科罗拉多造山带形成”
Observation 1:搜索结果提到了造山运动、板块碰撞等,但没有详细说明东部地区。
Thought 2:搜索结果提到了西部地区,但用户可能也关心东部地区的信息。
Action 2:搜索 “科罗拉多东部造山带”
Observation 2:获得了更完整的信息。
Thought 3:现在我有足够的信息来回答用户的问题了。
Action 3:生成最终答案
这种”思考-行动-观察”的循环,让 AI 能够像人类一样逐步探索问题空间。
ReAct 的优势
- 透明性:每一步思考都可见,便于调试
- 灵活性:可以根据观察结果动态调整策略
- 通用性:不依赖特定领域,可应用于各种任务
ReAct 的局限
- 效率问题:可能需要多次尝试才能找到正确路径
- 成本问题:每次循环都要调用 LLM,Token 消耗大
- 规划不足:缺乏全局规划,容易陷入局部最优
Plan-and-Solve:先规划,后执行
如果 ReAct 是”边走边想”,那么 Plan-and-Solve 就是”先想清楚再行动”。
核心思想
人类解决复杂问题时,通常会先制定计划:
- 理解问题
- 分解为子问题
- 制定执行计划
- 按计划执行
- 根据结果调整
Plan-and-Solve 让 AI 模仿这个过程。
实现模式
# Phase 1: Planning
plan = llm.generate(
f"任务:{task}\n"
"请制定一个详细的执行计划:\n"
"1. 理解任务目标\n"
"2. 分解子任务\n"
"3. 确定执行顺序\n"
"4. 列出每个步骤的具体行动"
)
# Phase 2: Execution
for step in parse_plan(plan):
result = execute_step(step)
update_progress(result)
# Phase 3: Adjustment (optional)
if not task_complete:
adjusted_plan = llm.generate(
f"原计划:{plan}\n"
f"执行结果:{results}\n"
"请根据执行结果调整计划"
)
计划的表示形式
计划可以有多种表示形式:
列表形式:
1. 搜索"Python 异步编程"
2. 阅读前 5 个搜索结果
3. 总结异步编程的核心概念
4. 生成代码示例
结构化形式:
{
"goal": "解释 Python 异步编程",
"steps": [
{
"step": 1,
"action": "search",
"query": "Python 异步编程",
"purpose": "获取相关信息"
},
{
"step": 2,
"action": "read",
"target": "top 5 results",
"purpose": "理解核心概念"
}
]
}
伪代码形式:
FUNCTION explain_async_programming:
SEARCH "Python async programming"
READ top results
EXTRACT key concepts (asyncio, await, async)
GENERATE code examples
COMPOSE explanation
END FUNCTION
Plan-and-Solve 的优势
- 全局视野:先规划,避免盲目行动
- 效率提升:减少不必要的尝试
- 可追溯:每一步都有明确的意图
Plan-and-Solve 的局限
- 刚性:计划可能不够灵活,难以应对变化
- 规划质量依赖 LLM:如果初始规划有误,后续执行会受影响
- 动态调整困难:修改计划可能比重新规划还复杂
Reflection:从经验中学习
ReAct 和 Plan-and-Solve 解决了”如何行动”的问题,但还有一个关键问题:如何从行动中学习?
这就是 Reflection 机制的用武之地。
核心思想
人类在完成任务后,会反思:
- 哪里做得好?
- 哪里出了问题?
- 下次如何改进?
Reflection 让 AI 也具备这种能力。
实现模式
# 执行任务
result = execute_task(task)
# 反思
reflection = llm.generate(
f"任务:{task}\n"
f"执行过程:{execution_history}\n"
f"结果:{result}\n"
"请反思:\n"
"1. 哪些做法是正确的?\n"
"2. 哪些做法可以改进?\n"
"3. 如果再做一次,你会怎么做?"
)
# 存储反思结果
store_reflection(task, reflection)
# 下次遇到类似任务时检索
similar_tasks = find_similar_tasks(task)
relevant_reflections = retrieve_reflections(similar_tasks)
反思的层次
Reflection 可以在不同层次进行:
任务级反思:
这个任务完成了吗?
如果没有,哪里出了问题?
如何修正?
策略级反思:
我的策略有效吗?
有没有更好的方法?
下次应该尝试什么不同的做法?
元认知反思:
我对这个类型的任务擅长吗?
我应该先学习相关知识还是直接尝试?
我是否需要寻求帮助?
Reflection 的实现形式
文本形式:
反思:这次任务中,我在第三步犯了错误——过早地得出了结论。
下次应该:在得出结论前,先验证所有关键信息。
经验:对于数据分析任务,验证步骤必不可少。
结构化形式:
{
"task_id": "task_123",
"success": false,
"error": "premature_conclusion",
"lesson": "always verify before concluding",
"action_item": "add verification step"
}
向量存储: 将反思内容编码为向量,存储在向量数据库中,下次遇到类似任务时通过语义检索找到相关反思。
Reflection 的价值
- 持续改进:每次任务都能积累经验
- 错误纠正:识别并避免重复犯错
- 知识沉淀:将隐性经验显性化
三者融合:构建完整的智能体
单一的范式往往不够强大,真正的智能体需要融合多种范式。
融合架构
class Agent:
def solve(self, task):
# Phase 1: Planning (Plan-and-Solve)
plan = self.plan(task)
# Phase 2: Execution with Reflection (ReAct + Reflection)
while not task_complete:
# ReAct loop
thought = self.think(current_state, plan)
action = self.select_action(thought)
observation = self.execute(action)
# Check if we need reflection
if self.should_reflect(observation):
reflection = self.reflect(history)
plan = self.adjust_plan(plan, reflection)
current_state = update_state(observation)
# Phase 3: Final Reflection
final_reflection = self.reflect(history)
store_reflection(task, final_reflection)
return result
具体案例:代码生成智能体
任务:实现一个用户认证系统
Phase 1: Plan-and-Solve(规划)
计划:
1. 分析需求(用户注册、登录、登出)
2. 设计数据库模型(User表)
3. 实现注册接口
4. 实现登录接口
5. 实现登出接口
6. 添加错误处理
Phase 2: ReAct(执行)
Thought 1: 先设计数据库模型
Action 1: 生成 User 模型代码
Observation 1: 生成成功,包含 id, username, password_hash
Thought 2: 接下来实现注册接口
Action 2: 生成注册 API 代码
Observation 2: 生成成功,但缺少密码验证
Reflection: 我应该在生成代码前加上验证逻辑
Adjust plan: 在每个 API 前增加验证步骤
Thought 3: 重新生成注册接口,加入验证
Action 3: 生成改进后的注册 API
Observation 3: 成功
Phase 3: Reflection(反思)
反思:
1. 成功之处:模块化设计,代码清晰
2. 不足之处:一开始忘记输入验证
3. 改进:以后生成 API 时,默认包含验证逻辑
4. 经验存储:API 开发 checklist(验证、错误处理、日志)
融合的优势
这种融合架构综合了三种范式的优点:
- Plan-and-Solve 提供全局视野和结构化思维
- ReAct 提供灵活的执行和动态调整能力
- Reflection 提供持续改进和经验积累
实践建议
1. 根据任务选择范式
| 任务类型 | 推荐范式 | 原因 |
|---|---|---|
| 简单问答 | ReAct | 快速响应,无需复杂规划 |
| 复杂项目 | Plan-and-Solve | 需要全局视野和结构化分解 |
| 重复性任务 | Plan-and-Solve + Reflection | 规划可复用,经验可积累 |
| 探索性任务 | ReAct + Reflection | 灵活探索,持续学习 |
2. 渐进式实现
不要一开始就追求完美的融合架构:
第一阶段:实现 ReAct
- 快速验证想法
- 理解核心问题
第二阶段:加入 Plan-and-Solve
- 提升效率
- 减少盲目尝试
第三阶段:加入 Reflection
- 积累经验
- 持续优化
3. 成本控制
三种范式都会增加 LLM 调用次数,需要考虑成本:
策略一:缓存和复用
# 缓存规划结果
if similar_task in cache:
plan = cache[similar_task]
else:
plan = llm.generate_plan(task)
cache[task] = plan
策略二:分层调用
# 简单任务用小模型
if complexity(task) == "low":
model = "gpt-3.5"
else:
model = "gpt-4"
策略三:提前终止
# 如果计划执行顺利,不需要每次都反思
if error_rate < threshold:
skip_reflection = True
未来展望
1. 更智能的规划
目前的规划还比较简单,未来可以:
- 学习人类专家的规划模式
- 从历史任务中提炼规划模板
- 动态调整规划粒度
2. 更深度的反思
Reflection 可以更深入:
- 跨任务的经验迁移
- 识别模式并抽象原则
- 构建个人化的知识库
3. 更自然的融合
三种范式的边界可能会模糊:
- 规划和执行的实时切换
- 反思过程的自动化和隐性化
- 形成统一的智能架构
4. 多智能体协作
单个智能体能力有限,未来方向:
- 专门的规划 Agent
- 专门的执行 Agent
- 专门的反思 Agent
- 通过协作完成复杂任务
结语
ReAct、Plan-and-Solve、Reflection,这三种范式各自解决了智能体构建的不同问题:
- ReAct 解决了如何行动的问题
- Plan-and-Solve 解决了如何高效行动的问题
- Reflection 解决了如何持续改进的问题
它们的融合,标志着 Agent 技术从”玩具”走向”工具”,从”炫技”走向”实用”。
2024 年,我们正在见证智能体技术的成熟。而这一切,才刚刚开始。
注:本文基于当前 Agent 技术的主流实践整理,相关技术仍在快速发展中。