智能体经典范式构建

这张主要介绍了三种经典的智能体范式

首先是==ReAct架构 ,他主要分为三个部分,第一步是thought(思考) ,这个是llm分析当前情况,分解当前任务,制定下一步计划或者反思之间返回来的上一步结果
然后就是action==,这个是根据thought的结果去调用外部工具(function calling/mcp)执行具体动作

然后是==plan-and-solve ==

他是把整个流程解耦成两个核心阶段,规划阶段和执行阶段
规划阶段,智能体接收用户的完整问题,将问题分解,制定一个清晰的计划
执行阶段,获得完整计划后,智能体进入执行阶段,严格按照计划中步骤,一步步执行,直至计划中所有步骤完成

然后是==reflection ,主要是三步循环:执行,反思,优化
首先是执行 (Execution)阶段 :智能体用ReAct/plan-and-solve,尝试完成任务,生成一个初步方案
然后是反思 (Reflection)阶段 :智能体进入反思阶段,调用一个独立的模型,扮演评审员,审视第一步生成的初稿,根据评估结果,生成一段结构化的反馈 ==

最后是优化阶段,智能体将初步方案和反馈作为新的上下文,生成一个新的修订稿

上面这个流程可以==循环往复==

现在主流的claude code框架不符合上面任何一种,详情

注意:function calling和mcp区别见[[function calling和mcp区别]]

为了更好地组织智能体的"思考"与"行动"过程,业界涌现出了多种经典的架构范式。在本章中,我们将聚焦于其中最具代表性的三种,并一步步从零实现它们:

  • ReAct (Reasoning and Acting): 一种将"思考"和"行动"紧密结合的范式,让智能体边想边做,动态调整。
  • Plan-and-Solve: 一种"三思而后行"的范式,智能体首先生成一个完整的行动计划,然后严格执行。
  • Reflection: 一种赋予智能体"反思"能力的范式,通过自我批判和修正来优化结果

市面上有langchian等框架,但还是手搭比较好,便于理解底层原理

4.1.1 安装依赖库

复制代码
pip install openai python-dotenv

4.1.2 配置 API 密钥

  1. 在你的项目根目录下,创建一个名为 .env 的文件。
  2. 在.ignore里面设置上传git的时候,不传env

4.2 ReAct

在准备好LLM客户端后,我们将构建第一个,也是最经典的一个智能体范式ReAct (Reason + Act)。ReAct由Shunyu Yao于2022年提出[1],其核心思想是模仿人类解决问题的方式,将推理 (Reasoning) 与行动 (Acting) 显式地结合起来,形成一个"思考-行动-观察"的循环

在ReAct诞生之前,主流的方法可以分为两类:一类是"纯思考"型,如思维链 (Chain-of-Thought),它能引导模型进行复杂的逻辑推理,但无法与外部世界交互,容易产生事实幻觉;另一类是"纯行动"型,模型直接输出要执行的动作,但缺乏规划和纠错能力。

ReAct的巧妙之处在于,它认识到思考与行动是相辅相成的。思考指导行动,而行动的结果又反过来修正思考。为此,ReAct范式通过一种特殊的提示工程来引导模型,使其每一步的输出都遵循一个固定的轨迹:

  • Thought (思考): 这是智能体的"内心独白"。它会分析当前情况、分解任务、制定下一步计划,或者反思上一步的结果。
  • Action (行动): 这是智能体决定采取的具体动作,通常是调用一个外部工具,例如 Search['华为最新款手机']
  • Observation (观察): 这是执行Action后从外部工具返回的结果,例如搜索结果的摘要或API的返回值。

智能体将不断重复这个 Thought -> Action -> Observation 的循环,将新的观察结果追加到历史记录中,形成一个不断增长的上下文,直到它在Thought中认为已经找到了最终答案,然后输出结果。这个过程形成了一个强大的协同效应:推理使得行动更具目的性,而行动则为推理提供了事实依据。

![[Pasted image 20260113201549.png]]

