news 2026/6/24 8:58:39

一 智能体经典范式构建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一 智能体经典范式构建

智能体经典范式构建 — 学习笔记

来源:《Hello Agents》第四章 | 核心主题:从零实现 ReAct、Plan-and-Solve、Reflection 三大智能体范式


一、章节定位与学习目标

本章承上启下:上一章讲解了 LLM 的 Transformer 架构与交互方法,本章将这些理论转化为实践——亲手构建智能体。

为什么要"重复造轮子"?

  1. 直接使用高度抽象的框架(LangChain、LlamaIndex)不利于理解底层设计机制

  2. 亲手处理工程问题(输出解析、重试、防死循环)是培养系统设计能力最直接的方式

  3. 掌握设计原理后,才能从"使用者"转变为"创造者",具备深度定制能力

本章三大范式一览:

范式核心策略比喻
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 工具的智能解析策略:

  1. 优先返回answer_box(Google 答案摘要框)

  2. 其次返回knowledge_graph(知识图谱描述)

  3. 最后返回前 3 条organic_results摘要

(2) ToolExecutor 工具管理器
  • registerTool(name, description, func):注册工具

  • getTool(name):获取工具执行函数

  • getAvailableTools():格式化输出所有工具描述

(3) ReActAgent 核心类

系统提示词设计要点:

  • 角色定义:"有能力调用外部工具的智能助手"

  • 动态注入工具清单{tools}

  • 强制输出格式:Thought:+Action:

  • Action 格式:ToolName[input]Finish[最终答案]

核心循环逻辑(run 方法):

  1. 格式化提示词(工具描述 + 问题 + 历史)

  2. 调用 LLM 进行思考

  3. 解析输出(正则提取 Thought 和 Action)

  4. 执行 Action(Finish 则结束,否则调用工具)

  5. 将 Action + Observation 追加到 history

  6. 循环直到 Finish 或达到 max_steps

输出解析器:

  • _parse_output:正则r"Thought:\s*(.*?)(?=\nAction:|$)"提取 Thought

  • _parse_action:正则r"(\w+)\[(.*)\]"提取工具名和输入

3.4 特点与局限性

维度特点
优势高可解释性(Thought 链透明)、动态规划与纠错、工具协同能力
局限强依赖 LLM 能力、串行执行效率低、提示词脆弱、可能陷入局部最优

3.5 调试技巧

  1. 打印完整提示词:追溯 LLM 决策源头

  2. 分析原始输出:判断是 LLM 未遵循格式还是解析逻辑有误

  3. 验证工具输入输出:检查格式兼容性

  4. 添加 Few-shot 示例:引导模型遵循格式

  5. 调整模型或参数:更换更强模型,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 工作流

  1. 初始执行:生成初版代码,存入 Memory

  2. 迭代循环(max_iterations 次):

    • a. 反思:获取最新代码 → 生成反馈 → 存入 Memory

    • b. 检查终止:反馈包含"无需改进"则结束

    • c. 优化:结合代码+反馈 → 生成优化版 → 存入 Memory

  3. 返回最终代码

5.6 成本收益分析

维度内容
成本模型调用开销倍增(每轮至少 2 次额外调用)、任务延迟显著提高、提示工程复杂度上升
收益解决方案质量跃迁(从"合格"到"优秀")、鲁棒性与可靠性增强
适用对质量/准确性/可靠性要求极高、对实时性要求宽松的场景(关键业务代码、科研推演、决策支持)
不适用需要快速响应或"大致正确"即可的场景(此时 ReAct 或 Plan-and-Solve 更具性价比)

六、三种范式对比总结

6.1 核心差异

