第四章 经典范式 ReAct / Plan / Reflection
一句话
通过从零实现ReAct、Plan-and-Solve和Reflection三种经典智能体范式,掌握将大语言模型推理能力与外部世界联通的核心方法。
什么时候翻这页
当你需要构建智能体并了解不同范式(ReAct、Plan-and-Solve、Reflection)的适用场景和实现方法时;当你需要将大语言模型与外部工具结合解决复杂任务时;当你需要理解智能体"思考"与"行动"的组织方式时。
核心概念
ReAct (Reasoning and Acting)
将"思考"和"行动"紧密结合的范式,形成"思考-行动-观察"循环:
- Thought (思考):智能体的"内心独白",分析情况、分解任务
- Action (行动):调用外部工具的具体动作
- Observation (观察):工具执行后返回的结果
Plan-and-Solve
"三思而后行"的范式,分为两个阶段:
- 规划阶段:将问题分解为清晰、分步骤的行动计划
- 执行阶段:严格按照计划中的步骤逐一执行
Reflection
赋予智能体"反思"能力的范式,通过"执行-反思-优化"循环提升输出质量:
- 执行:生成初步解决方案
- 反思:作为"评审员"审视初稿,找出问题
- 优化:根据反馈修正方案,可迭代多次
工具 (Tools)
智能体与外部世界交互的"手和脚",包含三个核心要素:
- 名称 (Name):简洁唯一的标识符
- 描述 (Description):清晰的自然语言描述(最关键部分)
- 执行逻辑 (Execution Logic):真正执行任务的函数
短期记忆 (Memory)
存储执行-反思轨迹的模块,用于在迭代过程中保持上下文连贯性。
怎么做
环境准备
-
安装依赖库:
pip install openai python-dotenv -
配置API密钥: 创建
.env文件:LLM_API_KEY="YOUR-API-KEY" LLM_MODEL_ID="YOUR-MODEL" LLM_BASE_URL="YOUR-URL" -
封装基础LLM调用函数:
class HelloAgentsLLM: def __init__(self, model: str = None, apiKey: str = None, baseUrl: str = None, timeout: int = None): # 初始化代码 def think(self, messages: List[Dict[str, str]], temperature: float = 0) -> str: # 调用LLM并返回响应
ReAct智能体构建
-
定义工具执行器:
class ToolExecutor: def registerTool(self, name: str, description: str, func: callable) def getTool(self, name: str) -> callable def getAvailableTools(self) -> str -
实现ReAct提示词模板:
REACT_PROMPT_TEMPLATE = """ 注意事项... {tools} 请严格按照以下格式进行回应: Thought: 你的思考过程... Action: 你决定采取的行动... """ -
构建ReActAgent类:
class ReActAgent: def __init__(self, llm_client, tool_executor, max_steps: int = 5) def run(self, question: str) def _parse_output(self, text: str) def _parse_action(self, action_text: str)
Plan-and-Solve智能体构建
-
规划阶段提示词:
PLANNER_PROMPT_TEMPLATE = """ 你是一个顶级的AI规划专家... 请严格按照以下格式输出你的计划: ```python ["步骤1", "步骤2", "步骤3", ...]"""
-
执行阶段提示词:
EXECUTOR_PROMPT_TEMPLATE = """ 你是一位顶级的AI执行专家... 请仅输出针对"当前步骤"的回答: """ -
构建PlanAndSolveAgent类:
class PlanAndSolveAgent: def __init__(self, llm_client) def run(self, question: str)
Reflection智能体构建
-
记忆模块设计:
class Memory: def add_record(self, record_type: str, content: str) def get_trajectory(self) -> str def get_last_execution(self) -> Optional[str] -
反思提示词:
REFLECT_PROMPT_TEMPLATE = """ 你是一位极其严格的代码评审专家... 请分析该代码的时间复杂度,并思考是否存在一种算法上更优的解决方案... """ -
优化提示词:
REFINE_PROMPT_TEMPLATE = """ 你是一位资深的Python程序员... 请根据评审员的反馈,生成一个优化后的新版本代码... """ -
构建ReflectionAgent类:
class ReflectionAgent: def __init__(self, llm_client, max_iterations=3) def run(self, task: str) def _get_llm_response(self, prompt: str) -> str
命令 / 代码速查
环境配置
# 安装依赖
pip install openai python-dotenv
# 配置API密钥(.env文件)
LLM_API_KEY="YOUR-API-KEY"
LLM_MODEL_ID="YOUR-MODEL"
LLM_BASE_URL="YOUR-URL"
SERPAPI_API_KEY="YOUR_SERPAPI_API_KEY"
关键代码片段
# ReAct提示词模板
REACT_PROMPT_TEMPLATE = """
{tools}
请严格按照以下格式进行回应:
Thought: 你的思考过程...
Action: 你决定采取的行动...
"""
# Plan-and-Solve规划提示词
PLANNER_PROMPT_TEMPLATE = """
请严格按照以下格式输出你的计划:
```python
["步骤1", "步骤2", "步骤3", ...]
"""
Reflection反思提示词
REFLECT_PROMPT_TEMPLATE = """ 请分析该代码的时间复杂度,并思考是否存在一种算法上更优的解决方案... """
## 与 Python / Claude Code 手册的联系
- 使用Python实现智能体架构,涉及类设计、循环控制、正则表达式等
- 调用OpenAI API进行大语言模型交互,使用流式响应处理
- 使用`ast.literal_eval`安全解析Python列表字符串
- 使用正则表达式解析LLM输出结构
- 使用环境变量管理敏感信息(API密钥)
## 初学者易错点
1. ReAct中正则表达式解析失败:当LLM输出格式不符合预期时,解析函数可能失败
2. Reflection循环无法终止:需设置最大迭代次数,避免无限循环
3. 工具描述不清晰:工具描述是LLM选择工具的关键,描述不清会导致错误调用
4. 提示词脆弱性:微小变动可能影响LLM行为,需保持提示词稳定性
5. 状态管理不当:在Plan-and-Solve中,历史步骤未正确传递导致后续步骤错误
## 相关词条
- Chain-of-Thought (思维链):引导模型进行复杂逻辑推理的方法
- Tool Calling (工具调用):智能体使用外部工具的能力
- Prompt Engineering (提示词工程):设计有效提示词的技术
- Iterative Refinement (迭代优化):逐步改进解决方案的过程
- Few-shot Prompting:通过示例引导模型输出的技术