这种机制特别适用于以下场景:

  • 需要外部知识的任务:如查询实时信息(天气、新闻、股价)、搜索专业领域的知识等。
  • 需要精确计算的任务:将数学问题交给计算器工具,避免LLM的计算错误。
  • 需要与API交互的任务:如操作数据库、调用某个服务的API来完成特定功能。

4.2.2 工具的定义与实现

如果说大语言模型是智能体的大脑,那么工具 (Tools) 就是其与外部世界交互的"手和脚"。为了让ReAct范式能够真正解决我们设定的问题,智能体需要具备调用外部工具的能力。

针对本节设定的目标------回答关于"华为最新手机"的问题,我们需要为智能体提供一个网页搜索工具。在这里我们选用 SerpApi ,它通过API提供结构化的Google搜索结果,能直接返回"答案摘要框"或精确的知识图谱信息,

接下来,我们通过代码来定义和管理这个工具。我们将分步进行:首先实现工具的核心功能,然后构建一个通用的工具管理器。

(1)实现搜索工具的核心逻辑

一个良好定义的工具应包含以下三个核心要素:

  1. 名称 (Name) : 一个简洁、唯一的标识符,供智能体在 Action 中调用,例如 Search
  2. 描述 (Description) : 一段清晰的自然语言描述,说明这个工具的用途。这是整个机制中最关键的部分,因为大语言模型会依赖这段描述来判断何时使用哪个工具。
  3. 执行逻辑 (Execution Logic): 真正执行任务的函数或方法。

我们的第一个工具是 search 函数,它的作用是接收一个查询字符串,然后返回搜索结果。

(2)构建通用的工具执行器

当智能体需要使用多种工具时(例如,除了搜索,还可能需要计算、查询数据库等),我们需要一个统一的管理器来注册和调度这些工具。为此,我们创建一个 ToolExecutor 类。

(3)测试

现在,我们将 search 工具注册到 ToolExecutor 中,并模拟一次调用,以验证整个流程是否正常工作。

4.2.4 ReAct 的特点、局限性与调试技巧

通过亲手实现一个 ReAct 智能体,我们不仅掌握了其工作流程,也应该对其内在机制有了更深刻的认识。任何技术范式都有其闪光点和待改进之处,本节将对 ReAct 进行总结。

(1)ReAct 的主要特点

  1. 高可解释性ReAct 最大的优点之一就是透明。通过 Thought 链,我们可以清晰地看到智能体每一步的"心路历程"------它为什么会选择这个工具,下一步又打算做什么。这对于理解、信任和调试智能体的行为至关重要。
  2. 动态规划与纠错能力 :与一次性生成完整计划的范式不同,ReAct 是"走一步,看一步"。它根据每一步从外部世界获得的 Observation 来动态调整后续的 ThoughtAction。如果上一步的搜索结果不理想,它可以在下一步中修正搜索词,重新尝试。
  3. 工具协同能力:ReAct 范式天然地将大语言模型的推理能力与外部工具的执行能力结合起来。LLM 负责运筹帷幄(规划和推理),工具负责解决具体问题(搜索、计算),二者协同工作,突破了单一 LLM 在知识时效性、计算准确性等方面的固有局限。

(2)ReAct 的固有局限性

  1. 对LLM自身能力的强依赖 :ReAct 流程的成功与否,高度依赖于底层 LLM 的综合能力。如果 LLM 的逻辑推理能力、指令遵循能力或格式化输出能力不足,就很容易在 Thought 环节产生错误的规划,或者在 Action 环节生成不符合格式的指令,导致整个流程中断。
  2. 执行效率问题:由于其循序渐进的特性,完成一个任务通常需要多次调用 LLM。每一次调用都伴随着网络延迟和计算成本。对于需要很多步骤的复杂任务,这种串行的"思考-行动"循环可能会导致较高的总耗时和费用。
  3. 提示词的脆弱性:整个机制的稳定运行建立在一个精心设计的提示词模板之上。模板中的任何微小变动,甚至是用词的差异,都可能影响 LLM 的行为。此外,并非所有模型都能持续稳定地遵循预设的格式,这增加了在实际应用中的不确定性。
  4. 可能陷入局部最优 :步进式的决策模式意味着智能体缺乏一个全局的、长远的规划。它可能会因为眼前的 Observation 而选择一个看似正确但长远来看并非最优的路径,甚至在某些情况下陷入"原地打转"的循环中。

