欢迎光临
我们一直在努力

Agent智能体:从原理到实战

Agent智能体:从原理到实战,从”对话助手“升级为”执行专家“,掌握智能体核心技术的七大模块。

1️⃣ Agent核心概念与架构——建立系统认知

2️⃣ 与传统程序的核心差异——理解范式革命

3️⃣ Function Calling机制详解——让AI调用工具

4️⃣ ReAct运行模式全解析——思考与行动的循环

5️⃣ Plan And Execute模式——复杂任务拆解与执行

6️⃣ LangChain搭建实战——手把手构建你的第一个Agent

7️⃣ 商业化落地应用场景——探索AI智能体的无限可能

我们提供一份全面的关于Agent智能体的方案,涵盖七个模块:核心概念与架构、与传统程序差异、Function Calling、ReAct模式、Plan And Execute、LangChain搭建实战、商业化落地。

这个要求非常全面,需要构建一个完整的教程和示例项目。我们需要组织内容,确保每个模块都涵盖,并最终提供一个可运行的代码示例,可能基于LangChain或自定义实现。由于要求“从原理到实战”,并且包含“LangChain搭建实战”,我们可以基于LangChain来构建一个智能体,同时解释底层原理。我们需要提供UML类图、时序图等。

任务分解:

  • 整体介绍:Agent定义、七大模块概述。

  • 核心概念与架构:智能体的组成部分(感知、规划、记忆、工具、推理、执行、反思),并给出UML类图。

  • 与传统程序差异:对比传统程序与智能体的区别(输入输出、控制流、学习能力、适应性等)。

  • Function Calling机制:解释其原理,在LLM中如何调用工具,展示函数定义格式,示例。

  • ReAct模式:详细解析ReAct框架(Reason+Act),结合LLM的思考过程,UML时序图展示循环。

  • Plan And Execute:介绍计划与执行分离的模式,如何将复杂任务分解为步骤,UML时序图。

  • LangChain搭建实战:用LangChain实现一个完整的智能体,包括工具定义、代理初始化、对话管理。提供项目结构,代码。

  • 商业化落地:讨论实际应用场景(客服、自动化办公、数据分析等),以及挑战与对策。

  • 我们需要确保提供完整源代码实现,并能在本地运行。最好使用LangChain的最新版本。我们将创建一个示例Agent,具备计算、天气查询、发送邮件等工具,使用OpenAI API。

    注意:我们使用Mermaid语法绘制UML图。

    最终应是一个完整的文档,包含标题、各个章节、代码块、图表。我们还需要提供项目文件结构组织。

    下面开始构建。

    Agent智能体:从原理到实战 —— 掌握智能体核心技术的七大模块

    📚 目录

  • Agent核心概念与架构——建立系统认知
  • 与传统程序的核心差异——理解范式革命
  • Function Calling机制详解——让AI调用工具
  • ReAct运行模式全解析——思考与行动的循环
  • Plan And Execute模式——复杂任务拆解与执行
  • LangChain搭建实战——手把手构建你的第一个Agent
  • 商业化落地应用场景——探索AI智能体的无限可能

  • 1. Agent核心概念与架构——建立系统认知

    智能体(Agent)是一种能够感知环境、进行决策并执行动作的实体。在AI领域,大语言模型驱动的智能体将LLM作为“大脑”,通过集成规划、记忆、工具使用等模块,实现从“对话”到“执行”的跨越。

    1.1 七大核心模块

    一个完整的智能体通常包含以下七个模块,它们协同工作:

    模块职责类比人类
    感知模块 接收并解析输入(文本、语音、图像等),提取意图和参数 眼睛/耳朵
    规划模块 将复杂任务分解为可执行的子任务序列 前额叶皮层
    工具模块 封装可调用的外部能力(API、函数、数据库) 手/工具
    记忆模块 存储短期对话历史与长期知识 海马体
    推理模块 基于当前状态、记忆和工具,决定下一步行动 大脑皮层
    执行模块 实际调用工具或执行动作,获取结果 肌肉/效应器
    反思与学习模块 根据执行结果优化策略,积累经验 反思与学习

    1.2 系统架构UML类图

    以下用Mermaid绘制智能体核心类之间的关系:

    #mermaid-svg-BxMGodq6OU6g0WpL{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BxMGodq6OU6g0WpL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BxMGodq6OU6g0WpL .error-icon{fill:#552222;}#mermaid-svg-BxMGodq6OU6g0WpL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BxMGodq6OU6g0WpL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BxMGodq6OU6g0WpL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BxMGodq6OU6g0WpL .marker.cross{stroke:#333333;}#mermaid-svg-BxMGodq6OU6g0WpL svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BxMGodq6OU6g0WpL p{margin:0;}#mermaid-svg-BxMGodq6OU6g0WpL g.classGroup text{fill:#9370DB;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-BxMGodq6OU6g0WpL g.classGroup text .title{font-weight:bolder;}#mermaid-svg-BxMGodq6OU6g0WpL .nodeLabel,#mermaid-svg-BxMGodq6OU6g0WpL .edgeLabel{color:#131300;}#mermaid-svg-BxMGodq6OU6g0WpL .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-BxMGodq6OU6g0WpL .label text{fill:#131300;}#mermaid-svg-BxMGodq6OU6g0WpL .labelBkg{background:#ECECFF;}#mermaid-svg-BxMGodq6OU6g0WpL .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-BxMGodq6OU6g0WpL .classTitle{font-weight:bolder;}#mermaid-svg-BxMGodq6OU6g0WpL .node rect,#mermaid-svg-BxMGodq6OU6g0WpL .node circle,#mermaid-svg-BxMGodq6OU6g0WpL .node ellipse,#mermaid-svg-BxMGodq6OU6g0WpL .node polygon,#mermaid-svg-BxMGodq6OU6g0WpL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BxMGodq6OU6g0WpL .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL g.clickable{cursor:pointer;}#mermaid-svg-BxMGodq6OU6g0WpL g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-BxMGodq6OU6g0WpL g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-BxMGodq6OU6g0WpL .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-BxMGodq6OU6g0WpL .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-BxMGodq6OU6g0WpL .dashed-line{stroke-dasharray:3;}#mermaid-svg-BxMGodq6OU6g0WpL .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-BxMGodq6OU6g0WpL #compositionStart,#mermaid-svg-BxMGodq6OU6g0WpL .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #compositionEnd,#mermaid-svg-BxMGodq6OU6g0WpL .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #dependencyStart,#mermaid-svg-BxMGodq6OU6g0WpL .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #dependencyStart,#mermaid-svg-BxMGodq6OU6g0WpL .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #extensionStart,#mermaid-svg-BxMGodq6OU6g0WpL .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #extensionEnd,#mermaid-svg-BxMGodq6OU6g0WpL .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #aggregationStart,#mermaid-svg-BxMGodq6OU6g0WpL .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #aggregationEnd,#mermaid-svg-BxMGodq6OU6g0WpL .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #lollipopStart,#mermaid-svg-BxMGodq6OU6g0WpL .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL #lollipopEnd,#mermaid-svg-BxMGodq6OU6g0WpL .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-BxMGodq6OU6g0WpL .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-BxMGodq6OU6g0WpL .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BxMGodq6OU6g0WpL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BxMGodq6OU6g0WpL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BxMGodq6OU6g0WpL :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    注册管理

    使用

    调用

    Agent

    -perception: Perception

    -planner: Planner

    -reasoning: Reasoning

    -executor: Executor

    -memory: Memory

    -reflector: Reflector

    -tools: dict[str, Tool]

    +register_tool(tool: Tool)

    +run(user_input: str) : -> str

    Perception

    +parse(input: str) : -> UserRequest

    Planner

    +create_plan(goal: str, tools: dict) : -> Plan

    Reasoning

    -llm: BaseLLM

    +decide(state: State) : -> Action

    Executor

    +execute(action: Action, tools: dict) : -> Observation

    Memory

    -short_term: list[Message]

    -long_term: dict

    +add_message(msg: Message)

    +get_context() : -> list[Message]

    Reflector

    +reflect(task_history: list) : -> str

    «abstract»

    Tool

    +name: str

    +description: str

    +execute(params: dict) : -> str

    «abstract»

    BaseLLM

    +generate(prompt: str) : -> str

    1.3 模块协作流程

    当用户输入一个问题,智能体的工作流程如下(UML时序图):

    Reflector

    Tool

    Memory

    Executor

    Reasoning

    Planner

    Perception

    Agent

    User

    Reflector

    Tool

    Memory

    Executor

    Reasoning

    Planner

    Perception

    Agent

    User

    #mermaid-svg-jwMJFHk4ZOyMAGBK{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jwMJFHk4ZOyMAGBK .error-icon{fill:#552222;}#mermaid-svg-jwMJFHk4ZOyMAGBK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jwMJFHk4ZOyMAGBK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jwMJFHk4ZOyMAGBK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jwMJFHk4ZOyMAGBK .marker.cross{stroke:#333333;}#mermaid-svg-jwMJFHk4ZOyMAGBK svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jwMJFHk4ZOyMAGBK p{margin:0;}#mermaid-svg-jwMJFHk4ZOyMAGBK .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jwMJFHk4ZOyMAGBK text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-jwMJFHk4ZOyMAGBK .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-jwMJFHk4ZOyMAGBK .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-jwMJFHk4ZOyMAGBK #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-jwMJFHk4ZOyMAGBK .sequenceNumber{fill:white;}#mermaid-svg-jwMJFHk4ZOyMAGBK #sequencenumber{fill:#333;}#mermaid-svg-jwMJFHk4ZOyMAGBK #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-jwMJFHk4ZOyMAGBK .messageText{fill:#333;stroke:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jwMJFHk4ZOyMAGBK .labelText,#mermaid-svg-jwMJFHk4ZOyMAGBK .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .loopText,#mermaid-svg-jwMJFHk4ZOyMAGBK .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-jwMJFHk4ZOyMAGBK .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-jwMJFHk4ZOyMAGBK .noteText,#mermaid-svg-jwMJFHk4ZOyMAGBK .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-jwMJFHk4ZOyMAGBK .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jwMJFHk4ZOyMAGBK .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jwMJFHk4ZOyMAGBK .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-jwMJFHk4ZOyMAGBK .actorPopupMenu{position:absolute;}#mermaid-svg-jwMJFHk4ZOyMAGBK .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-jwMJFHk4ZOyMAGBK .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-jwMJFHk4ZOyMAGBK .actor-man circle,#mermaid-svg-jwMJFHk4ZOyMAGBK line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-jwMJFHk4ZOyMAGBK :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    可异步进行

    alt

    [工具调用]

    [最终答案]

    loop

    [ReAct循环]

    用户输入

    解析输入

    意图与参数

    存储用户消息

    生成计划(可选)

    步骤列表

    根据当前状态决策

    动作(思考/工具调用/最终答案)

    执行工具

    调用具体工具

    返回结果

    观察结果

    存储观察

    返回答案

    反思总结


    2. 与传统程序的核心差异——理解范式革命

    传统程序与AI智能体在多个维度存在本质区别:

    维度传统程序AI智能体
    输入处理 严格的格式要求(表单、API) 自然语言、模糊容忍
    控制流 预定义的逻辑分支(if-else) 动态推理,由LLM决定下一步
    工具使用 硬编码调用 动态选择工具,参数由LLM生成
    记忆 通常无状态或简单会话 短期上下文+长期知识库
    适应性 需人工修改代码适应新场景 通过提示或微调快速适应
    错误处理 预设异常捕获 可自我反思、重试、调整策略
    输出 结构化数据 自然语言解释+执行结果

    范式革命的核心:从“程序员编写逻辑”转变为“AI理解目标并自主规划执行”。智能体不是简单的API封装,而是具备目标驱动、动态规划、工具使用、自我进化能力的数字生命体。


    3. Function Calling机制详解——让AI调用工具

    Function Calling(函数调用)是LLM提供商(如OpenAI)提供的一种能力:允许开发者向模型描述可用的函数(包括名称、描述、参数),模型在生成回复时,如果判断需要调用工具,会输出一个结构化的函数调用请求,而不是自然语言。

    3.1 函数定义格式(以OpenAI为例)

    {
    "name": "get_current_weather",
    "description": "获取指定城市的当前天气",
    "parameters": {
    "type": "object",
    "properties": {
    "location": {
    "type": "string",
    "description": "城市名称,如北京、上海"
    },
    "unit": {
    "type": "string",
    "enum": ["celsius", "fahrenheit"],
    "description": "温度单位"
    }
    },
    "required": ["location"]
    }
    }

    3.2 调用流程

  • 开发者将函数定义列表随用户消息一起发送给LLM。
  • LLM分析用户需求,决定是否调用函数,并填充参数。
  • 如果模型决定调用函数,返回的响应中包含 function_call 字段。
  • 开发者执行对应函数,将结果作为新消息发送给LLM。
  • LLM基于函数结果生成最终回答。
  • 3.3 示例(Python伪代码)

    import openai

    def get_current_weather(location, unit="celsius"):
    # 实际调用天气API
    return f"{location}的天气是晴天,25度"

    messages = [{"role": "user", "content": "北京天气怎么样?"}]
    functions = [
    {
    "name": "get_current_weather",
    "description": "获取指定城市的当前天气",
    "parameters": {
    "type": "object",
    "properties": {
    "location": {"type": "string", "description": "城市名称"},
    "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
    },
    "required": ["location"]
    }
    }
    ]

    response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages,
    functions=functions,
    function_call="auto" # 允许模型自动选择
    )

    if response.choices[0].message.get("function_call"):
    func_call = response.choices[0].message.function_call
    if func_call.name == "get_current_weather":
    args = json.loads(func_call.arguments)
    result = get_current_weather(**args)
    # 将结果追加到对话中
    messages.append(response.choices[0].message)
    messages.append({
    "role": "function",
    "name": func_call.name,
    "content": result
    })
    # 再次调用模型生成最终回答
    second_response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=messages
    )
    print(second_response.choices[0].message.content)


    4. ReAct运行模式全解析——思考与行动的循环

    ReAct(Reason + Act)是一种将推理和行动交织的智能体范式。它通过让LLM交替输出“思考”(Reason)和“行动”(Act)来逐步解决问题,并在每次行动后观察结果,形成闭环。

    4.1 ReAct的提示格式

    通常采用如下格式引导模型:

    Question: 用户的问题
    Thought: 思考当前情况和下一步计划
    Action: 要调用的工具名称
    Action Input: 工具输入参数(JSON)
    Observation: 工具返回的结果
    … (重复多次)
    Thought: 我现在可以回答用户了
    Final Answer: 最终答案

    4.2 ReAct循环时序图

    User

    Tool

    Agent

    LLM

    User

    Tool

    Agent

    LLM

    #mermaid-svg-yX4qwD3bLq9mbAnI{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yX4qwD3bLq9mbAnI .error-icon{fill:#552222;}#mermaid-svg-yX4qwD3bLq9mbAnI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yX4qwD3bLq9mbAnI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yX4qwD3bLq9mbAnI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yX4qwD3bLq9mbAnI .marker.cross{stroke:#333333;}#mermaid-svg-yX4qwD3bLq9mbAnI svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yX4qwD3bLq9mbAnI p{margin:0;}#mermaid-svg-yX4qwD3bLq9mbAnI .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yX4qwD3bLq9mbAnI text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yX4qwD3bLq9mbAnI .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-yX4qwD3bLq9mbAnI .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-yX4qwD3bLq9mbAnI #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-yX4qwD3bLq9mbAnI .sequenceNumber{fill:white;}#mermaid-svg-yX4qwD3bLq9mbAnI #sequencenumber{fill:#333;}#mermaid-svg-yX4qwD3bLq9mbAnI #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-yX4qwD3bLq9mbAnI .messageText{fill:#333;stroke:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yX4qwD3bLq9mbAnI .labelText,#mermaid-svg-yX4qwD3bLq9mbAnI .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .loopText,#mermaid-svg-yX4qwD3bLq9mbAnI .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yX4qwD3bLq9mbAnI .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-yX4qwD3bLq9mbAnI .noteText,#mermaid-svg-yX4qwD3bLq9mbAnI .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-yX4qwD3bLq9mbAnI .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yX4qwD3bLq9mbAnI .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yX4qwD3bLq9mbAnI .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yX4qwD3bLq9mbAnI .actorPopupMenu{position:absolute;}#mermaid-svg-yX4qwD3bLq9mbAnI .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-yX4qwD3bLq9mbAnI .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yX4qwD3bLq9mbAnI .actor-man circle,#mermaid-svg-yX4qwD3bLq9mbAnI line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-yX4qwD3bLq9mbAnI :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    用户问题 + 历史 + 可用工具描述

    Thought + Action + Action Input

    调用工具(传入参数)

    Observation

    追加Observation,继续请求

    Thought + Final Answer

    输出最终答案

    4.3 核心优势

    • 动态推理:每一步都基于当前观察调整计划。
    • 可解释性:思考过程透明,便于调试。
    • 错误恢复:遇到错误可在后续步骤中修正。

    4.4 实现要点

    • 需要将对话历史、可用工具描述、当前步骤合并为提示。
    • 解析LLM输出时,需区分Thought、Action、Action Input、Final Answer。
    • 需要循环直到模型输出Final Answer或达到最大迭代次数。

    5. Plan And Execute模式——复杂任务拆解与执行

    Plan-and-Execute(计划与执行)是一种将任务分解为“计划阶段”和“执行阶段”的架构。先由规划器生成一个多步骤计划,然后逐步执行每个步骤,可能根据执行结果动态调整计划。

    5.1 与ReAct的区别

    • ReAct:每一步都推理,边想边做,适合步骤数未知的动态任务。
    • Plan-and-Execute:先集中规划,再按计划执行,适合步骤清晰、可预见的任务。

    5.2 架构UML

    #mermaid-svg-FAjnBLPzTXA20tuJ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FAjnBLPzTXA20tuJ .error-icon{fill:#552222;}#mermaid-svg-FAjnBLPzTXA20tuJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FAjnBLPzTXA20tuJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FAjnBLPzTXA20tuJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FAjnBLPzTXA20tuJ .marker.cross{stroke:#333333;}#mermaid-svg-FAjnBLPzTXA20tuJ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FAjnBLPzTXA20tuJ p{margin:0;}#mermaid-svg-FAjnBLPzTXA20tuJ g.classGroup text{fill:#9370DB;stroke:none;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-FAjnBLPzTXA20tuJ g.classGroup text .title{font-weight:bolder;}#mermaid-svg-FAjnBLPzTXA20tuJ .nodeLabel,#mermaid-svg-FAjnBLPzTXA20tuJ .edgeLabel{color:#131300;}#mermaid-svg-FAjnBLPzTXA20tuJ .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-FAjnBLPzTXA20tuJ .label text{fill:#131300;}#mermaid-svg-FAjnBLPzTXA20tuJ .labelBkg{background:#ECECFF;}#mermaid-svg-FAjnBLPzTXA20tuJ .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-FAjnBLPzTXA20tuJ .classTitle{font-weight:bolder;}#mermaid-svg-FAjnBLPzTXA20tuJ .node rect,#mermaid-svg-FAjnBLPzTXA20tuJ .node circle,#mermaid-svg-FAjnBLPzTXA20tuJ .node ellipse,#mermaid-svg-FAjnBLPzTXA20tuJ .node polygon,#mermaid-svg-FAjnBLPzTXA20tuJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FAjnBLPzTXA20tuJ .divider{stroke:#9370DB;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ g.clickable{cursor:pointer;}#mermaid-svg-FAjnBLPzTXA20tuJ g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-FAjnBLPzTXA20tuJ g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-FAjnBLPzTXA20tuJ .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-FAjnBLPzTXA20tuJ .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-FAjnBLPzTXA20tuJ .dashed-line{stroke-dasharray:3;}#mermaid-svg-FAjnBLPzTXA20tuJ .dotted-line{stroke-dasharray:1 2;}#mermaid-svg-FAjnBLPzTXA20tuJ #compositionStart,#mermaid-svg-FAjnBLPzTXA20tuJ .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #compositionEnd,#mermaid-svg-FAjnBLPzTXA20tuJ .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #dependencyStart,#mermaid-svg-FAjnBLPzTXA20tuJ .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #dependencyStart,#mermaid-svg-FAjnBLPzTXA20tuJ .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #extensionStart,#mermaid-svg-FAjnBLPzTXA20tuJ .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #extensionEnd,#mermaid-svg-FAjnBLPzTXA20tuJ .extension{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #aggregationStart,#mermaid-svg-FAjnBLPzTXA20tuJ .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #aggregationEnd,#mermaid-svg-FAjnBLPzTXA20tuJ .aggregation{fill:transparent!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #lollipopStart,#mermaid-svg-FAjnBLPzTXA20tuJ .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ #lollipopEnd,#mermaid-svg-FAjnBLPzTXA20tuJ .lollipop{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-FAjnBLPzTXA20tuJ .edgeTerminals{font-size:11px;line-height:initial;}#mermaid-svg-FAjnBLPzTXA20tuJ .classTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FAjnBLPzTXA20tuJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FAjnBLPzTXA20tuJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FAjnBLPzTXA20tuJ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    PlanAndExecuteAgent

    -planner: Planner

    -executor: StepExecutor

    -memory: Memory

    +run(task: str) : -> str

    Planner

    +create_plan(task: str) : -> List[Step]

    StepExecutor

    -tools: dict

    +execute_step(step: Step) : -> str

    Memory

    5.3 工作流程时序图

    Memory

    Tool

    Executor

    Planner

    Agent

    User

    Memory

    Tool

    Executor

    Planner

    Agent

    User

    #mermaid-svg-otCe3NFpk6cL2Jm6{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-otCe3NFpk6cL2Jm6 .error-icon{fill:#552222;}#mermaid-svg-otCe3NFpk6cL2Jm6 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-otCe3NFpk6cL2Jm6 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-otCe3NFpk6cL2Jm6 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-otCe3NFpk6cL2Jm6 .marker.cross{stroke:#333333;}#mermaid-svg-otCe3NFpk6cL2Jm6 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-otCe3NFpk6cL2Jm6 p{margin:0;}#mermaid-svg-otCe3NFpk6cL2Jm6 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-otCe3NFpk6cL2Jm6 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-otCe3NFpk6cL2Jm6 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-otCe3NFpk6cL2Jm6 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-otCe3NFpk6cL2Jm6 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-otCe3NFpk6cL2Jm6 .sequenceNumber{fill:white;}#mermaid-svg-otCe3NFpk6cL2Jm6 #sequencenumber{fill:#333;}#mermaid-svg-otCe3NFpk6cL2Jm6 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-otCe3NFpk6cL2Jm6 .messageText{fill:#333;stroke:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-otCe3NFpk6cL2Jm6 .labelText,#mermaid-svg-otCe3NFpk6cL2Jm6 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .loopText,#mermaid-svg-otCe3NFpk6cL2Jm6 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-otCe3NFpk6cL2Jm6 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-otCe3NFpk6cL2Jm6 .noteText,#mermaid-svg-otCe3NFpk6cL2Jm6 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-otCe3NFpk6cL2Jm6 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-otCe3NFpk6cL2Jm6 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-otCe3NFpk6cL2Jm6 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-otCe3NFpk6cL2Jm6 .actorPopupMenu{position:absolute;}#mermaid-svg-otCe3NFpk6cL2Jm6 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-otCe3NFpk6cL2Jm6 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-otCe3NFpk6cL2Jm6 .actor-man circle,#mermaid-svg-otCe3NFpk6cL2Jm6 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-otCe3NFpk6cL2Jm6 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    alt

    [需要调整计划]

    loop

    [执行每一步]

    复杂任务(如“帮我预订去北京的机票”)

    生成计划

    步骤列表 [查询日期, 查询航班, 预订]

    执行下一步

    调用对应工具

    结果

    步骤结果

    存储中间结果

    重新规划(基于当前状态)

    更新后的步骤

    返回最终结果

    5.4 实现示例(LangChain中的PlanAndExecute)

    LangChain提供了PlanAndExecute代理,使用LLMPlanner生成计划,ChainExecutor执行步骤。


    6. LangChain搭建实战——手把手构建你的第一个Agent

    本节将使用LangChain框架快速构建一个支持工具调用、具备记忆的智能体。我们将实现一个可以查询天气、计算、发送邮件的Agent。

    6.1 项目结构

    agent_langchain_demo/
    ├── .env # 存放API密钥
    ├── main.py # 主程序入口
    ├── tools/
    │ ├── __init__.py
    │ ├── weather.py # 天气查询工具
    │ ├── calculator.py # 计算器工具
    │ └── email.py # 邮件发送工具
    ├── agent/
    │ ├── __init__.py
    │ └── custom_agent.py # 可选:自定义代理逻辑
    ├── requirements.txt
    └── README.md

    6.2 安装依赖

    pip install langchain langchain-openai python-dotenv

    6.3 定义工具

    tools/weather.py

    import requests
    from langchain.tools import BaseTool
    from typing import Optional, Type
    from pydantic import BaseModel, Field

    class WeatherInput(BaseModel):
    location: str = Field(description="城市名称,如北京")

    class WeatherTool(BaseTool):
    name = "weather"
    description = "查询指定城市的当前天气"
    args_schema: Type[BaseModel] = WeatherInput

    def _run(self, location: str) > str:
    # 这里应替换为真实天气API,例如和风天气、OpenWeatherMap
    # 为演示,返回模拟数据
    return f"{location}的天气是晴朗,温度25℃。"

    async def _arun(self, location: str) > str:
    # 异步版本
    return self._run(location)

    tools/calculator.py

    import math
    from langchain.tools import BaseTool
    from pydantic import BaseModel, Field
    from typing import Type

    class CalculatorInput(BaseModel):
    expression: str = Field(description="要计算的数学表达式,如 2+2*3")

    class CalculatorTool(BaseTool):
    name = "calculator"
    description = "计算数学表达式,支持加减乘除、幂运算等"
    args_schema: Type[BaseModel] = CalculatorInput

    def _run(self, expression: str) > str:
    try:
    # 安全评估,限制命名空间
    result = eval(expression, {"__builtins__": None}, {"sqrt": math.sqrt, "pow": pow})
    return f"计算结果:{result}"
    except Exception as e:
    return f"计算错误:{str(e)}"

    async def _arun(self, expression: str) > str:
    return self._run(expression)

    tools/email.py

    from langchain.tools import BaseTool
    from pydantic import BaseModel, Field
    from typing import Type

    class EmailInput(BaseModel):
    to: str = Field(description="收件人邮箱地址")
    subject: str = Field(description="邮件主题")
    body: str = Field(description="邮件正文")

    class EmailTool(BaseTool):
    name = "send_email"
    description = "发送邮件,需要提供收件人地址、主题和正文"
    args_schema: Type[BaseModel] = EmailInput

    def _run(self, to: str, subject: str, body: str) > str:
    # 实际应使用SMTP库发送邮件,此处模拟
    print(f"模拟发送邮件:\\n收件人:{to}\\n主题:{subject}\\n正文:{body}")
    return f"邮件已成功发送至 {to}"

    async def _arun(self, to: str, subject: str, body: str) > str:
    return self._run(to, subject, body)

    6.4 构建Agent(main.py)

    import os
    from dotenv import load_dotenv
    from langchain.agents import AgentExecutor, create_openai_tools_agent
    from langchain_openai import ChatOpenAI
    from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
    from langchain.memory import ConversationBufferMemory
    from tools.weather import WeatherTool
    from tools.calculator import CalculatorTool
    from tools.email import EmailTool

    load_dotenv() # 加载.env文件中的OPENAI_API_KEY

    def main():
    # 初始化LLM
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

    # 初始化工具
    tools = [WeatherTool(), CalculatorTool(), EmailTool()]

    # 创建提示模板(必须包含agent_scratchpad)
    prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的智能助手,可以调用工具帮助用户解决问题。"),
    MessagesPlaceholder(variable_name="chat_history"),
    ("human", "{input}"),
    MessagesPlaceholder(variable_name="agent_scratchpad"),
    ])

    # 创建记忆组件
    memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)

    # 创建Agent(使用OpenAI tools代理)
    agent = create_openai_tools_agent(llm, tools, prompt)

    # 创建Agent执行器
    agent_executor = AgentExecutor(
    agent=agent,
    tools=tools,
    memory=memory,
    verbose=True, # 打印详细执行过程
    handle_parsing_errors=True,
    max_iterations=5 # 防止无限循环
    )

    # 交互式对话
    print("智能体已启动,输入你的问题(输入'quit'退出)")
    while True:
    user_input = input("\\n用户: ")
    if user_input.lower() == 'quit':
    break
    response = agent_executor.invoke({"input": user_input})
    print(f"助手: {response['output']}")

    if __name__ == "__main__":
    main()

    6.5 运行示例

    python main.py

    对话示例:

    用户: 计算 25 的平方根
    助手: 计算结果:5.0

    用户: 北京天气怎么样?
    助手: 北京的天气是晴朗,温度25℃。

    用户: 发送邮件给 test@example.com,主题为“会议提醒”,内容为“下午3点开会”
    助手: 邮件已成功发送至 test@example.com

    6.6 代码解析

    • create_openai_tools_agent:这是LangChain针对OpenAI函数调用优化的代理,会自动将工具转换为函数定义,并处理函数调用循环。
    • ConversationBufferMemory:存储对话历史,使代理具备短期记忆。
    • AgentExecutor:负责循环调用代理直到得到最终答案,内部集成了ReAct逻辑。

    7. 商业化落地应用场景——探索AI智能体的无限可能

    AI智能体正从实验室走向各行各业,以下是几个典型的商业化落地场景:

    7.1 智能客服与技术支持

    • 场景:7×24小时自动响应客户咨询,处理退换货、账单查询、故障排查。
    • 优势:可调用CRM系统、知识库、工单系统,实现端到端解决。
    • 案例:某电商平台部署智能体后,人工客服压力降低60%。

    7.2 自动化办公助手

    • 场景:自动安排会议、发送邮件、整理周报、管理待办事项。
    • 优势:理解自然语言指令,跨应用操作(日历、邮箱、文档)。
    • 案例:某咨询公司用智能体自动生成项目周报,节省员工每周2小时。

    7.3 数据分析与商业智能

    • 场景:用户用自然语言提问“上个月华东区销售额前三的产品”,智能体自动查询数据库、生成图表。
    • 优势:降低数据分析门槛,业务人员自助取数。
    • 案例:某零售企业部署数据分析智能体,报表生成时间从天级降至分钟级。

    7.4 教育与培训

    • 场景:个性化辅导老师,根据学生问题调用知识库、出题、评估答案。
    • 优势:自适应学习路径,实时反馈。
    • 案例:在线教育平台集成AI助教,学生留存率提升30%。

    7.5 软件开发辅助

    • 场景:根据需求描述生成代码框架、调用API、编写测试用例。
    • 优势:加速开发流程,减少重复劳动。
    • 案例:某创业团队用智能体自动生成基础CRUD代码,开发效率提升3倍。

    7.6 挑战与应对策略

    挑战应对方案
    准确性 采用多模型投票、人工审核环节、反馈循环
    安全性 限制工具权限、输入输出过滤、敏感信息脱敏
    成本控制 优化提示词减少token、缓存常用结果、模型降级
    延迟 异步处理、流式输出、边缘计算
    合规性 数据本地化、审计日志、符合GDPR等法规

    结语

    通过本文的七大模块,我们系统地学习了AI智能体的核心原理与实战技巧。从基础架构到Function Calling,从ReAct到Plan-and-Execute,最终通过LangChain快速搭建了一个可用的智能体。智能体不仅是技术的演进,更是人机交互范式的革命。未来,每个企业都将拥有自己的智能体集群,成为数字化转型的核心引擎。

    现在,你已经掌握了从“对话助手”升级为“执行专家”的核心技术。动手实践,创造属于你的智能体吧!

    赞(0)
    未经允许不得转载:171主机测评 » Agent智能体:从原理到实战
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址