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

图 10-1:GA 分层记忆架构。始终加载区域(Always Load)包含元记忆规则和工作记忆;按需加载区域(Load on Demand)通过 L1 索引路由到 L2 事实层和 L3 SOP 层;L4 归档层存储压缩后的历史会话,用于追溯和审计。自我进化机制将执行经验蒸馏为可复用的 SOP、代码和技能,写回长期记忆。(来源:论文 Figure 2 [1])
路由过程是这样的 [1, Section 2.3.2]:
- 任务启动时,GA 默认只注入元记忆和 L1 索引层到上下文中。元记忆提供记忆系统的组织规则和更新边界,L1 提供紧凑的导航指针(高频入口、关键词映射等)
- 当 LLM 在推理过程中发现需要某类知识时,它沿着 L1→L2/L3 路由链,通过
file_read按需加载更深层的事实或 SOP 内容 - 加载的内容进入当前轮的上下文,随着对话推进,会被第 11 章的四阶段压缩流水线处理
注意这里的关键设计:路由通过工具调用和提示策略来强制执行(enforced),而非硬编码的强制流水线 [1, Section 2.3.2]。模型根据任务需要自主决定是否读取更深层的记忆,无关内容不会进入活跃上下文。
10.2.3 每层的准入标准与内容定义
四层记忆的质量靠严格的准入标准来保证 [1, Section 2.3.2]:
L2 事实层:
- 内容定义:存储经过验证的、长期稳定的事实信息
- 准入标准:信息必须经过执行验证(不是"听说",而是"确认"),且具有跨任务可复用性
- 排除清单:瞬态状态(transient states)、一次性事件(one-time events)、未验证假设(unverified hypotheses)一律排除
L3 SOP 层:
- 内容定义:存储可复用的流程知识,包括任务工作流、前置条件、关键执行步骤、常见故障案例及调试恢复策略
- 准入标准:流程必须来自经过成功工具执行验证的操作(论文称之为 "No Execution, No Memory" 规则 [1, Section 2.1.3]——不是"应该这样做",而是"这样做了,而且成功了"),且具有跨任务可复用性
这种严格的准入机制就是 GA 防止记忆污染(Memory Pollution) 的核心手段。试想,如果任何信息都可以随意写入长期记忆,那么错误的经验、过时的配置、一次性的调试信息都会混入其中,最终让记忆变得不可信。
10.2.4 实验印证:精炼记忆优于全量记忆
记忆消融实验(Memory Ablation)直接验证了"精炼记忆优于全量记忆"的设计假设。实验在 SOP-Bench 的危险品分类子集(dangerous goods)上进行,使用任务成功率(Task Success Rate, TSR) 衡量行为表现,使用记忆大小衡量上下文成本 [1, Section 4.3.2, Table 5]。
实验对比了四种记忆配置:
- No-Memory:不使用任何外部记忆,仅依赖任务输入和工具描述
- Full-Memory:注入完整的、未经编辑的原始 SOP 作为外部知识
- Redundant-Memory:在 Condensed Memory 的基础上扩展了背景描述、定义和弱相关信息
- Condensed Memory:仅保留高密度的、行动导向的规则
| 记忆配置 | 记忆大小(tokens) | 任务成功率(%) |
|---|---|---|
| No-Memory | 0 | 13.87 |
| Full-Memory | 575 | 52.44 |
| Redundant-Memory | 288 | 66.48 |
| Condensed Memory | 165 | 66.48 |
结果表明 [1, Section 4.3.2]:No-Memory 的表现远差于所有使用记忆的配置,说明外部程序性记忆对该任务是必要的。Condensed Memory 用 165 个 token(不到全量记忆的三分之一)达到了与 Redundant-Memory 相同的最高成功率,且远超 Full-Memory。Redundant-Memory 尽管使用了更多 token,却没有比 Condensed Memory 带来任何额外收益——背景描述、定义和解释性文本增加了上下文负担,却没有贡献额外的行为价值。
论文的结论是:GA 从中受益最大的是那些只存储模型尚未掌握的、关键的、能直接改变行为的少量信息的记忆 [1, Section 4.3.2]。
10.3 元记忆:记忆的管理规则
在四层记忆之上,GA 还有一个元记忆层(Meta-Memory Layer)——它不存储具体知识,而是定义记忆系统本身的运行规则。
10.3.1 直觉理解
如果四层记忆是图书馆的书架,那么元记忆就是图书馆的管理章程——它规定了:
- 图书馆有哪些区域(记忆地图)
- 每个区域收什么类型的书(准入规则)
- 新书怎么入库、旧书怎么更新(操作规范)
- 什么书不能收(排除清单)
10.3.2 深入理解:元记忆的功能
论文指出,元记忆定义了整体记忆地图(memory map)、核心规则(core rules)和更新边界(update boundaries),在执行开始之前就为模型提供了一个共享的参考框架,使其了解记忆的组织方式、各层用途和更新规范 [1, Section 2.3.2]。这一设计的直接效果是减少了三类问题:
- 随意写入(arbitrary writes):模型不会在缺乏规范的情况下向任意层级写入未经验证的信息
- 历史误读(historical misreads):模型在读取记忆时有明确的层级语义,不会混淆事实(L2)和流程(L3)
- 跨任务泄漏(cross-task leakage):不同任务的上下文信息不会错误地污染长期记忆
一个容易被忽略的细节是:元记忆的完整内容(meta-SOP)也是通过 file_read 按需加载的,而非全部预加载 [1, Section 2.3.2]。始终注入的只是元记忆的核心规则摘要,这确保了始终在线层的轻量化。
10.4 工作记忆:短期上下文的锚点
除了长期记忆(L1–L4)和元记忆,GA 还维护一个工作记忆(Working Memory),负责在单次任务执行过程中保持上下文的连贯性。
10.4.1 直觉理解
工作记忆就是你桌上的草稿纸。当你在做一项复杂任务时,你会在草稿纸上写下当前进度、关键发现、待办事项。这张草稿纸不会被归档到图书馆——任务结束后它就可以丢掉了,除非上面有值得永久保存的内容。
10.4.2 深入理解:工作记忆的机制
论文 §2.3.2 指出,工作记忆在每一轮中持续注入,只携带最小必要的任务状态:当前目标、约束和进度,使 Agent 无需每次重建完整上下文即可维持执行连续性 [1, Section 2.3.2]。
具体来说,工作记忆锚点(working-memory anchor)包含三个组成部分 [1, Section 2.3.4]:
- 20 条最近的单行轮次摘要——每条约 100 字符,提供近期操作的紧凑回顾
- 当前轮次编号——让模型了解任务执行到了哪一步
- 持久 key_info 块——由 Agent 通过
update_working_checkpoint工具主动维护,记录当前目标、关键发现和下一步计划
这个锚点在每次工具调用后自动附加到下一条用户消息中。当早期消息被第 11 章的压缩机制驱逐后,这个锚点就成为长期记忆的唯一来源,确保任务关键信息始终留在活跃上下文中 [1, Section 2.3.4]。
工作记忆与长期记忆的关键区别:
| 维度 | 工作记忆 | 长期记忆(L2–L4) |
|---|---|---|
| 生命周期 | 单次任务 | 跨任务持久 |
| 注入方式 | 每轮自动注入 | 按需加载 |
| 晋升关系 | 不自动晋升为长期记忆 | 经过验证后才能写入 |
| 内容特征 | 当前任务的进度和发现 | 可复用的事实和流程 |
这里的"不自动晋升"是一个重要的设计决策。论文明确指出,GA 在最低记忆层级(L4)保存原始执行轨迹,但不会自动将这些轨迹提升到更高的长期记忆层级(L2/L3)。可复用的 L3 SOP 只能通过显式的蒸馏步骤生成——这个过程将在第 12 章详细讨论 [1, Section 2.1.3]。
10.4.3 三种记忆功能的分离
概括来看,论文将 GA 的记忆系统划分为三种功能不同的记忆类型 [1, Section 2.3.2]:
┌───────────────────────────────────────────────────────────┐
│ GA 记忆系统全景 │
├───────────────┬──────────────┬────────────────────────────┤
│ 工作记忆 │ 始终在线记忆 │ 长期记忆 │
│ (草稿纸) │ (随身卡片) │ (图书馆) │
├───────────────┼──────────────┼────────────────────────────┤
│ 轮次摘要 │ 元记忆核心 │ L2 事实 + L3 SOP + L4 归档 │
│ 轮次编号 │ L1 索引 │ │
│ key_info 块 │ │ │
├───────────────┼──────────────┼────────────────────────────┤
│ 每轮注入 │ 启动时注入 │ 按需加载 │
└───────────────┴──────────────┴────────────────────────────┘论文对这三种类型的定位非常明确 [1, Section 2.3.2]:
- 工作记忆在每轮持续注入,只携带最小必要的任务状态
- 始终在线记忆始终可见,但被刻意压缩为最轻量的导航信息——只提供记忆布局和索引,而非完整知识
- 长期记忆保持在默认上下文之外,通过显式的任务后蒸馏过程管理;只有经过验证的稳定知识才会被写回
论文指出,这种划分直接体现了上下文信息密度最大化原则:每种类型的记忆只在必要的时刻、以必要的粒度出现在活跃上下文中 [1, Section 2.3.2]。
10.5 按需读取 vs 默认注入
10.5.1 核心策略:知道在哪,但不提前加载
论文的核心设计思路可以用一句话概括:避免将所有保留的信息默认视为提示词常驻内容——只有一个小型的始终在线层保持可见,更深层的记忆仅在需要时访问 [1, Section 2.1.2]。
这与大多数 Agent 系统的做法截然不同。典型的做法是在每次任务启动时,把所有"可能相关"的记忆内容全部注入上下文——这就是为什么 Claude Code 和 OpenClaw 的提示词长度高达 2 万以上。而 GA 只注入一个紧凑的索引,等到模型真正需要某条知识时,才通过工具调用去读取。
10.5.2 L1 有界性:为什么索引不会失控膨胀
一个自然的疑问是:随着 L2 和 L3 不断积累新知识,L1 索引是否也会无限增长?
论文指出,L1 的有界性是整个架构的一个关键设计不变量(critical design invariant):即使 L2 和 L3 持续扩展,L1 仍然保持有界 [1, Section 2.3.2]。
原因在于:L1 中每条记录只编码某个知识类别的存在性(existence),而非其实质内容。只有当真正出现新的知识类别时,才会引入新的 L1 条目。因此,L1 的总体描述长度趋近于知识集分类结构的 Kolmogorov 复杂度——这是一个理论上的下界。
这种极致的压缩之所以可行,是因为 LLM 自身充当了解码器:一旦模型从 L1 中推断出某个相关的能力或事实存在,它就可以花费工具调用和 token 来从更深层检索完整内容。因此,一个最小化的存在性信号就足以实现准确的路由 [1, Section 2.3.2]。
这就是 GA 提示词长度能始终保持在 2,298 token 的根本原因——不是通过"少记",而是通过将 L1 约束为一个与知识总量无关的有界索引。
10.5.3 运行时的按需加载策略
按需加载(On-Demand Loading) 的具体流程 [1, Section 2.3.2]:
- 任务启动时,注入元记忆核心 + L1 索引(即"始终在线记忆")
- LLM 在推理过程中发现需要某个 SOP → 调用
file_read读取对应的 L3 文件 - SOP 内容进入当前轮上下文 → 模型根据 SOP 执行任务
- 随着对话推进,早期加载的内容会被第 11 章的四阶段压缩流水线(工具输出截断 → 标签级压缩 → 消息驱逐 → 工作记忆锚点)处理
这种策略确保了上下文预算始终分配给当前任务真正需要的信息,而不是"以防万一"预加载的大量冗余内容。
10.5.4 长期整合的触发提交机制
当一次任务执行产生了值得长期保存的新知识时,GA 不会立即写入记忆,而是采用触发提交(Triggered Commit) 机制 [1, Section 2.3.2]:
- 识别阶段:在任务执行过程中,模型识别出潜在有价值的新信息
- 验证阶段:检验信息的有用性和可复用性——它是否经过了执行验证?它是否只适用于当前任务?(回顾 §10.2.3 的 "No Execution, No Memory" 规则)
- 提交阶段:只有通过验证的信息才被写入 L2 或 L3,采用小幅增量更新而非全量覆盖
- 索引更新:相应地更新 L1 索引,确保新知识可被未来任务发现
这种"先验证再提交"的机制,防止了记忆以不受控的方式随时间增长 [1, Section 2.3.2]。
10.5.5 实验印证:长期事实记忆
分层记忆的按需加载策略不仅控制了上下文膨胀(如 §10.1 所示的提示词长度对比),还在长期事实记忆任务上表现出色。
实验在 LoCoMo 基准测试 [2] 上进行,对比了两类方法 [1, Section 4.3.3, Table 6]:
- 嵌入式方法(embedding-based):Mem0 和 A-MEM,使用 text-embedding-3-small 作为嵌入模型
- 非嵌入式方法(non-embedding):OpenClaw 和 GA,不依赖任何向量数据库或嵌入模型
| 系统 | 多跳推理 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 仍然取得了最高分 [1, Section 4.3.3]。
论文的核心结论是:长期事实记忆可以通过精确的记忆组织和过滤来实现,GA 不需要额外的嵌入模型或向量数据库来构建这种能力 [1, Section 4.3.3]。
10.6 本章小结
本章深入剖析了 GA 的分层记忆架构。核心要点:
- Full-History Append 行不通:传统框架中,历史交互不断累积,逐步消耗上下文预算,将决策关键信息埋没在低价值内容之下
- 四层长期记忆(L1 索引→L2 事实→L3 SOP→L4 归档)通过严格的准入标准和 "No Execution, No Memory" 规则,在"记住更多"和"保持精炼"之间取得了平衡
- L1 有界性是整个架构的关键不变量——L1 只编码知识类别的存在性,其描述长度趋近于知识集分类结构的 Kolmogorov 复杂度,确保索引不会随知识积累而失控膨胀
- 元记忆定义了记忆地图、核心规则和更新边界,防止随意写入、历史误读和跨任务泄漏
- 工作记忆通过轮次摘要、轮次编号和 key_info 块,在每轮注入最小必要的任务状态
- 按需加载 + 触发提交确保了上下文预算始终用在刀刃上
- 精确的记忆组织和过滤使 GA 不需要额外的嵌入模型或向量数据库,就能在长期事实记忆任务上超越专门的向量检索系统
但记忆分层解决的是"什么信息该进入上下文"的问题。当任务执行到中后期,即使有了分层记忆,单次对话内累积的历史消息依然会越来越长。GA 如何在不丢失关键信息的前提下,主动控制每一轮的上下文大小?这就是下一章的主题——上下文截断与压缩。
参考文献
[1] Advantage AI Agent Laboratory. (2025). GenericAgent: A Self-Evolving LLM Agent via Contextual Information Density Maximization. Technical Report V1.0, Sections 2.1.2, 2.1.3, 2.3.2, 2.3.4 & 4.3.
[2] Li, Z., et al. (2024). LoCoMo: Long Context Evaluation for Conversational Memory. ACL.