(3)调试技巧

当你构建的 ReAct 智能体行为不符合预期时,可以从以下几个方面入手进行调试:

  • 检查完整的提示词:在每次调用 LLM 之前,将最终格式化好的、包含所有历史记录的完整提示词打印出来。这是追溯 LLM 决策源头的最直接方式。
  • 分析原始输出 :当输出解析失败时(例如,正则表达式没有匹配到 Action),务必将 LLM 返回的原始、未经处理的文本打印出来。这能帮助你判断是 LLM 没有遵循格式,还是你的解析逻辑有误。
  • 验证工具的输入与输出 :检查智能体生成的 tool_input 是否是工具函数所期望的格式,同时也要确保工具返回的 observation 格式是智能体可以理解和处理的。
  • 调整提示词中的示例 (Few-shot Prompting):如果模型频繁出错,可以在提示词中加入一两个完整的"Thought-Action-Observation"成功案例,通过示例来引导模型更好地遵循你的指令。
  • 尝试不同的模型或参数 :更换一个能力更强的模型,或者调整 temperature 参数(通常设为0以保证输出的确定性),有时能直接解决问题。

4.3 Plan-and-Solve

在我们掌握了 ReAct 这种反应式的、步进决策的智能体范式后,接下来将探讨一种风格迥异但同样强大的方法,Plan-and-Solve 。顾名思义,这种范式将任务处理明确地分为两个阶段:先规划 (Plan),后执行 (Solve)

如果说 ReAct 像一个经验丰富的侦探,根据现场的蛛丝马迹(Observation)一步步推理,随时调整自己的调查方向;那么 Plan-and-Solve 则更像一位建筑师,在动工之前必须先绘制出完整的蓝图(Plan),然后严格按照蓝图来施工(Solve)。事实上我们现在用的很多大模型工具的Agent模式都融入了这种设计模式。

4.3.1 Plan-and-Solve 的工作原理

Plan-and-Solve Prompting 由 Lei Wang 在2023年提出[2]。其核心动机是为了解决思维链在处理多步骤、复杂问题时容易"偏离轨道"的问题。

与 ReAct 将思考和行动融合在每一步不同,Plan-and-Solve 将整个流程解耦为两个核心阶段,如图4.2所示:

  1. 规划阶段 (Planning Phase) : 首先,智能体会接收用户的完整问题。它的第一个任务不是直接去解决问题或调用工具,而是将问题分解,并制定出一个清晰、分步骤的行动计划。这个计划本身就是一次大语言模型的调用产物。
  2. 执行阶段 (Solving Phase) : 在获得完整的计划后,智能体进入执行阶段。它会严格按照计划中的步骤,逐一执行 。每一步的执行都可能是一次独立的 LLM 调用,或者是对上一步结果的加工处理,直到计划中的所有步骤都完成,最终得出答案。
    ![[Pasted image 20260113204635.png]]
    ![[Pasted image 20260113204640.png]]
    Plan-and-Solve 尤其适用于那些结构性强、可以被清晰分解的复杂任务,例如:
  • 多步数学应用题:需要先列出计算步骤,再逐一求解。
  • 需要整合多个信息源的报告撰写:需要先规划好报告结构(引言、数据来源A、数据来源B、总结),再逐一填充内容。
  • 代码生成任务:需要先构思好函数、类和模块的结构,再逐一实现。

4.3.2 规划阶段

为了凸显 Plan-and-Solve 范式在结构化推理任务上的优势,我们将不使用工具的方式,而是通过提示词的设计,完成一个推理任务。

