第 10 章 分层记忆架构——让 Agent 拥有持久且有序的知识 在上一章中,我们看到了 GA 如何通过 9 个原子工具同时降低提示词层面的上下文开销和策略层面的决策复杂度。但工具层控制的是每轮固定成本,更大的挑战在于跨任务的知识积累——记忆。 一个只有短期记忆的 Agent,每次启动都从零开始,重复犯同样的错误,重复探索同样的路径。而一个拥有良好记忆系统的 Agent,能够把过去的经验转化为未来的效率。那么,GA 如何在"记住更多"和"上下文不爆炸"之间取得平衡? 10.1 为什么 Full-History Append 行不通 10.1.
在上一章中,我们看到了 GA 如何通过 9 个原子工具同时降低提示词层面的上下文开销和策略层面的决策复杂度。但工具层控制的是每轮固定成本,更大的挑战在于跨任务的知识积累——记忆。
一个只有短期记忆的 Agent,每次启动都从零开始,重复犯同样的错误,重复探索同样的路径。而一个拥有良好记忆系统的 Agent,能够把过去的经验转化为未来的效率。那么,GA 如何在"记住更多"和"上下文不爆炸"之间取得平衡?
想象你有一个笔记本,从工作第一天起,你就把每天的所有工作内容——会议记录、邮件、临时想法、代办事项——全部按时间顺序写进去,从不整理、从不删除。
10 年后,你需要查找一条关于某个客户的关键信息。你打开这本笔记,面对的是几万页密密麻麻的文字。即使信息确实存在其中,要找到它的成本也是巨大的——你可能需要翻阅数百页才能定位到那一行关键记录。
这就是全量历史追加(Full-History Append) 策略的困境:记住了一切,却等于什么都没记住。
论文指出,在传统 Agent 框架中,prior interactions、intermediate states 和 execution traces 会随着任务推进持续累积,逐步消耗上下文预算,将决策关键信息埋没在低价值内容之下,从而降低每一步的推理质量。
这个问题的严重性可以从实验数据中直观看到。在安装了 20 个技能并经过大量使用之后,不同 Agent 系统对一条最简请求("Hello")产生的完整提示词长度(Full Prompt Length) 差异巨大:
| 系统 | 完整提示词长度(tokens) |
|---|---|
| OpenClaw | 43,321 |
| CodeX | 23,932 |
| Claude Code | 22,821 |
| GA | 2,298 |
GA 的提示词长度仅为 Claude Code 的 10%,OpenClaw 的 5%。这意味着当其他系统已经被历史记忆"淹没"时,GA 的上下文依然保持着极高的信息密度。论文的结论是:分层检索严格隔离了空闲记忆与活跃提示词,消除了上下文爆炸的风险。
这个 10 倍以上的差距不是因为 GA "记住了更少的东西",而是因为它换了一种方式来记忆。接下来我们就来看看这种方式是什么。
GA 将记忆组织为四个层次。论文明确指出:在这个层级中,L1 构成始终在线记忆,L2 和 L3 共同构成长期记忆,L4 提供持久存储用于追溯和审计。每层有明确的定位和准入标准。我们用一个图书馆的类比来帮助理解:
想象 GA 的记忆系统是一座图书馆:
这四层记忆之间并非孤立存在,而是通过一条L1→L2/L3 路由链协同工作:

