AI Agent 的三位一体架构:模型(大脑)+ 工具(双手)+ 记忆(海马体)的深度解析

摘要

理解 AI Agent 的核心架构是开发 Agent 系统的前提。本文将 AI Agent 类比为人体的三个核心器官------大脑(LLM 模型层)、双手(工具调用层)和海马体(记忆系统层),从架构设计、交互机制、数据流三个维度深度拆解"模型+工具+记忆"的三位一体架构。分析三者之间的协作时序、状态同步策略和常见设计陷阱,给出可落地的架构设计参考。面向希望深入理解 Agent 内部机制的 AI 应用开发者和架构师。

📌 经典原理,长期适用:本文讲解的 Agent 核心架构原理不依赖特定框架或模型版本,属于 Agent 工程化的基础理论,长期有效。涉及的具体框架 API 以 2026 年 9 月版本为准。

文章目录

    • 摘要
    • [一、为什么用"三位一体"来理解 Agent?](#一、为什么用"三位一体"来理解 Agent?)
      • [1.1 一个直觉类比](#1.1 一个直觉类比)
      • [1.2 为什么不是"两部分"或"四部分"](#1.2 为什么不是"两部分"或"四部分")
    • [二、模型层:Agent 的大脑](#二、模型层:Agent 的大脑)
      • [2.1 LLM 在 Agent 中的角色](#2.1 LLM 在 Agent 中的角色)
      • [2.2 不同模型在 Agent 场景下的能力差异](#2.2 不同模型在 Agent 场景下的能力差异)
      • [2.3 模型层的工程设计](#2.3 模型层的工程设计)
    • [三、工具调用层:Agent 的双手](#三、工具调用层:Agent 的双手)
      • [3.1 工具调用的三种模式](#3.1 工具调用的三种模式)
      • [3.2 工具设计原则](#3.2 工具设计原则)
      • [3.3 工具管理的演进](#3.3 工具管理的演进)
    • [四、记忆系统层:Agent 的海马体](#四、记忆系统层:Agent 的海马体)
      • [4.1 为什么 Agent 需要记忆?](#4.1 为什么 Agent 需要记忆?)
      • [4.2 三层记忆架构](#4.2 三层记忆架构)
      • [4.3 记忆管理的核心挑战](#4.3 记忆管理的核心挑战)
    • 五、三位一体的协作机制
      • [5.1 完整的任务执行时序](#5.1 完整的任务执行时序)
      • [5.2 三层之间的状态同步](#5.2 三层之间的状态同步)
      • [5.3 架构设计的状态图](#5.3 架构设计的状态图)
    • 六、常见架构设计陷阱
      • [6.1 陷阱一:工具过载](#6.1 陷阱一:工具过载)
      • [6.2 陷阱二:记忆无限膨胀](#6.2 陷阱二:记忆无限膨胀)
      • [6.3 陷阱三:线性思维链](#6.3 陷阱三:线性思维链)
    • 七、适用边界
      • [7.1 三位一体架构的适用场景](#7.1 三位一体架构的适用场景)
      • [7.2 不适用场景](#7.2 不适用场景)
      • [7.3 架构选择的决策建议](#7.3 架构选择的决策建议)
    • 八、总结
      • [8.1 核心观点](#8.1 核心观点)
      • [8.2 下篇预告](#8.2 下篇预告)
    • 参考资料

图:Agent三位一体架构总览图

一、为什么用"三位一体"来理解 Agent?

1.1 一个直觉类比

人类的智能行为不是单一器官完成的。你问"明天北京天气怎么样"------大脑负责理解问题并规划"需要查天气",双手负责拿起手机打开天气 App,海马体负责记住"你明天要去北京出差"这个上下文。

AI Agent 的运作方式几乎一模一样:

人类器官 Agent 组件 核心职责 技术实现
大脑(前额叶) LLM 模型层 理解、推理、规划、决策 GPT-5 / Claude / DeepSeek
双手 工具调用层 与外部世界交互 Function Calling / MCP
海马体 记忆系统层 存储与回忆上下文 向量数据库 / 上下文管理

1.2 为什么不是"两部分"或"四部分"

为什么不是两部分(模型+工具)? 因为没有记忆的 Agent 就像"失忆症患者"------每次对话都从零开始,无法积累经验,无法保持长期上下文。

为什么不是四部分? 有人主张加一个"规划层"作为独立组件。但规划本质上是 LLM 的核心能力,不需要独立为第四个组件。强行拆分反而增加了系统复杂度。

三位一体的核心在于"循环"------三个组件不是线性串联(模型→工具→记忆),而是在一个循环中持续交互:模型读取记忆→规划→调用工具→工具返回结果→模型反思→更新记忆→继续规划。
#mermaid-svg-Q3RZwlKQ1F7ui2pa{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-Q3RZwlKQ1F7ui2pa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .error-icon{fill:#552222;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .marker.cross{stroke:#333333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa p{margin:0;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster-label text{fill:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster-label span{color:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster-label span p{background-color:transparent;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .label text,#mermaid-svg-Q3RZwlKQ1F7ui2pa span{fill:#333;color:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .node rect,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node circle,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node ellipse,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node polygon,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .rough-node .label text,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node .label text,#mermaid-svg-Q3RZwlKQ1F7ui2pa .image-shape .label,#mermaid-svg-Q3RZwlKQ1F7ui2pa .icon-shape .label{text-anchor:middle;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .rough-node .label,#mermaid-svg-Q3RZwlKQ1F7ui2pa .node .label,#mermaid-svg-Q3RZwlKQ1F7ui2pa .image-shape .label,#mermaid-svg-Q3RZwlKQ1F7ui2pa .icon-shape .label{text-align:center;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .node.clickable{cursor:pointer;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .arrowheadPath{fill:#333333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Q3RZwlKQ1F7ui2pa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q3RZwlKQ1F7ui2pa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster text{fill:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .cluster span{color:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Q3RZwlKQ1F7ui2pa rect.text{fill:none;stroke-width:0;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .icon-shape,#mermaid-svg-Q3RZwlKQ1F7ui2pa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .icon-shape p,#mermaid-svg-Q3RZwlKQ1F7ui2pa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .icon-shape .label rect,#mermaid-svg-Q3RZwlKQ1F7ui2pa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Q3RZwlKQ1F7ui2pa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Q3RZwlKQ1F7ui2pa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Q3RZwlKQ1F7ui2pa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 🧠 LLM 模型

推理与规划
🤲 工具调用

执行与交互
hippocampus 记忆系统

存储与回忆

图:Agent 三位一体架构的核心循环关系


二、模型层:Agent 的大脑

2.1 LLM 在 Agent 中的角色

LLM 在 Agent 中承担四个核心职责:

职责 描述 对应人类认知
意图理解 理解用户输入的真正含义 语言理解
任务规划 将复杂目标分解为可执行步骤 前额叶规划
工具选择 决定调用什么工具、传什么参数 工具选择
结果评估 判断工具返回结果是否满足需求 反思与评估

2.2 不同模型在 Agent 场景下的能力差异

图:四大主流模型在 Agent 场景下的能力对比

关键差异分析:

推理能力决定 Agent 的"规划质量"------面对复杂多步任务,强推理模型能制定更合理的执行计划。GPT-5 和 Claude-4 在这一维度领先。

工具调用决定 Agent 的"执行可靠性"------JSON Schema 约束的准确性、参数填充的完整度。Claude-4 的 Function Calling 稳定性最高。

上下文管理决定 Agent 的"记忆容量"------上下文窗口越长,能处理的任务越复杂。Claude-4 的 200K 窗口在长任务场景下有优势。

2.3 模型层的工程设计

选择模型只是第一步,如何"用好"模型才是关键。以下是模型层的三个工程要点:

要点一:System Prompt 设计

System Prompt 是 Agent 的"性格设定"。它决定了 Agent 的角色、行为边界和输出风格。

python 复制代码
SYSTEM_PROMPT = """你是一个数据分析助手,具备以下能力:
1. 查询数据库获取数据
2. 执行统计分析
3. 生成可视化报告

工作原则:
- 收到任务后先制定执行计划
- 每一步执行后评估结果,决定是否继续
- 如果工具调用失败,尝试替代方案
- 不确定的信息要明确标注

输出要求:
- 执行计划用编号列表
- 数据结果用表格
- 最终结论加粗
"""

这个 System Prompt 定义了 Agent 的角色、能力、工作原则和输出格式。在 Agent 架构中,System Prompt 属于"模型层配置",但它直接影响 Agent 的所有行为。

要点二:温度(Temperature)参数

Agent 场景下,温度参数的选择与 ChatBot 不同:

场景 建议温度 原因
任务规划 0.0-0.3 需要确定性,避免"创造性"跑偏
工具调用 0.0 参数必须精确,不能"创造"参数值
内容生成 0.5-0.7 需要一定的创造性
代码生成 0.0-0.2 代码必须准确

要点三:多模型路由

生产级 Agent 不应该只用一个模型。根据任务复杂度路由到不同模型,是成本控制的关键:

python 复制代码
def route_model(task_complexity: str, task_type: str) -> str:
    """根据任务特征选择模型"""
    if task_complexity == "high":
        return "gpt-5"          # 复杂推理用强模型
    elif task_type == "code":
        return "claude-4-sonnet" # 代码用 Claude
    elif task_type == "simple_qa":
        return "deepseek-v4"     # 简单问答用低成本模型
    else:
        return "gpt-5-mini"      # 默认用中等模型

三、工具调用层:Agent 的双手

3.1 工具调用的三种模式

模式 描述 优点 缺点 典型框架
Function Calling 模型原生工具调用 最稳定、参数准确 绑定特定模型 OpenAI / Anthropic
MCP 协议 标准化工具协议 跨框架复用 生态尚在发展 OpenClaw
Prompt 注入 在 Prompt 中描述工具 模型无关 最不稳定 早期 LangChain

外部系统 工具层 LLM 用户 外部系统 工具层 LLM 用户 #mermaid-svg-drAepy6xOnpOMWrJ{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-drAepy6xOnpOMWrJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-drAepy6xOnpOMWrJ .error-icon{fill:#552222;}#mermaid-svg-drAepy6xOnpOMWrJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-drAepy6xOnpOMWrJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-drAepy6xOnpOMWrJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-drAepy6xOnpOMWrJ .marker.cross{stroke:#333333;}#mermaid-svg-drAepy6xOnpOMWrJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-drAepy6xOnpOMWrJ p{margin:0;}#mermaid-svg-drAepy6xOnpOMWrJ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-drAepy6xOnpOMWrJ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-drAepy6xOnpOMWrJ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-drAepy6xOnpOMWrJ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-drAepy6xOnpOMWrJ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-drAepy6xOnpOMWrJ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-drAepy6xOnpOMWrJ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-drAepy6xOnpOMWrJ .sequenceNumber{fill:white;}#mermaid-svg-drAepy6xOnpOMWrJ #sequencenumber{fill:#333;}#mermaid-svg-drAepy6xOnpOMWrJ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-drAepy6xOnpOMWrJ .messageText{fill:#333;stroke:none;}#mermaid-svg-drAepy6xOnpOMWrJ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-drAepy6xOnpOMWrJ .labelText,#mermaid-svg-drAepy6xOnpOMWrJ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-drAepy6xOnpOMWrJ .loopText,#mermaid-svg-drAepy6xOnpOMWrJ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-drAepy6xOnpOMWrJ .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-drAepy6xOnpOMWrJ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-drAepy6xOnpOMWrJ .noteText,#mermaid-svg-drAepy6xOnpOMWrJ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-drAepy6xOnpOMWrJ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-drAepy6xOnpOMWrJ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-drAepy6xOnpOMWrJ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-drAepy6xOnpOMWrJ .actorPopupMenu{position:absolute;}#mermaid-svg-drAepy6xOnpOMWrJ .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-drAepy6xOnpOMWrJ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-drAepy6xOnpOMWrJ .actor-man circle,#mermaid-svg-drAepy6xOnpOMWrJ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-drAepy6xOnpOMWrJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Function Calling 模式 MCP 协议模式 "查一下今天北京天气" 推理:需要调用天气工具 function_call(name="get_weather", args={city:"北京"}) 调用天气 API {temp: 22, condition: "晴"} 工具返回结果 整合结果生成回答 "北京今天22度,晴天" "查一下今天北京天气" MCP请求(get_weather, {city:"北京"}) MCP Client → MCP Server 标准化调用 标准化返回 MCP响应 "北京今天22度,晴天"

图:Function Calling 与 MCP 协议的时序对比

3.2 工具设计原则

工具设计不是"定义个函数就行"。好的工具设计能大幅提升 Agent 的决策准确率,坏的工具设计会让 Agent 频繁出错。

原则一:粒度适中

python 复制代码
# ❌ 太细:Agent 需要调用 3 次才能完成一个操作
@tool
def get_order_id(customer_name: str) -> str:
    """根据客户名获取订单ID"""
    
@tool
def get_order_status(order_id: str) -> str:
    """根据订单ID获取状态"""

@tool
def cancel_order(order_id: str) -> bool:
    """取消订单"""

# ✅ 适中:一个工具完成完整操作
@tool
def find_and_cancel_order(customer_name: str) -> dict:
    """根据客户名查找订单并取消,返回取消结果"""
    order_id = get_order_id(customer_name)
    status = get_order_status(order_id)
    if status == "shipped":
        return {"success": False, "reason": "已发货,无法取消"}
    return cancel_order(order_id)

原则二:描述清晰

工具描述是 Agent 选择工具的"唯一依据"。描述不清晰,Agent 就会选错工具或传错参数。

python 复制代码
# ❌ 描述模糊
@tool
def search(query: str) -> str:
    """搜索"""

# ✅ 描述清晰
@tool
def search_web(query: str, max_results: int = 5) -> list:
    """搜索互联网获取最新信息。适用于需要实时数据、新闻、天气、股价等场景。
    
    参数:
    - query: 搜索关键词,建议10-30字
    - max_results: 返回结果数量,默认5条
    
    返回:搜索结果列表,每条包含标题、摘要、链接
    """

原则三:错误可恢复

python 复制代码
@tool
def query_database(sql: str) -> dict:
    """执行SQL查询"""
    try:
        result = db.execute(sql)
        return {"success": True, "data": result}
    except ConnectionError:
        return {"success": False, "error": "数据库连接失败", "retry": True}
    except SyntaxError as e:
        return {"success": False, "error": f"SQL语法错误: {e}", "retry": False}

工具返回的 retry 字段告诉 Agent:"这个错误值得重试"还是"这个错误重试也没用"。这种设计让 Agent 做出更智能的错误处理决策。

3.3 工具管理的演进

#mermaid-svg-fRTHezHnLnorGNp5{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-fRTHezHnLnorGNp5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fRTHezHnLnorGNp5 .error-icon{fill:#552222;}#mermaid-svg-fRTHezHnLnorGNp5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fRTHezHnLnorGNp5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fRTHezHnLnorGNp5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fRTHezHnLnorGNp5 .marker.cross{stroke:#333333;}#mermaid-svg-fRTHezHnLnorGNp5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fRTHezHnLnorGNp5 p{margin:0;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-id,#mermaid-svg-fRTHezHnLnorGNp5 .commit-msg,#mermaid-svg-fRTHezHnLnorGNp5 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label0{fill:#ffffff;}#mermaid-svg-fRTHezHnLnorGNp5 .commit0{stroke:hsl(240, 100%, 46.2745098039%);fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight0{stroke:hsl(60, 100%, 3.7254901961%);fill:hsl(60, 100%, 3.7254901961%);}#mermaid-svg-fRTHezHnLnorGNp5 .label0{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow0{stroke:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label1{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit1{stroke:hsl(60, 100%, 43.5294117647%);fill:hsl(60, 100%, 43.5294117647%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight1{stroke:rgb(0, 0, 160.5);fill:rgb(0, 0, 160.5);}#mermaid-svg-fRTHezHnLnorGNp5 .label1{fill:hsl(60, 100%, 43.5294117647%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow1{stroke:hsl(60, 100%, 43.5294117647%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label2{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit2{stroke:hsl(80, 100%, 46.2745098039%);fill:hsl(80, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight2{stroke:rgb(48.8333333334, 0, 146.5000000001);fill:rgb(48.8333333334, 0, 146.5000000001);}#mermaid-svg-fRTHezHnLnorGNp5 .label2{fill:hsl(80, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow2{stroke:hsl(80, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label3{fill:#ffffff;}#mermaid-svg-fRTHezHnLnorGNp5 .commit3{stroke:hsl(210, 100%, 46.2745098039%);fill:hsl(210, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight3{stroke:rgb(146.5000000001, 73.2500000001, 0);fill:rgb(146.5000000001, 73.2500000001, 0);}#mermaid-svg-fRTHezHnLnorGNp5 .label3{fill:hsl(210, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow3{stroke:hsl(210, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label4{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit4{stroke:hsl(180, 100%, 46.2745098039%);fill:hsl(180, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight4{stroke:rgb(146.5000000001, 0, 0);fill:rgb(146.5000000001, 0, 0);}#mermaid-svg-fRTHezHnLnorGNp5 .label4{fill:hsl(180, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow4{stroke:hsl(180, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label5{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit5{stroke:hsl(150, 100%, 46.2745098039%);fill:hsl(150, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight5{stroke:rgb(146.5000000001, 0, 73.2500000001);fill:rgb(146.5000000001, 0, 73.2500000001);}#mermaid-svg-fRTHezHnLnorGNp5 .label5{fill:hsl(150, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow5{stroke:hsl(150, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label6{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit6{stroke:hsl(300, 100%, 46.2745098039%);fill:hsl(300, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight6{stroke:rgb(0, 146.5000000001, 0);fill:rgb(0, 146.5000000001, 0);}#mermaid-svg-fRTHezHnLnorGNp5 .label6{fill:hsl(300, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow6{stroke:hsl(300, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch-label7{fill:black;}#mermaid-svg-fRTHezHnLnorGNp5 .commit7{stroke:hsl(0, 100%, 46.2745098039%);fill:hsl(0, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight7{stroke:rgb(0, 146.5000000001, 146.5000000001);fill:rgb(0, 146.5000000001, 146.5000000001);}#mermaid-svg-fRTHezHnLnorGNp5 .label7{fill:hsl(0, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .arrow7{stroke:hsl(0, 100%, 46.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .branch{stroke-width:1;stroke:#333333;stroke-dasharray:2;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-label{font-size:10px;fill:#000021;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-label-bkg{font-size:10px;fill:#ffffde;opacity:0.5;}#mermaid-svg-fRTHezHnLnorGNp5 .tag-label{font-size:10px;fill:#131300;}#mermaid-svg-fRTHezHnLnorGNp5 .tag-label-bkg{fill:#ECECFF;stroke:hsl(240, 60%, 86.2745098039%);}#mermaid-svg-fRTHezHnLnorGNp5 .tag-hole{fill:#333;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-merge{stroke:#ECECFF;fill:#ECECFF;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-reverse{stroke:#ECECFF;fill:#ECECFF;stroke-width:3;}#mermaid-svg-fRTHezHnLnorGNp5 .commit-highlight-inner{stroke:#ECECFF;fill:#ECECFF;}#mermaid-svg-fRTHezHnLnorGNp5 .arrow{stroke-width:8;stroke-linecap:round;fill:none;}#mermaid-svg-fRTHezHnLnorGNp5 .gitTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fRTHezHnLnorGNp5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} main 阶段1: 硬编码工具 阶段2: 配置文件注册 阶段3: 动态发现 阶段4: MCP标准化 阶段5: AI自主创建工具

图:Agent 工具管理的演进路径

  • 阶段1:工具直接写死在代码里,增删工具需要改代码
  • 阶段2:工具通过配置文件(YAML/JSON)注册,增删工具改配置即可
  • 阶段3:Agent 运行时动态发现可用工具,按需加载
  • 阶段4:MCP 协议标准化工具接口,跨框架复用
  • 阶段5:Agent 根据需求自己创建临时工具(前沿研究方向)

2026 年的主流框架已经进入阶段3-4。OpenClaw 的 Skill 系统是阶段3的典型代表,MCP 的普及推动了阶段4的发展。


四、记忆系统层:Agent 的海马体

4.1 为什么 Agent 需要记忆?

一个没有记忆的 Agent 就像一个"每次都从零开始"的实习生。你告诉它"用中文回答",下一轮它就忘了。你跟它讨论了半小时的方案,新会话里它什么都不知道。

Agent 的记忆系统解决三个问题:

问题 描述 记忆类型
当前推理需要上下文 "用户刚才说了什么?" 工作记忆
会话内的状态保持 "我们讨论到第几步了?" 会话记忆
跨会话的知识积累 "上次用户说他偏好简洁回答" 长期记忆

4.2 三层记忆架构

#mermaid-svg-rhjlsT4cS0mEmvAS{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-rhjlsT4cS0mEmvAS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rhjlsT4cS0mEmvAS .error-icon{fill:#552222;}#mermaid-svg-rhjlsT4cS0mEmvAS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rhjlsT4cS0mEmvAS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rhjlsT4cS0mEmvAS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rhjlsT4cS0mEmvAS .marker.cross{stroke:#333333;}#mermaid-svg-rhjlsT4cS0mEmvAS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rhjlsT4cS0mEmvAS p{margin:0;}#mermaid-svg-rhjlsT4cS0mEmvAS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster-label text{fill:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster-label span{color:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster-label span p{background-color:transparent;}#mermaid-svg-rhjlsT4cS0mEmvAS .label text,#mermaid-svg-rhjlsT4cS0mEmvAS span{fill:#333;color:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS .node rect,#mermaid-svg-rhjlsT4cS0mEmvAS .node circle,#mermaid-svg-rhjlsT4cS0mEmvAS .node ellipse,#mermaid-svg-rhjlsT4cS0mEmvAS .node polygon,#mermaid-svg-rhjlsT4cS0mEmvAS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rhjlsT4cS0mEmvAS .rough-node .label text,#mermaid-svg-rhjlsT4cS0mEmvAS .node .label text,#mermaid-svg-rhjlsT4cS0mEmvAS .image-shape .label,#mermaid-svg-rhjlsT4cS0mEmvAS .icon-shape .label{text-anchor:middle;}#mermaid-svg-rhjlsT4cS0mEmvAS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rhjlsT4cS0mEmvAS .rough-node .label,#mermaid-svg-rhjlsT4cS0mEmvAS .node .label,#mermaid-svg-rhjlsT4cS0mEmvAS .image-shape .label,#mermaid-svg-rhjlsT4cS0mEmvAS .icon-shape .label{text-align:center;}#mermaid-svg-rhjlsT4cS0mEmvAS .node.clickable{cursor:pointer;}#mermaid-svg-rhjlsT4cS0mEmvAS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rhjlsT4cS0mEmvAS .arrowheadPath{fill:#333333;}#mermaid-svg-rhjlsT4cS0mEmvAS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rhjlsT4cS0mEmvAS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rhjlsT4cS0mEmvAS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rhjlsT4cS0mEmvAS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rhjlsT4cS0mEmvAS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rhjlsT4cS0mEmvAS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster text{fill:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS .cluster span{color:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rhjlsT4cS0mEmvAS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rhjlsT4cS0mEmvAS rect.text{fill:none;stroke-width:0;}#mermaid-svg-rhjlsT4cS0mEmvAS .icon-shape,#mermaid-svg-rhjlsT4cS0mEmvAS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rhjlsT4cS0mEmvAS .icon-shape p,#mermaid-svg-rhjlsT4cS0mEmvAS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rhjlsT4cS0mEmvAS .icon-shape .label rect,#mermaid-svg-rhjlsT4cS0mEmvAS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rhjlsT4cS0mEmvAS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rhjlsT4cS0mEmvAS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rhjlsT4cS0mEmvAS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Agent 记忆系统
超出窗口时

摘要压缩
会话结束时

有价值信息提取
检索相关记忆
检索历史上下文
工作记忆

(当前推理上下文)

生命周期:单次推理
会话记忆

(对话历史+摘要)

生命周期:单次会话
长期记忆

(向量库+知识图谱)

生命周期:永久

图:Agent 三层记忆系统架构

工作记忆(Working Memory):

工作记忆就是 LLM 的当前推理上下文------System Prompt + 最近几轮对话 + 工具返回结果。它的容量受限于模型的上下文窗口。

python 复制代码
# 工作记忆的管理
class WorkingMemory:
    def __init__(self, max_tokens: int = 128000):
        self.messages = []
        self.max_tokens = max_tokens
        self.current_tokens = 0
    
    def add_message(self, message: dict):
        """添加消息到工作记忆"""
        tokens = count_tokens(message["content"])
        if self.current_tokens + tokens > self.max_tokens:
            self._compress()  # 超出窗口,触发压缩
        self.messages.append(message)
        self.current_tokens += tokens
    
    def _compress(self):
        """压缩策略:旧消息摘要 + 保留最近N条"""
        old_messages = self.messages[:-5]  # 保留最近5条
        recent = self.messages[-5:]
        summary = llm_summarize(old_messages)
        self.messages = [
            {"role": "system", "content": f"之前对话摘要:{summary}"}
        ] + recent
        self.current_tokens = count_tokens(str(self.messages))

会话记忆(Session Memory):

会话记忆保存一次完整对话的所有历史。当工作记忆超出窗口时,旧消息被压缩后存入会话记忆。会话结束时,有价值的信息被提取到长期记忆。

长期记忆(Long-term Memory):

长期记忆是 Agent 跨会话的知识库。通常用向量数据库(如 Pinecone、Chroma)实现,存储用户偏好、历史决策、知识沉淀等。

4.3 记忆管理的核心挑战

挑战一:什么时候该写入长期记忆?

不是所有对话内容都值得记住。"今天天气怎么样"不需要写入长期记忆,但"用户偏好用中文回答"需要。

python 复制代码
def should_remember(content: str) -> bool:
    """判断内容是否值得写入长期记忆"""
    # 启发式规则
    remember_signals = [
        "用户偏好", "重要决策", "项目背景",
        "记住这个", "以后都用", "别忘了"
    ]
    return any(signal in content for signal in remember_signals)

挑战二:什么时候该检索长期记忆?

不是每轮对话都需要检索长期记忆。无脑检索会浪费 Token、降低响应速度。

python 复制代码
def should_retrieve(user_input: str) -> bool:
    """判断是否需要检索长期记忆"""
    # 需要检索的信号
    retrieve_signals = [
        "上次", "之前", "你还记得", "我们讨论过",
        "我的偏好", "历史"
    ]
    return any(signal in user_input for signal in retrieve_signals)

挑战三:什么时候该遗忘?

长期记忆不是越多越好。过时的信息会干扰 Agent 的决策。需要设计"遗忘机制"------定期清理不再相关、已过时的记忆。

python 复制代码
def forget_outdated(memory_store, current_time):
    """定期清理过时记忆"""
    for memory in memory_store:
        age = current_time - memory.created_at
        if age > timedelta(days=90):  # 超过90天
            if memory.relevance_score < 0.3:  # 相关性低于阈值
                memory_store.delete(memory.id)

五、三位一体的协作机制

5.1 完整的任务执行时序

外部系统 工具层 长期记忆 会话记忆 LLM 模型 工作记忆 用户 外部系统 工具层 长期记忆 会话记忆 LLM 模型 工作记忆 用户 #mermaid-svg-0xxSwPv2461pv5NY{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-0xxSwPv2461pv5NY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0xxSwPv2461pv5NY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0xxSwPv2461pv5NY .error-icon{fill:#552222;}#mermaid-svg-0xxSwPv2461pv5NY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0xxSwPv2461pv5NY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0xxSwPv2461pv5NY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0xxSwPv2461pv5NY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0xxSwPv2461pv5NY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0xxSwPv2461pv5NY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0xxSwPv2461pv5NY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0xxSwPv2461pv5NY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0xxSwPv2461pv5NY .marker.cross{stroke:#333333;}#mermaid-svg-0xxSwPv2461pv5NY svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0xxSwPv2461pv5NY p{margin:0;}#mermaid-svg-0xxSwPv2461pv5NY .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0xxSwPv2461pv5NY text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-0xxSwPv2461pv5NY .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-0xxSwPv2461pv5NY .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-0xxSwPv2461pv5NY .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-0xxSwPv2461pv5NY .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-0xxSwPv2461pv5NY #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-0xxSwPv2461pv5NY .sequenceNumber{fill:white;}#mermaid-svg-0xxSwPv2461pv5NY #sequencenumber{fill:#333;}#mermaid-svg-0xxSwPv2461pv5NY #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-0xxSwPv2461pv5NY .messageText{fill:#333;stroke:none;}#mermaid-svg-0xxSwPv2461pv5NY .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0xxSwPv2461pv5NY .labelText,#mermaid-svg-0xxSwPv2461pv5NY .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-0xxSwPv2461pv5NY .loopText,#mermaid-svg-0xxSwPv2461pv5NY .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-0xxSwPv2461pv5NY .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-0xxSwPv2461pv5NY .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-0xxSwPv2461pv5NY .noteText,#mermaid-svg-0xxSwPv2461pv5NY .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-0xxSwPv2461pv5NY .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0xxSwPv2461pv5NY .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0xxSwPv2461pv5NY .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-0xxSwPv2461pv5NY .actorPopupMenu{position:absolute;}#mermaid-svg-0xxSwPv2461pv5NY .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-0xxSwPv2461pv5NY .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-0xxSwPv2461pv5NY .actor-man circle,#mermaid-svg-0xxSwPv2461pv5NY line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-0xxSwPv2461pv5NY :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} "帮我查上周销量,对比上上周,生成报告" 输入 + 上下文 意图理解:需要查询数据 + 对比 + 生成报告 检索会话历史 无相关历史(新会话) 检索长期记忆 用户偏好简洁报告,上周=9月1日-7日 规划:1.查上周 2.查上上周 3.对比 4.生成报告 调用 query_sales(week="上周") SQL查询 上周销量数据 返回结果 更新工作记忆 调用 query_sales(week="上上周") SQL查询 上上周销量数据 返回结果 更新工作记忆 对比分析 + 生成报告 返回报告 写入会话历史 写入"用户查询了9月销售对比"

图:Agent 完整任务执行的端到端时序

5.2 三层之间的状态同步

三层组件之间的状态同步是 Agent 工程化中最容易出问题的地方。常见故障模式:

故障 原因 后果 解决方案
记忆不一致 工作记忆和会话记忆未同步 Agent "忘记"刚才说的话 每轮推理后同步工作→会话
工具结果丢失 工具返回结果未写入工作记忆 Agent 重复调用同一工具 工具结果立即写入工作记忆
长期记忆污染 无价值信息写入长期记忆 检索结果噪声多 写入前过滤,定期清理
上下文膨胀 所有信息都留在工作记忆 Token 超限、成本飙升 主动压缩 + 丢弃策略

5.3 架构设计的状态图

#mermaid-svg-XsJOWxZG0JydCymp{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-XsJOWxZG0JydCymp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-XsJOWxZG0JydCymp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-XsJOWxZG0JydCymp .error-icon{fill:#552222;}#mermaid-svg-XsJOWxZG0JydCymp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-XsJOWxZG0JydCymp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-XsJOWxZG0JydCymp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-XsJOWxZG0JydCymp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-XsJOWxZG0JydCymp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-XsJOWxZG0JydCymp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-XsJOWxZG0JydCymp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-XsJOWxZG0JydCymp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-XsJOWxZG0JydCymp .marker.cross{stroke:#333333;}#mermaid-svg-XsJOWxZG0JydCymp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-XsJOWxZG0JydCymp p{margin:0;}#mermaid-svg-XsJOWxZG0JydCymp defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-XsJOWxZG0JydCymp g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-XsJOWxZG0JydCymp g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-XsJOWxZG0JydCymp g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-XsJOWxZG0JydCymp g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-XsJOWxZG0JydCymp g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-XsJOWxZG0JydCymp .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-XsJOWxZG0JydCymp .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-XsJOWxZG0JydCymp .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-XsJOWxZG0JydCymp .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-XsJOWxZG0JydCymp .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-XsJOWxZG0JydCymp .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-XsJOWxZG0JydCymp .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-XsJOWxZG0JydCymp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-XsJOWxZG0JydCymp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-XsJOWxZG0JydCymp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-XsJOWxZG0JydCymp .edgeLabel .label text{fill:#333;}#mermaid-svg-XsJOWxZG0JydCymp .label div .edgeLabel{color:#333;}#mermaid-svg-XsJOWxZG0JydCymp .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-XsJOWxZG0JydCymp .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-XsJOWxZG0JydCymp .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-XsJOWxZG0JydCymp .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-XsJOWxZG0JydCymp .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-XsJOWxZG0JydCymp .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XsJOWxZG0JydCymp .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XsJOWxZG0JydCymp #statediagram-barbEnd{fill:#333333;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-XsJOWxZG0JydCymp .cluster-label,#mermaid-svg-XsJOWxZG0JydCymp .nodeLabel{color:#131300;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-XsJOWxZG0JydCymp .note-edge{stroke-dasharray:5;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-note text{fill:black;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram-note .nodeLabel{color:black;}#mermaid-svg-XsJOWxZG0JydCymp .statediagram .edgeLabel{color:red;}#mermaid-svg-XsJOWxZG0JydCymp #dependencyStart,#mermaid-svg-XsJOWxZG0JydCymp #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-XsJOWxZG0JydCymp .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-XsJOWxZG0JydCymp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 收到用户输入
需要历史上下文
获取记忆
无需检索
需要工具
无需工具
工具返回结果
需要继续
任务完成
写入记忆
返回用户
重试(可恢复错误)
不可恢复错误
返回降级结果
空闲
感知
检索记忆
规划
执行
生成
评估
更新记忆
降级

图:Agent 状态机的完整生命周期

图:Agent三位一体组件协作的全景示意图


六、常见架构设计陷阱

6.1 陷阱一:工具过载

现象:把所有可能的工具一次性塞给模型,导致 System Prompt 超长、模型选错工具。

根因:没有工具加载策略,所有工具始终可用。

解决方案:动态工具加载------根据任务类型只加载相关工具。

python 复制代码
# 按任务类型分组工具
TOOL_GROUPS = {
    "data_analysis": ["query_db", "statistical_analysis", "generate_chart"],
    "content_creation": ["search_web", "write_article", "format_markdown"],
    "dev_ops": ["check_logs", "restart_service", "run_script"],
}

def get_tools_for_task(task_type: str) -> list:
    """根据任务类型返回相关工具集"""
    return TOOL_GROUPS.get(task_type, [])

6.2 陷阱二:记忆无限膨胀

现象:长期记忆越积越多,检索质量持续下降。

根因:没有遗忘机制和记忆评分策略。

解决方案:记忆分级 + 定期清理。高频访问的记忆保留,低频访问且过时的记忆遗忘。

6.3 陷阱三:线性思维链

现象:Agent 按固定步骤执行,遇到异常时不知道调整计划。

根因:System Prompt 规定了固定执行流程。

解决方案:给 Agent 反思和重新规划的能力。


七、适用边界

7.1 三位一体架构的适用场景

✅ 适合:

  • 需要多步推理的复杂任务
  • 需要调用外部工具的业务流程
  • 需要跨会话保持上下文的应用
  • 需要自主决策的场景

7.2 不适用场景

⚠️ 不适合:

  • 单轮问答(用 RAG 就够了,不需要 Agent 架构)
  • 固定流程的自动化(用传统工作流引擎更可靠)
  • 对延迟极敏感的场景(Agent 循环推理会增加延迟)
  • 对确定性要求极高的场景(LLM 推理有随机性)

7.3 架构选择的决策建议

场景 推荐架构 理由
知识问答 RAG(非Agent) 单轮检索足够,不需要循环
多步信息查询 轻量 Agent(模型+工具) 不需要长期记忆
个性化助手 完整三位一体 需要跨会话记忆用户偏好
业务流程自动化 完整三位一体 需要工具调用+状态管理
数据分析 轻量 Agent(模型+工具) 不需要长期记忆但需要工具

八、总结

图:Agent三位一体架构核心设计要点总结图

8.1 核心观点

本文将 AI Agent 的核心架构拆解为"三位一体"------模型(大脑)+ 工具(双手)+ 记忆(海马体)。三个组件不是线性串联,而是在一个循环中持续交互:模型读取记忆→规划→调用工具→评估结果→更新记忆→继续规划。

三层之间最关键的工程挑战是状态同步------工作记忆、会话记忆和长期记忆之间的协调策略决定了 Agent 的实际表现。记忆不是越多越好、工具不是越多越好,关键在于"按需"------按需加载工具、按需检索记忆、按需写入记忆。

8.2 下篇预告

下一篇《从 Prompt Engineering 到 Agent Engineering:开发范式的代际跃迁》将从架构层面走向开发方法论,分析 Agent 时代的开发范式如何从"调 Prompt"进化为"设计系统",以及这种范式转变对开发者技能树的影响。


参考资料

相关推荐
一木 之林1 小时前
李沐深度学习191集课程全解析:模块拆解、学习路径
人工智能·深度学习
柚稚姐姐1 小时前
npx @deepseek-ai/dsh web不跳转UI
ai
tqs_123451 小时前
OPC量产变现|全网挖掘6个可直接落地AI软件需求清单
大数据·人工智能
IT古董1 小时前
《FDE前沿部署工程师实战教程》11 - 企业Agent部署实战:Docker、API Gateway与生产环境
人工智能·学习
醍醐实验室1 小时前
分布式显存优化器:ZeRO-Offload 异构内存(CPU/NVMe)卸载调度
人工智能·zero-offload
某林2121 小时前
机器人重启失联:DDS 发现机制与传输层静默故障
人工智能·python·机器人·硬件架构·ros2
利刃大大1 小时前
我用 GPT-6 给江南大学建了个 3D 沙盘
gpt·3d·ai·blender·江南大学
aneasystone本尊1 小时前
学习大模型推理的采样策略
人工智能
IT_陈寒1 小时前
SpringBoot自动配置失效时我差点把电脑扔了
前端·人工智能·后端