这类任务的特点是,答案无法通过单次查询或计算得出,必须先将问题分解为一系列逻辑连贯的子步骤,然后按顺序求解。这恰好能发挥 Plan-and-Solve "先规划,后执行"的核心能力。

我们的目标问题是:"一个水果店周一卖出了15个苹果。周二卖出的苹果数量是周一的两倍。周三卖出的数量比周二少了5个。请问这三天总共卖出了多少个苹果?"

这个问题对于大语言模型来说并不算特别困难,但它包含了一个清晰的逻辑链条可供参考。在某些实际的逻辑难题上,如果大模型不能高质量的推理出准确的答案,可以参考这个设计模式来设计自己的Agent完成任务。智能体需要:

  1. 规划阶段:首先,将问题分解为三个独立的计算步骤(计算周二销量、计算周三销量、计算总销量)。
  2. 执行阶段:然后,严格按照计划,一步步执行计算,并将每一步的结果作为下一步的输入,最终得出总和。

4.3.3 执行器与状态管理

在规划器 (Planner) 生成了清晰的行动蓝图后,我们就需要一个执行器 (Executor) 来逐一完成计划中的任务。执行器不仅负责调用大语言模型来解决每个子问题,还承担着一个至关重要的角色:状态管理。它必须记录每一步的执行结果,并将其作为上下文提供给后续步骤,确保信息在整个任务链条中顺畅流动

执行器的提示词与规划器不同。它的目标不是分解问题,而是在已有上下文的基础上,专注解决当前这一个步骤。因此,提示词需要包含以下关键信息:

  • 原始问题: 确保模型始终了解最终目标。
  • 完整计划: 让模型了解当前步骤在整个任务中的位置。
  • 历史步骤与结果: 提供至今为止已经完成的工作,作为当前步骤的直接输入。
  • 当前步骤: 明确指示模型现在需要解决哪一个具体任务。

## 4.4 Reflection

在我们已经实现的 ReAct 和 Plan-and-Solve 范式中,智能体一旦完成了任务,其工作流程便告结束。然而,它们生成的初始答案,无论是行动轨迹还是最终结果,都可能存在谬误或有待改进之处。Reflection 机制的核心思想,正是为智能体引入一种==事后(post-hoc)的自我校正循环==,使其能够像人类一样,审视自己的工作,发现不足,并进行迭代优化。

4.4.1 Reflection 机制的核心思想

Reflection 机制的灵感来源于人类的学习过程:我们完成初稿后会进行校对,解出数学题后会进行验算。这一思想在多个研究中得到了体现,例如 Shinn, Noah 在2023年提出的 Reflexion 框架[3]。其核心工作流程可以概括为一个简洁的三步循环:执行 -> 反思 -> 优化

  1. 执行 (Execution):首先,智能体使用我们熟悉的方法(如 ReAct 或 Plan-and-Solve)尝试完成任务,生成一个初步的解决方案或行动轨迹。这可以看作是"初稿"。
  2. 反思 (Reflection) :接着,智能体进入反思阶段。它会调用一个独立的、或者带有特殊提示词的大语言模型实例,来扮演一个"评审员"的角色。这个"评审员"会审视第一步生成的"初稿",并从多个维度进行评估,例如:
    • 事实性错误:是否存在与常识或已知事实相悖的内容?
    • 逻辑漏洞:推理过程是否存在不连贯或矛盾之处?
    • 效率问题:是否有更直接、更简洁的路径来完成任务?
    • 遗漏信息 :是否忽略了问题的某些关键约束或方面? 根据评估,它会生成一段结构化的反馈 (Feedback),指出具体的问题所在和改进建议。
  3. 优化 (Refinement) :最后,智能体将"初稿"和"反馈"作为新的上下文,再次调用大语言模型,要求它根据反馈内容对初稿进行修正,生成一个更完善的"修订稿"。
    ![[Pasted image 20260113210943.png]]
    ![[Pasted image 20260113210948.png]]与前两种范式相比,Reflection 的价值在于:
  • 它为智能体提供了一个内部纠错回路,使其不再完全依赖于外部工具的反馈(ReAct 的 Observation),从而能够修正更高层次的逻辑和策略错误。
  • 它将一次性的任务执行,转变为一个持续优化的过程,显著提升了复杂任务的最终成功率和答案质量。
  • 它为智能体构建了一个临时的**"短期记忆"。整个"执行-反思-优化"的轨迹形成了一个宝贵的经验记录,智能体不仅知道最终答案,还记得自己是如何从有缺陷的初稿迭代到最终版本的。更进一步,这个记忆系统还可以是多模态的**,允许智能体反思和修正文本以外的输出(如代码、图像等),为构建更强大的多模态智能体奠定了基础。

