第11章:Agent 核心架构拆解——四个缺一不可的组件

第11章:Agent 核心架构拆解——四个缺一不可的组件

系列导读:本章深入 Agent 的内部结构。如果你准备亲手实现一个 Agent,这就是你要看的「系统说明书"。


一、Agent架构全景:四个核心组件

一个完整的 Agent 系统由以下四个核心组件构成,任何一个掉链子,系统都跑不好:

┌─────────────────────────────────────┐
│            用户输入                  │
└─────────────┬───────────────────────┘
              ↓
┌─────────────────────────────────────┐
│  1. LLM 核心   ←所有决策的中枢      │
│     ↓                                │
│  2. 规划模块   ←把目标拆成步骤      │
│     ↓                                │
│  3. 工具系统   ←实际执行的能力       │
│     ↓                                │
│  4. 记忆系统   ←持续维护的状态       │
└─────────────────────────────────────┘

二、组件1:LLM 核心

LLM 是整个 Agent 的「大脑」。

  • 所有输入(用户指令、工具返回结果、记忆内容)最终都经过 LLM 来理解和决策
  • LLM 负责判断:下一步该做什么?继续思考?调用工具?还是输出最终答案?

System Prompt 的关键作用

System Prompt 就是给 Agent 的「岗位说明书」,定义了:

你是一个专业的数据分析助手。
你的任务是帮助用户分析数据并生成报告。

你可以使用的工具:
1. analyze_csv:读取 CSV 文件并做基础统计分析
2. generate_chart:根据数据生成可视化图表
3. web_search:搜索最新行业信息
4. write_report:生成结构化报告

你的工作流程:
1. 先理解用户的数据分析目标
2. 使用 analyze_csv 了解数据概况
3. 根据数据特征选择分析方向
4. 使用 generate_chart 生成必要的可视化
5. 最后使用 write_report 生成完整报告

System Prompt 写得好不好,直接决定 Agent 的行为模式。它是工程质量最不可控的变量之一。

三、组件2:规划模块(Planning)

规划模块解决的是:怎么把一个大目标拆成可执行的步骤?

为什么需要规划?

想象你让 Agent 完成:“帮我分析我们公司 Q2 的销售数据,找出增长最快的产品线,并给出下季度的推广建议。”

这个任务拆下去至少包含:

  1. 加载并描述销售数据(analyze_csv)
  2. 按产品线分组计算增长率
  3. 找出增长最快的产品线
  4. 搜索该产品的市场信息
  5. 结合数据和市场信息生成建议

没有规划模块,LLM 一次调用只能做一件事,可能会重复、遗漏或顺序错乱。

两种规划策略

策略 实现方式 特点
静态规划 预先定义步骤序列(工作流) 确定性高,灵活性差
动态规划 让 LLM 每一步自己决定方向和工具 灵活性强,可控性差
混合规划 大方向固定,具体操作让 LLM 决定 推荐方案
动态规划示例(ReAct 模式):
步骤1:Thought "我需要先了解数据概况" → Action: analyze_csv
步骤2:Thought "数据里有哪些列?产品分类是什么?" → 根据结果继续
步骤3:Thought "让我按产品线计算增长率" → Action: analyze_csv + 参数

四、组件3:工具系统(Tool System)

工具系统是 Agent 与外部世界交互的「四肢」。

工具不是越多越好。过多的工具会让 LLM 的选择困难增加(context 装不下、选错概率上升)。

工具定义的关键要素

{
  "name": "web_search",
  "description": "当需要获取某个领域的最新信息、验证某个事实、或者了解某个概念时使用。注意:不要用来查询本地数据库的内容",
  "parameters": {
    "query": {
      "type": "string",
      "description": "搜索关键词,建议3-5个关键词,不要太长"
    }
  }
}

description 是核心门槛——模型基于 description 决定用不用这个工具。写好 description 的技巧:

  • 明确什么场景用
  • 明确什么场景不用
  • 给出使用示例
  • 说明参数要求

工具的返回值设计

工具返回的结果也需要精心格式化:

工具调用的结果应该:
1. 结构化(JSON 或 Markdown 表格)
2. 包含执行状态(成功/失败)
3. 失败时包含错误信息和可能的修正建议
4. 避免过长的原始输出,必要时做摘要

五、组件4:记忆系统(Memory)

记忆系统解决的是:Agent 怎么记得之前做过什么?

记忆分四个层次:

层次 内容 存储位置 生命周期
感知记忆 当前输入的原始内容 内存 即时
短期记忆 当前对话/任务的历史 Context window 当前任务
长期记忆 跨会话的知识和经验 向量数据库/结构化存储 持续
实体记忆 提取的结构化事实 图数据库/KV 存储 持续

为什么记忆系统这么重要?

没有记忆的 Agent:

  • 你在上一步确认了技术方案,下一步它就不记得了
  • 它不知道你的偏好(代码风格、输出格式)
  • 它无法在多个任务之间保持连贯性

有记忆的 Agent:

  • 记住你们的约定和达成的共识 → 持续协作质量提升
  • 记住任务的历史决策 → 避免重复讨论、减少沟通成本
  • 跨任务积累对你的了解 → 越来越懂你

六、四个组件的协同

用户:分析 sales.csv

LLM(理解目标)→ 规划模块:
  "目标:分析销售数据 → 步骤:1.读数据 2.做统计 3.出报告"

LLM(步骤1)→ "调 analyze_csv(sales.csv)"
  → 工具系统执行 → 返回数据描述

LLM(步骤2)→ 看到数据是时间序列 → "调 analyze_csv + 增长分析参数"
  → 工具系统执行 → 返回分析结果

记忆系统:记录当前进度、中间结果、用户偏好

LLM(步骤3)→ "数据够用,生成报告"
  → 调 write_report → 输出最终答案给用户

七、本章小结

  • Agent 四大组件:LLM(大脑)、规划(怎么拆任务)、工具(怎么做)、记忆(记得什么)
  • LLM 的 System Prompt 定义了 Agent 的"人格"和"行为边界"
  • 规划模块是连接目标和执行的桥梁,静态保守、动态灵活
  • 工具系统的 description 质量直接决定调用准确率
  • 记忆系统让 Agent 有"持续感",不是每次都从零开始

思考题

  1. 如果你设计一个 Agent,工具数量限制在 5 个以内,你怎么选择?优先级怎么排?
  2. 短期记忆(存在 context 里)会随着对话变长而被截断。长任务中如何设计记忆的"生命值"决策?