一 智能体经典范式构建
智能体经典范式构建 — 学习笔记
来源:《Hello Agents》第四章 | 核心主题:从零实现 ReAct、Plan-and-Solve、Reflection 三大智能体范式
一、章节定位与学习目标
本章承上启下:上一章讲解了 LLM 的 Transformer 架构与交互方法,本章将这些理论转化为实践——亲手构建智能体。
为什么要"重复造轮子"?
直接使用高度抽象的框架(LangChain、LlamaIndex)不利于理解底层设计机制
亲手处理工程问题(输出解析、重试、防死循环)是培养系统设计能力最直接的方式
掌握设计原理后,才能从"使用者"转变为"创造者",具备深度定制能力
本章三大范式一览:
| 范式 | 核心策略 | 比喻 |
|---|---|---|
| ReAct | 边想边做,动态调整 | 经验丰富的侦探,随线索调整方向 |
| Plan-and-Solve | 先规划后执行 | 建筑师,先画蓝图再施工 |
| Reflection | 自我反思与迭代优化 | 完成初稿后校对、验算 |
二、环境准备与基础工具(4.1)
2.1 依赖安装
pip install openai python-dotenv
2.2 API 配置
项目根目录创建.env文件:
LLM_API_KEY="YOUR-API-KEY" LLM_MODEL_ID="YOUR-MODEL" LLM_BASE_URL="YOUR-URL"
2.3 HelloAgentsLLM 客户端封装
设计要点:
统一封装模型服务交互细节,主逻辑更专注智能体构建
优先使用传入参数,未提供则从环境变量加载
默认使用流式响应(stream=True)
核心方法
think(messages, temperature)返回完整响应文本
关键代码结构:
__init__:初始化,校验必要参数think:调用chat.completions.create,处理流式响应,逐块拼接返回
三、ReAct 范式(4.2)
3.1 核心思想
ReAct = Reasoning + Acting,由 Shunyu Yao 于 2022 年提出。
解决的问题:纯思考型(如 CoT)无法与外部世界交互,易产生幻觉;纯行动型缺乏规划和纠错能力。ReAct 将两者结合。
3.2 工作流程:Thought → Action → Observation 循环
问题 q │ ▼ ┌─────────┐ ┌─────────┐ ┌─────────────┐ │ Thought │───▶│ Action │───▶│ Observation │ │ (内心独白) │ │ (调用工具) │ │ (工具返回结果) │ └─────────┘ └─────────┘ └─────────────┘ ▲ │ └──────────── 追加到历史记录 ◀──────────────────┘ │ ▼ (循环直到 Thought 判断任务完成) Finish[最终答案]
形式化表达:
第 t 步:
(th_t, a_t) = π(q, (a_1,o_1),...,(a_{t-1},o_{t-1}))环境执行:
o_t = T(a_t)循环直到模型判断任务完成
3.3 关键组件
(1) 工具定义
一个良好定义的工具包含三个核心要素:
名称(Name):唯一标识符,如
Search描述(Description):自然语言说明用途(最关键,LLM 据此判断何时使用)
执行逻辑(Execution Logic):真正执行任务的函数
search 工具的智能解析策略:
优先返回
answer_box(Google 答案摘要框)其次返回
knowledge_graph(知识图谱描述)最后返回前 3 条
organic_results摘要
(2) ToolExecutor 工具管理器
registerTool(name, description, func):注册工具getTool(name):获取工具执行函数getAvailableTools():格式化输出所有工具描述
(3) ReActAgent 核心类
系统提示词设计要点:
角色定义:"有能力调用外部工具的智能助手"
动态注入工具清单
{tools}强制输出格式:
Thought:+Action:Action 格式:
ToolName[input]或Finish[最终答案]
核心循环逻辑(run 方法):
格式化提示词(工具描述 + 问题 + 历史)
调用 LLM 进行思考
解析输出(正则提取 Thought 和 Action)
执行 Action(Finish 则结束,否则调用工具)
将 Action + Observation 追加到 history
循环直到 Finish 或达到 max_steps
输出解析器:
_parse_output:正则r"Thought:\s*(.*?)(?=\nAction:|$)"提取 Thought_parse_action:正则r"(\w+)\[(.*)\]"提取工具名和输入
3.4 特点与局限性
| 维度 | 特点 |
|---|---|
| 优势 | 高可解释性(Thought 链透明)、动态规划与纠错、工具协同能力 |
| 局限 | 强依赖 LLM 能力、串行执行效率低、提示词脆弱、可能陷入局部最优 |
3.5 调试技巧
打印完整提示词:追溯 LLM 决策源头
分析原始输出:判断是 LLM 未遵循格式还是解析逻辑有误
验证工具输入输出:检查格式兼容性
添加 Few-shot 示例:引导模型遵循格式
调整模型或参数:更换更强模型,temperature 设为 0
四、Plan-and-Solve 范式(4.3)
4.1 核心思想
Plan-and-Solve,由 Lei Wang 于 2023 年提出。解决 CoT 在多步骤复杂任务中"偏离轨道"的问题。
与 ReAct 的本质区别:ReAct 走一步看一步;Plan-and-Solve 先画完整蓝图再施工。
4.2 两阶段工作流
┌──────────────────────────────────────────┐ │ 阶段一:规划 (Plan) │ │ 输入:原始问题 q │ │ 输出:计划 P = (p1, p2, ..., pn) │ │ 公式:P = π_plan(q) │ └──────────────────┬───────────────────────┘ ▼ ┌──────────────────────────────────────────┐ │ 阶段二:执行 (Solve) │ │ 逐步执行,每步依赖原始问题+完整计划+历史结果 │ │ 公式:s_i = π_solve(q, P, (s1,...,s_{i-1}))│ │ 最终答案 = s_n │ └──────────────────────────────────────────┘4.3 关键组件
(1) Planner(规划器)
提示词设计要点:
角色:"顶级的AI规划专家"
任务:将复杂问题分解为简单步骤
格式约束:强制输出 Python 列表字符串(
python ...),极大简化解析解析方法:
ast.literal_eval安全执行字符串转列表
(2) Executor(执行器)
提示词包含四要素:
原始问题(保持目标 awareness)
完整计划(了解当前位置)
历史步骤与结果(作为当前步骤输入)
当前步骤(明确指示)
状态管理:每步执行后更新history字符串,格式为步骤 N: {step}\n结果: {result}
(3) PlanAndSolveAgent
采用"组合优于继承"原则
自身不含复杂逻辑,作为协调者调用 Planner 和 Executor
run(question)→planner.plan()→executor.execute()
4.4 适用场景
多步数学应用题(先列步骤再逐一求解)
需整合多信息源的报告撰写(先规划结构再填充)
代码生成任务(先构思结构再逐一实现)
五、Reflection 范式(4.4)
5.1 核心思想
为智能体引入"事后自我校正循环"。灵感来自 Shinn, Noah 的 Reflexion 框架(2023)。
与前两种范式的区别:ReAct 依赖外部工具反馈,Reflection 提供内部纠错回路,能修正更高层次的逻辑和策略错误。
5.2 三步循环:执行 → 反思 → 优化
┌─────────────┐ │ 执行初稿 O₀ │ └──────┬──────┘ ▼ ┌─────────────┐ │ 反思 F₀ │ ◀── 评审员角色,多维度评估 │ π_reflect │ └──────┬──────┘ ▼ ┌─────────────┐ │ 优化 O₁ │ ◀── 结合初稿+反馈生成修订稿 │ π_refine │ └──────┬──────┘ ▼ (循环直到"无需改进"或达到最大迭代次数)
形式化表达:
反思:
F_i = π_reflect(Task, O_i)优化:
O_{i+1} = π_refine(Task, O_i, F_i)
反思维度包括:事实性错误、逻辑漏洞、效率问题、遗漏信息
5.3 记忆模块(Memory)
为什么需要记忆?Reflection 对应信息的存储和提取,直接传入所有信息会产生冗余。
Memory 类核心方法:
add_record(type, content):添加记录('execution' 或 'reflection')get_trajectory():将所有记录序列化为文本,插入提示词get_last_execution():获取最新执行结果供反思
5.4 三种提示词设计
| 提示词 | 角色 | 目标 |
|---|---|---|
| INITIAL_PROMPT | 资深程序员 | 首次生成代码(初稿) |
| REFLECT_PROMPT | 极其严格的代码评审专家 | 专注算法效率,提出改进建议 |
| REFINE_PROMPT | 资深程序员 | 根据反馈优化代码 |
REFLECT_PROMPT 的关键设计:
角色设定为"极其严格的代码评审专家和资深算法工程师"
专注算法效率维度
要求分析时间复杂度
如果已最优则回答"无需改进"(作为终止信号)
5.5 ReflectionAgent 工作流
初始执行:生成初版代码,存入 Memory
迭代循环(max_iterations 次):
a. 反思:获取最新代码 → 生成反馈 → 存入 Memory
b. 检查终止:反馈包含"无需改进"则结束
c. 优化:结合代码+反馈 → 生成优化版 → 存入 Memory
返回最终代码
5.6 成本收益分析
| 维度 | 内容 |
|---|---|
| 成本 | 模型调用开销倍增(每轮至少 2 次额外调用)、任务延迟显著提高、提示工程复杂度上升 |
| 收益 | 解决方案质量跃迁(从"合格"到"优秀")、鲁棒性与可靠性增强 |
| 适用 | 对质量/准确性/可靠性要求极高、对实时性要求宽松的场景(关键业务代码、科研推演、决策支持) |
| 不适用 | 需要快速响应或"大致正确"即可的场景(此时 ReAct 或 Plan-and-Solve 更具性价比) |
六、三种范式对比总结
6.1 核心差异
| 维度 | ReAct | Plan-and-Solve | Reflection |
|---|---|---|---|
| 策略 | 走一步看一步 | 先规划后执行 | 自我反思迭代 |
| 规划方式 | 动态、步进式 | 静态、全局式 | 无独立规划 |
| 纠错来源 | 外部工具反馈 | 无(按计划执行) | 内部自我批判 |
| 执行效率 | 串行多次调用 | 串行多次调用 | 串行多次调用(更多轮) |
| 可解释性 | 高(Thought 链透明) | 中(计划清晰,执行过程简单) | 高(迭代轨迹完整) |
| 质量上限 | 中高 | 中 | 高(迭代优化) |
| 适用任务 | 探索性、需外部工具 | 结构化、逻辑路径确定 | 高质量要求、需深度优化 |
6.2 选择策略
需要外部信息/工具交互→ ReAct
任务可清晰分解、逻辑路径确定→ Plan-and-Solve
对结果质量有极高要求→ Reflection
复杂综合任务→ 组合使用(如 ReAct + Reflection)
七、核心知识点速查
7.1 公式速查
| 范式 | 核心公式 |
|---|---|
| ReAct | (th_t, a_t) = π(q, (a_1,o_1),...,(a_{t-1},o_{t-1}));o_t = T(a_t) |
| Plan-and-Solve | P = π_plan(q);s_i = π_solve(q, P, (s_1,...,s_{i-1})) |
| Reflection | F_i = π_reflect(Task, O_i);O_{i+1} = π_refine(Task, O_i, F_i) |
7.2 关键类速查
| 类名 | 职责 | 核心方法 |
|---|---|---|
| HelloAgentsLLM | LLM 客户端封装 | think(messages, temperature) |
| ToolExecutor | 工具管理器 | registerTool,getTool,getAvailableTools |
| ReActAgent | ReAct 智能体 | run(question),_parse_output,_parse_action |
| Planner | 规划器 | plan(question) |
| Executor | 执行器 | execute(question, plan) |
| PlanAndSolveAgent | Plan-and-Solve 智能体 | run(question) |
| Memory | 短期记忆模块 | add_record,get_trajectory,get_last_execution |
| ReflectionAgent | Reflection 智能体 | run(task),_get_llm_response |
7.3 参考论文
[1] Yao S, et al. ReAct: Synergizing reasoning and acting in language models. ICLR 2023.
[2] Wang L, et al. Plan-and-Solve Prompting. arXiv:2305.04091, 2023.
[3] Shinn N, et al. Reflexion: Language agents with verbal reinforcement learning. NeurIPS 2023.
八、习题要点提示
三种范式的本质区别:思考与行动的组织方式不同——ReAct 交织、Plan-and-Solve 分离、Reflection 叠加
智能家居控制助手:推荐 ReAct(需实时感知+动态调整),或 Plan-and-Solve + Reflection 组合
解析方法脆弱性:正则依赖固定格式,LLM 输出不稳定时易失败;替代方案:JSON 格式输出、Function Calling
工具扩展:添加计算器工具、工具选择失败处理、大规模工具的组织与检索(可考虑向量检索/分层分类)
动态重规划:执行阶段发现步骤不可完成时,将当前状态反馈给 Planner 重新生成计划
Reflection 多模型:强模型反思+快模型执行,可提升反思质量但增加协调复杂度
客服智能体设计:ReAct + Reflection 组合;工具包括订单查询、物流查询、邮件发送、退款政策查询