4.4.3 Reflection 智能体的编码实现

有了 Memory 模块作为基础,我们现在可以着手构建 ReflectionAgent 的核心逻辑。整个智能体的工作流程将围绕我们之前讨论的"执行-反思-优化"循环展开,并通过精心设计的提示词来引导大语言模型扮演不同的角色。

(1)提示词设计

与之前的范式不同,Reflection 机制需要多个不同角色的提示词来协同工作。

  1. 初始执行提示词 (Execution Prompt) :这是智能体首次尝试解决问题的提示词,内容相对直接,只要求模型完成指定任务。

    INITIAL_PROMPT_TEMPLATE = """
    你是一位资深的Python程序员。请根据以下要求,编写一个Python函数。
    你的代码必须包含完整的函数签名、文档字符串,并遵循PEP 8编码规范。

    要求: {task}

    请直接输出代码,不要包含任何额外的解释。
    """

  2. 反思提示词 (Reflection Prompt) :这个提示词是 Reflection 机制的灵魂。它指示模型扮演"代码评审员"的角色,对上一轮生成的代码进行批判性分析,并提供具体的、可操作的反馈。

    REFLECT_PROMPT_TEMPLATE = """
    你是一位极其严格的代码评审专家和资深算法工程师,对代码的性能有极致的要求。
    你的任务是审查以下Python代码,并专注于找出其在算法效率上的主要瓶颈。

    原始任务:

    {task}

    待审查的代码:

    python 复制代码
    {code}

    请分析该代码的时间复杂度,并思考是否存在一种算法上更优的解决方案来显著提升性能。
    如果存在,请清晰地指出当前算法的不足,并提出具体的、可行的改进算法建议(例如,使用筛法替代试除法)。
    如果代码在算法层面已经达到最优,才能回答"无需改进"。

    请直接输出你的反馈,不要包含任何额外的解释。
    """

  3. 优化提示词 (Refinement Prompt) :当收到反馈后,这个提示词将引导模型根据反馈内容,对原有代码进行修正和优化。

    REFINE_PROMPT_TEMPLATE = """
    你是一位资深的Python程序员。你正在根据一位代码评审专家的反馈来优化你的代码。

    原始任务:

    {task}

    你上一轮尝试的代码:

    {last_code_attempt}
    评审员的反馈:
    {feedback}

    请根据评审员的反馈,生成一个优化后的新版本代码。
    你的代码必须包含完整的函数签名、文档字符串,并遵循PEP 8编码规范。
    请直接输出优化后的代码,不要包含任何额外的解释。
    """

4.4.5 Reflection 机制的成本收益分析

尽管 Reflection 机制在提升任务解决质量上表现出色,但这种能力的获得并非没有代价。在实际应用中,我们需要权衡其带来的收益与相应的成本。

(1)主要成本

  1. 模型调用开销增加:这是最直接的成本。每进行一轮迭代,至少需要额外调用两次大语言模型(一次用于反思,一次用于优化)。如果迭代多轮,API 调用成本和计算资源消耗将成倍增加。

  2. 任务延迟显著提高:Reflection 是一个串行过程,每一轮的优化都必须等待上一轮的反思完成。这使得任务的总耗时显著延长,不适合对实时性要求高的场景。

  3. 提示工程复杂度上升:如我们的案例所示,Reflection 的成功在很大程度上依赖于高质量、有针对性的提示词。为"执行"、"反思"、"优化"等不同阶段设计和调试有效的提示词,需要投入更多的开发精力。

