第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 的销售数据,找出增长最快的产品线,并给出下季度的推广建议。”
这个任务拆下去至少包含:
- 加载并描述销售数据(analyze_csv)
- 按产品线分组计算增长率
- 找出增长最快的产品线
- 搜索该产品的市场信息
- 结合数据和市场信息生成建议
没有规划模块,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 有"持续感",不是每次都从零开始
思考题
- 如果你设计一个 Agent,工具数量限制在 5 个以内,你怎么选择?优先级怎么排?
- 短期记忆(存在 context 里)会随着对话变长而被截断。长任务中如何设计记忆的"生命值"决策?