维度ReActPlan-and-SolveReflection
策略走一步看一步先规划后执行自我反思迭代
规划方式动态、步进式静态、全局式无独立规划
纠错来源外部工具反馈无(按计划执行)内部自我批判
执行效率串行多次调用串行多次调用串行多次调用(更多轮)
可解释性高(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-SolveP = π_plan(q)s_i = π_solve(q, P, (s_1,...,s_{i-1}))
ReflectionF_i = π_reflect(Task, O_i)O_{i+1} = π_refine(Task, O_i, F_i)

7.2 关键类速查

类名职责核心方法
HelloAgentsLLMLLM 客户端封装think(messages, temperature)
ToolExecutor工具管理器registerTool,getTool,getAvailableTools
ReActAgentReAct 智能体run(question),_parse_output,_parse_action
Planner规划器plan(question)
Executor执行器execute(question, plan)
PlanAndSolveAgentPlan-and-Solve 智能体run(question)
Memory短期记忆模块add_record,get_trajectory,get_last_execution
ReflectionAgentReflection 智能体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.


八、习题要点提示

  1. 三种范式的本质区别:思考与行动的组织方式不同——ReAct 交织、Plan-and-Solve 分离、Reflection 叠加

  2. 智能家居控制助手:推荐 ReAct(需实时感知+动态调整),或 Plan-and-Solve + Reflection 组合

  3. 解析方法脆弱性:正则依赖固定格式,LLM 输出不稳定时易失败;替代方案:JSON 格式输出、Function Calling

  4. 工具扩展:添加计算器工具、工具选择失败处理、大规模工具的组织与检索(可考虑向量检索/分层分类)

  5. 动态重规划:执行阶段发现步骤不可完成时,将当前状态反馈给 Planner 重新生成计划

  6. Reflection 多模型:强模型反思+快模型执行,可提升反思质量但增加协调复杂度

  7. 客服智能体设计:ReAct + Reflection 组合;工具包括订单查询、物流查询、邮件发送、退款政策查询

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 8:57:11

包管理器用法速查

前言 不同的操作系统、编程语言几乎都有自己的包管理器,而每种包管理器的命令用法虽都大同小异,但还是有些区别的。为了避免在面临各种命令时出现一个头两个大的情况,特为此专门整理一份简要手册,以便随用随查。 1、Linux 类 Li…

作者头像 李华
网站建设 2026/6/24 8:49:34

iOS 代码混淆工具对比 从源码级混淆到 IPA 直接加固

我注意到一个现象:团队里好几个同事在提测 IPA 之前都会问一句"代码混淆做了没",但真问到具体用的什么方案、做到什么程度,又都说不太清楚。我之前也一样,直到有次把自己打出来的 IPA 拖进 Hopper 看了一眼——类名、方…

作者头像 李华
网站建设 2026/6/24 8:42:47

AVR单片机JTAG与边界扫描技术:从原理到硬件调试实战

1. 项目概述:从“黑盒子”到“透明调试”在嵌入式开发的早期,调试一个单片机程序,尤其是当它焊死在电路板上、程序跑飞或者IO口状态异常时,那种感觉就像面对一个“黑盒子”。你只能通过有限的串口打印信息,或者观察几个…

作者头像 李华
网站建设 2026/6/24 8:39:09

AVR XMEGA A3U嵌入式开发实战:从GPIO、AES加密到ADC高精度采集

1. 项目概述:为什么是AVR XMEGA A3U?在嵌入式开发的广阔世界里,当你需要一款性能强劲、外设丰富且兼顾安全性的8位微控制器时,AVR XMEGA系列,特别是A3U型号,绝对是一个绕不开的经典选择。它不像某些32位MCU…

作者头像 李华
网站建设 2026/6/24 8:36:27

基于ATAK51003-V1的汽车无钥匙进入系统开发实战指南

1. 项目概述:从一块核心芯片到一套完整系统最近几年,但凡接触过汽车电子,尤其是车身控制领域的朋友,对“无钥匙进入与启动系统”一定不陌生。它早已从高端车的专属配置,飞入寻常百姓家,成为提升用户体验的关…

作者头像 李华
网站建设 2026/6/24 8:35:14

从芯片到系统:基于Microchip BB15L61A霍尔传感器的评估与应用实战

1. 项目概述:从一颗芯片到一个完整的评估生态最近在做一个智能家居的小项目,需要检测窗户的开合状态,最初想用简单的磁簧开关,但考虑到长期使用的可靠性和安装的便利性,就把目光投向了非接触式的霍尔传感器。在选型的时…

作者头像 李华