图 10-1:GA 分层记忆架构。始终加载区域(Always Load)包含元记忆规则和工作记忆;按需加载区域(Load on Demand)通过 L1 索引路由到 L2 事实层和 L3 SOP 层;L4 归档层存储压缩后的历史会话,用于追溯和审计。自我进化机制将执行经验蒸馏为可复用的 SOP、代码和技能,写回长期记忆。(来源:论文 Figure 2)
路由过程是这样的:
file_read 按需加载更深层的事实或 SOP 内容注意这里的关键设计:路由通过工具调用和提示策略来强制执行(enforced),而非硬编码的强制流水线。模型根据任务需要自主决定是否读取更深层的记忆,无关内容不会进入活跃上下文。
四层记忆的质量靠严格的准入标准来保证:
L2 事实层:
L3 SOP 层:
这种严格的准入机制就是 GA 防止记忆污染(Memory Pollution) 的核心手段。试想,如果任何信息都可以随意写入长期记忆,那么错误的经验、过时的配置、一次性的调试信息都会混入其中,最终让记忆变得不可信。
记忆消融实验(Memory Ablation)直接验证了"精炼记忆优于全量记忆"的设计假设。实验在 SOP-Bench 的危险品分类子集(dangerous goods)上进行,使用任务成功率(Task Success Rate, TSR) 衡量行为表现,使用记忆大小衡量上下文成本。
实验对比了四种记忆配置:
| 记忆配置 | 记忆大小(tokens) | 任务成功率(%) |
|---|---|---|
| No-Memory | 0 | 13.87 |
| Full-Memory | 575 | 52.44 |
| Redundant-Memory | 288 | 66.48 |
| Condensed Memory | 165 | 66.48 |
结果表明:No-Memory 的表现远差于所有使用记忆的配置,说明外部程序性记忆对该任务是必要的。Condensed Memory 用 165 个 token(不到全量记忆的三分之一)达到了与 Redundant-Memory 相同的最高成功率,且远超 Full-Memory。Redundant-Memory 尽管使用了更多 token,却没有比 Condensed Memory 带来任何额外收益——背景描述、定义和解释性文本增加了上下文负担,却没有贡献额外的行为价值。
论文的结论是:GA 从中受益最大的是那些只存储模型尚未掌握的、关键的、能直接改变行为的少量信息的记忆。
在四层记忆之上,GA 还有一个元记忆层(Meta-Memory Layer)——它不存储具体知识,而是定义记忆系统本身的运行规则。
如果四层记忆是图书馆的书架,那么元记忆就是图书馆的管理章程——它规定了:
论文指出,元记忆定义了整体记忆地图(memory map)、核心规则(core rules)和更新边界(update boundaries),在执行开始之前就为模型提供了一个共享的参考框架,使其了解记忆的组织方式、各层用途和更新规范。这一设计的直接效果是减少了三类问题:
一个容易被忽略的细节是:元记忆的完整内容(meta-SOP)也是通过 file_read 按需加载的,而非全部预加载。始终注入的只是元记忆的核心规则摘要,这确保了始终在线层的轻量化。
除了长期记忆(L1–L4)和元记忆,GA 还维护一个工作记忆(Working Memory),负责在单次任务执行过程中保持上下文的连贯性。
工作记忆就是你桌上的草稿纸。当你在做一项复杂任务时,你会在草稿纸上写下当前进度、关键发现、待办事项。这张草稿纸不会被归档到图书馆——任务结束后它就可以丢掉了,除非上面有值得永久保存的内容。
论文 §2.3.2 指出,工作记忆在每一轮中持续注入,只携带最小必要的任务状态:当前目标、约束和进度,使 Agent 无需每次重建完整上下文即可维持执行连续性。
具体来说,工作记忆锚点(working-memory anchor)包含三个组成部分:
update_working_checkpoint 工具主动维护,记录当前目标、关键发现和下一步计划这个锚点在每次工具调用后自动附加到下一条用户消息中。当早期消息被第 11 章的压缩机制驱逐后,这个锚点就成为长期记忆的唯一来源,确保任务关键信息始终留在活跃上下文中。
工作记忆与长期记忆的关键区别:
| 维度 | 工作记忆 | 长期记忆(L2–L4) |
|---|---|---|
| 生命周期 | 单次任务 | 跨任务持久 |
| 注入方式 | 每轮自动注入 | 按需加载 |
| 晋升关系 | 不自动晋升为长期记忆 | 经过验证后才能写入 |
| 内容特征 | 当前任务的进度和发现 | 可复用的事实和流程 |
这里的"不自动晋升"是一个重要的设计决策。论文明确指出,GA 在最低记忆层级(L4)保存原始执行轨迹,但不会自动将这些轨迹提升到更高的长期记忆层级(L2/L3)。可复用的 L3 SOP 只能通过显式的蒸馏步骤生成——这个过程将在第 12 章详细讨论。
概括来看,论文将 GA 的记忆系统划分为三种功能不同的记忆类型:
┌───────────────────────────────────────────────────────────┐ │ GA 记忆系统全景 │ ├───────────────┬──────────────┬────────────────────────────┤ │ 工作记忆 │ 始终在线记忆 │ 长期记忆 │ │ (草稿纸) │ (随身卡片) │ (图书馆) │ ├───────────────┼──────────────┼────────────────────────────┤ │ 轮次摘要 │ 元记忆核心 │ L2 事实 + L3 SOP + L4 归档 │ │ 轮次编号 │ L1 索引 │ │ │ key_info 块 │ │ │ ├───────────────┼──────────────┼────────────────────────────┤ │ 每轮注入 │ 启动时注入 │ 按需加载 │ └───────────────┴──────────────┴────────────────────────────┘
论文对这三种类型的定位非常明确:
论文指出,这种划分直接体现了上下文信息密度最大化原则:每种类型的记忆只在必要的时刻、以必要的粒度出现在活跃上下文中。
论文的核心设计思路可以用一句话概括:避免将所有保留的信息默认视为提示词常驻内容——只有一个小型的始终在线层保持可见,更深层的记忆仅在需要时访问。
这与大多数 Agent 系统的做法截然不同。典型的做法是在每次任务启动时,把所有"可能相关"的记忆内容全部注入上下文——这就是为什么 Claude Code 和 OpenClaw 的提示词长度高达 2 万以上。而 GA 只注入一个紧凑的索引,等到模型真正需要某条知识时,才通过工具调用去读取。
一个自然的疑问是:随着 L2 和 L3 不断积累新知识,L1 索引是否也会无限增长?
论文指出,L1 的有界性是整个架构的一个关键设计不变量(critical design invariant):即使 L2 和 L3 持续扩展,L1 仍然保持有界。
原因在于:L1 中每条记录只编码某个知识类别的存在性(existence),而非其实质内容。只有当真正出现新的知识类别时,才会引入新的 L1 条目。因此,L1 的总体描述长度趋近于知识集分类结构的 Kolmogorov 复杂度——这是一个理论上的下界。
这种极致的压缩之所以可行,是因为 LLM 自身充当了解码器:一旦模型从 L1 中推断出某个相关的能力或事实存在,它就可以花费工具调用和 token 来从更深层检索完整内容。因此,一个最小化的存在性信号就足以实现准确的路由。
这就是 GA 提示词长度能始终保持在 2,298 token 的根本原因——不是通过"少记",而是通过将 L1 约束为一个与知识总量无关的有界索引。
按需加载(On-Demand Loading) 的具体流程:
file_read 读取对应的 L3 文件这种策略确保了上下文预算始终分配给当前任务真正需要的信息,而不是"以防万一"预加载的大量冗余内容。
当一次任务执行产生了值得长期保存的新知识时,GA 不会立即写入记忆,而是采用触发提交(Triggered Commit) 机制:
这种"先验证再提交"的机制,防止了记忆以不受控的方式随时间增长。
分层记忆的按需加载策略不仅控制了上下文膨胀(如 §10.1 所示的提示词长度对比),还在长期事实记忆任务上表现出色。
实验在 LoCoMo 基准测试 上进行,对比了两类方法:
| 系统 | 多跳推理 F1 | 多跳推理 BLEU-1 | 时序推理 F1 | 时序推理 BLEU-1 | 开放域 F1 | 开放域 BLEU-1 | 单跳查询 F1 | 单跳查询 BLEU-1 |
|---|---|---|---|---|---|---|---|---|
| Mem0(嵌入式) | 39.32 | 28.43 | 50.03 | 43.33 | 18.32 | 13.80 | 40.32 | 32.33 |
| A-MEM(嵌入式) | 29.03 | 20.48 | 46.83 | 38.84 | 13.11 | 12.94 | 44.68 | 37.01 |
| OpenClaw | 21.43 | 18.41 | 22.56 | 20.43 | 9.56 | 9.03 | 23.44 | 24.21 |
| GA | 43.33 | 39.96 | 52.23 | 51.11 | 20.41 | 15.31 | 45.69 | 40.66 |
GA 在所有四个类别上都取得了最高的 F1 和 BLEU-1 分数。论文指出,GA 的优势在多跳推理和时序推理任务上尤为明显——这说明 GA 不仅能保持长期事实记忆,还能在跨时间和跨事实链的推理中有效利用这些记忆。即使在所有方法都表现最差的开放域类别中,GA 仍然取得了最高分。
论文的核心结论是:长期事实记忆可以通过精确的记忆组织和过滤来实现,GA 不需要额外的嵌入模型或向量数据库来构建这种能力。
本章深入剖析了 GA 的分层记忆架构。核心要点:
但记忆分层解决的是"什么信息该进入上下文"的问题。当任务执行到中后期,即使有了分层记忆,单次对话内累积的历史消息依然会越来越长。GA 如何在不丢失关键信息的前提下,主动控制每一轮的上下文大小?这就是下一章的主题——上下文截断与压缩。