(2)核心收益

  1. 解决方案质量的跃迁:最大的收益在于,它能将一个"合格"的初始方案,迭代优化成一个"优秀"的最终方案。这种从功能正确到性能高效、从逻辑粗糙到逻辑严谨的提升,在很多关键任务中是至关重要的。

  2. 鲁棒性与可靠性增强:通过内部的自我纠错循环,智能体能够发现并修复初始方案中可能存在的逻辑漏洞、事实性错误或边界情况处理不当等问题,从而大大提高了最终结果的可靠性。

综上所述,Reflection 机制是一种典型的"以成本换质量"的策略。它非常适合那些对最终结果的质量、准确性和可靠性有极高要求,且对任务完成的实时性要求相对宽松的场景。例如:

  • 生成关键的业务代码或技术报告。
  • 在科学研究中进行复杂的逻辑推演。
  • 需要深度分析和规划的决策支持系统。

4.5 本章小结

在本章中,以第三章掌握的大语言模型知识为基础,我们通过"亲手造轮子"的方式,从零开始编码实现了三种业界经典的智能体构建范式:ReAct、Plan-and-Solve 与 Reflection。我们不仅探索了它们的核心工作原理,还通过具体的实战案例,深入了解了各自的优势、局限与适用场景。

核心知识点回顾:

  1. ReAct:我们构建了一个能与外部世界交互的 ReAct 智能体。通过"思考-行动-观察"的动态循环,它成功地利用搜索引擎回答了自身知识库无法覆盖的实时性问题。其核心优势在于环境适应性动态纠错能力,使其成为处理探索性、需要外部工具输入的任务的首选。
  2. Plan-and-Solve:我们实现了一个先规划后执行的 Plan-and-Solve 智能体,并利用它解决了需要多步推理的数学应用题。它将复杂的任务分解为清晰的步骤,然后逐一执行。其核心优势在于结构性稳定性,特别适合处理逻辑路径确定、内部推理密集的任务。
  3. Reflection (自我反思与迭代):我们构建了一个具备自我优化能力的 Reflection 智能体。通过引入"执行-反思-优化"的迭代循环,它成功地将一个效率较低的初始代码方案,优化为了一个算法上更优的高性能版本。其核心价值在于能显著提升解决方案的质量,适用于对结果的准确性和可靠性有极高要求的场景。

本章探讨的三种范式,代表了智能体解决问题的三种不同策略,如表4.1所示。在实际应用中,选择哪一种,取决于任务的核心需求:

![[Pasted image 20260113213939.png]]

相关推荐
小雨下雨的雨2 小时前
Flutter鸿蒙共赢——色彩的流变:流体梯度网格与现代视觉重构
算法·flutter·华为·重构·交互·harmonyos·鸿蒙
Swift社区2 小时前
LeetCode 473 火柴拼正方形 - Swift 题解
算法·leetcode·swift
Allen_LVyingbo2 小时前
面向“病历生成 + CDI/ICD”多智能体系统的选型策略与落地实践(三)
算法·自然语言处理·性能优化·知识图谱·健康医疗·柔性数组
金枪不摆鳍2 小时前
算法-链表双指针
数据结构·算法·链表
MarkHD2 小时前
智能体在车联网中的应用:第53天 基于CTDE-MAPPO的快速路合流区协同驾驶项目蓝图(SUMO路网与智能体设计篇)
算法
南行*2 小时前
逆向中的Hash类算法
算法·网络安全·哈希算法
高洁012 小时前
AI智能体搭建(2)
人工智能·深度学习·算法·机器学习·知识图谱
木易 士心2 小时前
加密与编码算法全解:从原理到精通(Java & JS 实战版)
java·javascript·算法
金融RPA机器人丨实在智能2 小时前
通用Agent智能体有哪些?国内优选实在Agent、扣子,国际优选ChatGPT Agents、Microsoft Copilot
agent·实在智能·实在agent