前言
当大模型的上下文窗口从 8K 涨到 128K,甚至更长,"记忆"问题并没有自动消失。窗口再大,也装不下一个 Agent 连续运行数周甚至数月的全部对话;而如果只靠滑动窗口把旧消息一刀切掉,Agent 就会像只有很短记忆的鱼------每次见面都像第一次。
这篇文章从工程视角梳理 Agent 记忆系统的常见方案:从最朴素的滑动窗口,到分层摘要、GraphRAG、Reflex 调度,再到仿生的离线"梦境"整合。重点不是罗列名词,而是讲清楚每个方案解决什么问题、代价是什么,以及它们如何组合成一套可落地的分层记忆架构。
一、Agent 的记忆到底要解决什么问题
很多人第一反应是:"把历史对话都塞进上下文不就行了?"
真做起来会撞上三面墙:
-
容量墙:上下文窗口是硬上限。哪怕有 128K token,扣掉 system prompt、工具定义、当前任务和输出预留,真正能放历史的空间并没有想象中多。
-
成本墙:注入更多历史会增加 prefill 计算量、token 费用和首 token 延迟。KV Cache 可以缓解重复前缀的计算,但跨轮、跨任务、跨会话并不能完全依赖它。
-
信噪比墙:十轮前的闲聊和关键决策一起塞进去,模型的注意力会被稀释。尤其当关键约束夹在长上下文中部时,被忽略的风险更高。
所以,记忆系统的本质不是"存得多",而是:
在正确的时机,把正确粒度的信息,以尽可能低的 token 成本,放回上下文中。
这引出整个架构的核心思路:分层 + 异步 + 按需检索 + 定期整理。
二、记忆全生命周期
可以把 Agent 记忆系统拆成五个动作:写入与短期维护、沉淀、调度、固化、整理。

图 1:记忆流水线不是单向存储,而是"写入---沉淀---调度---固化---整理"的闭环。
1. 写入:对话先落盘,短期靠窗口顶着
每一轮对话、每一次工具调用、每一个关键决策,第一件事应该是追加写入 Session 文件,通常可用 JSONL 等格式。这是整个记忆系统的"数据底座"。它本身不是记忆策略,而是保证会话可追溯、可恢复、可审计的工程基础设施。没有这一层,后面的检索和总结都缺少可信来源。
与此同时,运行中的短期上下文需要维护。常见方式有两种:
-
滑动窗口:只保留最近 N 轮,超出直接丢弃。优点是零额外开销、实现简单;缺点是早期关键约束容易被永久冲掉,例如"这个项目用 PostgreSQL,不要写 MySQL 方言"。
-
摘要压缩:把旧对话让模型写成摘要,腾出新空间。它比滑动窗口更能保留脉络,但摘要本身也会膨胀,而且一旦压过一次,原始细节就不在上下文中了。
这两者不是互斥的。生产系统里更常见的是:
滑动窗口 + 溢出摘要 + 原始日志落盘。
窗口负责新鲜度,摘要负责连续性,Session 日志负责可追溯。
2. 沉淀:把重要信息从"热数据"提炼成"冷资产"
不是所有对话都值得进入长期记忆。用户随口说的一句"今天天气不错",和"这个接口的返回格式是这样的",权重天差地别。
沉淀层要做的,是从原始对话中抽取值得长期保留的信息,写入不同形态的存储:
-
事实与偏好:用户是谁、项目用什么技术栈、有哪些硬约束。适合结构化事实库或向量库,例如 mem0 这类用户级记忆中间件。
-
实体关系:谁和谁相关、哪个模块依赖哪个模块。适合知识图谱,例如 GraphRAG、Neo4j、Cognee 这类方案。
-
阶段性总结:一段对话的脉络、一个任务的决策过程。适合组织成分层摘要节点。
这里有个关键权衡:
抽取得越细,后续检索可能越准,但构建和维护成本越高。
扁平向量库便宜、通用,但主要擅长语义相似;知识图谱能表达关系链,但要额外做实体抽取、对齐和 Schema 设计;分层摘要能兼顾细节和成本,但需要设计好下钻触发逻辑。
3. 调度:每一步决策前,该拉什么记忆回来
记忆存得再好,检索策略不行也是白搭。
最朴素的做法是向量检索:当前问题去向量库做相似性搜索,取 top-K 塞回上下文。它简单、通用,但有两个问题:一是召回质量高度依赖 embedding 和分块策略;二是每一步都检索、每一步都注入,token 成本依然不低。
APUS 的 Reflex Agent 思路值得关注:用一个专门的小模型做调度决策,判断下一步该调什么工具、该拉哪段记忆、当前结果是否足够进入下一步,大模型只在真正需要推理的环节出场。具体模型参数和性能提升数字应以项目公开资料为准,不宜直接当作通用结论。
这个思路的核心价值在于:
把"记忆检索策略"从硬编码规则,变成一个可以被学习或优化的决策问题。
传统规则引擎稳定但僵硬;小模型调度更灵活,但需要样本、训练和评估。二者可以结合:规则兜底,模型做复杂判断。
4. 固化:反复验证的流程,沉淀成程序性记忆
前面讲的更多是"陈述性记忆"------记的是"是什么"。Agent 还有一类更值钱的记忆:程序性记忆------记的是"怎么做"。
比如"排查 K8s 的 CrashLoopBackOff,先看 describe,再看 logs,再看 events"这个流程,如果每次都让大模型从零推理,既慢又不稳定。更好的做法是:当某个操作序列被反复验证成功后,把它固化成一个 Skill 或 SOP,下次直接调用。
Co-Engram 的设计里,Skill 不只是静态文档,还带有运行时属性:效用值、成功率、最后使用时间。调用成功就增加权重,长期不用则按遗忘曲线衰减。这相当于 Agent 把"经验"变成了可复用、可进化的能力,而不是每次都从头来过。
5. 整理:离线"梦境",对记忆做再加工
这是最仿生的一层。
人在睡眠时,大脑会对白天的记忆做 consolidation:巩固重要的、关联相关的、淡化琐碎的。Agent 也可以在空闲时段做类似的事:
-
对高权重记忆做二次整合,生成更高层摘要;
-
发现不同记忆之间的隐含关联,写入关系边;
-
生成日记式或阶段性的回顾;
-
清理重复、冲突和低质量条目。
neobrain 的 Dreams 实现提供了一个克制思路:夜间跑重放过程,不决定哪些记忆该删,而是改善已有记忆的组织结构。这个设计值得借鉴------离线阶段不应凭空增加事实,而应优化检索效率和记忆结构。
三、分层记忆模型:L1 / L2 / L3
把上面的动作横向切一刀,就得到经典的三层缓存模型。
| 层级 | 类比 | 存储形态 | 容量 | 访问速度 | 特点 |
|---|---|---|---|---|---|
| L1 工作记忆 | 大脑前额叶 | 当前上下文窗口 | 8K~128K token 或更多 | 最快,直接参与推理 | 易失、贵,只装"正在想的事" |
| L2 短期缓存 | 桌面暂存区 | 压缩摘要、任务状态、近期会话切片 | 中等 | 较快,仍需注入上下文 | 防止信息过早丢失,也防止过早沉淀 |
| L3 长期存储 | 海马体 + 图书馆 | 向量库、知识图谱、Session 全文 | 近乎无限 | 较慢,需要检索 | 持久化、结构化、按需召回 |
信息在层间怎么流动
-
由热变冷:溢出与巩固。L1 窗口满了,旧内容不是直接丢,而是经过摘要进入 L2,或者经过抽取沉淀到 L3。这是一个自动降温的过程。
-
由冷变热:检索与唤醒。面对新问题时,从 L3 精准召回相关片段,注入 L1。注意这里是"精准召回",不是把 L3 全倒进去,否则 L3 就失去意义。
-
L2 是关键缓冲层。没有 L2,L1 溢出的内容要么被摘要一次到位,细节丢失;要么直接全量进 L3,检索压力大。有了 L2,近期会话可以以"半压缩"形态多留一阵,等真正判定重要后再进 L3。
四、各层的关键技术方案对比
写入层:(工作记忆 / 当前上下文窗口)策略补充总结
- 朴素滑动窗口(Fixed Turn Window)
规则:只保留最近 N 轮对话,更早内容直接移出 L1
-
优点:最简单、无额外开销、行为稳定
-
缺点:早期关键约束容易丢失
- 滚动摘要压缩 (Recursive Rolling Summary)
规则:溢出后把旧对话合并成一段摘要,替换原文留在上下文
-
优点:保留会话主线,比纯滑动窗口记忆更长
-
缺点:摘要漂移、细节不可逆丢失、摘要本身持续膨胀
- 分块窗口 + 区块摘要 (Chunked Window + Block Summary)
规则:对话分块;最新块放原文,更早块压缩成块摘要
-
优点:粒度可控,兼顾新鲜细节 + 历史脉络
-
缺点:多段摘要叠加后依然会失真
- 优先级滑动窗口 (Priority-Aware Window)
规则:淘汰不以时间为唯一标准,给消息打分;硬约束、关键指令标记高优优先保留,流水 / 重试日志低分优先剔除
-
优点:非常适合需要记住前置规范(如数据库方言、项目约束)的场景
-
缺点:需要打分模块(规则 / 小模型),复杂度上升
5. 重要性采样(Importance Sampling)
规则:溢出后,从历史里挑选少量高价值原文片段放入 L1,其余丢弃;不生成摘要
-
优点:保留选中内容原始文本,无摘要失真
-
缺点:同样 Token 预算下覆盖历史范围有限
6. 稀疏上下文 + 按需检索 (Sparse Context + On-demand Retrieval)
规则:L1 只维持很短的最近几轮原文,不主动塞大量历史;由调度器(Reflex)判断是否需要,再从 L3/Session 召回相关片段临时注入
-
优点:Token 基线稳定,原始数据在外部,规避摘要失真
-
缺点:召回判断、检索质量直接决定效果
7. 结构化状态投影 State Projection
规则:维护一份轻量结构化状态(JSON)存放配置、任务信息、约束,搭配少量最新对话作为 L1
-
优点:Token 占用极低,规则类信息稳定
-
缺点:抽取难度高,复杂模糊意图难以表达,状态抽取错误会引发幻觉
8. KV 侧锚点压缩 / KV Pooling(SAC 这类)
规则:不在文本层压缩,在模型 KV Cache 层面把长上下文聚合为少量锚点向量;没有可读文本摘要
-
优点:理论低损,不占用 Prompt 文本 Token
-
缺点:依赖模型底层改造,通用 API 调用模式下无法使用
快速归类
-
🟢 基于时序淘汰:朴素滑动窗口
-
🟡 基于摘要压缩:滚动摘要、分块区块摘要
-
🟠 基于价值筛选:优先级窗口、重要性采样
-
🔵 外部检索联动:稀疏上下文 + 按需检索(Reflex 路线)
-
🟣 结构化替代:状态投影
-
⚫ 底层 KV 原生压缩:锚点 KV 聚合(学术界方案)
沉淀层:三种主流存储形态
分层记忆模式
分层记忆模式将虚拟内存(Virtual Memory)机制引入了Agent 设计:
-
工作记忆(对应技术实现如Context Window)≈RAM:它是Agent的"意识流",用来处理当前任务,容量有限、处理速度快,但信息是易失的。
-
长期存储(对应技术实现如Vector DB/Graph)≈磁盘:它是Agent的知识库与经验库,存储海量的经验和知识,信息是持久的(非易失),但是访问速度相对较慢。
-
Agent≈操作系统内核:Agent并不是被动接收上下文,而是主动的调度者,负责决定何时将关键记忆加载到工作记忆,以及何时将冗余信息从工作记忆中移出。
分层记忆模式的核心意图是,突破LLM上下文窗口的物理限制,通过分层存储和动态换页,实现理论上无限的记忆容量。
分层摘要记忆:懒加载思路
以 CoMeT 为代表的方案把记忆组织成树状结构:
-
第一层:简短摘要 + 触发标签,token 开销极小;
-
第二层:按需生成的详细摘要;
-
第三层:完整原文。
Agent 先读第一层,判断相关后再决定是否下钻。这是一种典型的"懒加载"思路------只在必要时付出完整 token 成本。

图 3:分层摘要通过"先读索引、再按需下钻"控制 token 成本。
2. GraphRAG 知识图谱
用图结构存记忆:节点是实体,边是关系。相比扁平向量库,图更适合回答"张三和项目 A 是什么关系""这个模块依赖哪些下游服务"这类需要沿关系链推导的问题。
Neo4j 的 Agent 记忆集成可以自动从对话中抽取实体和关系,构建图谱。代价是构建和维护成本更高:实体抽取有噪声、关系对齐不完美、图 Schema 需要设计。
3. 向量数据库:最通用的底座
简单、便宜、生态成熟。mem0 这类用户级记忆中间件通常以向量库打底。短板是"语义相似"不等于"逻辑相关",复杂关系推理需要上层补足。
调度层:规则、向量检索与小模型调度
| 调度方式 | 特点 | 风险 |
|---|---|---|
| 硬编码规则 | 稳定、可解释 | 僵硬,覆盖不了复杂场景 |
| 向量检索 top-K | 通用、实现快 | 召回质量依赖 embedding,容易注入噪声 |
| rerank + 阈值 | 提升精度 | 增加延迟和成本 |
| 小模型调度 | 更灵活,可按状态决策 | 需要训练/评估,可能不稳定 |
Reflex 小模型的价值在于:它把"什么时候该召回什么"变成一个可学习策略。生产中更稳妥的做法是"规则兜底 + 检索 + rerank + 小模型决策"的组合,而不是完全依赖模型调度。

图 4:调度层不是"每次 top-K",而是召回、过滤、决策、写回的闭环。
固化层:Skill 作为程序性记忆载体
陈述性记忆负责记录事实、偏好、约束与知识,回答「是什么」;程序性记忆沉淀可复用的操作流程,回答「怎么做」。固化层的核心载体是 Skill:将经过多次验证、能够稳定达成目标的操作序列封装为独立单元,配套成功率、效用值、最后使用时间、前置匹配条件、遗忘衰减系数等运行元数据。
单纯回放历史对话,Agent 每遇到同类任务都需要从零推理、重复试错;而 Skill 让 Agent 可以沉淀可复用经验,匹配场景后直接执行成熟流程。该路线代表性开源实现是 harness-agent(openharness),它原生将 Skill 作为一等公民,支持以文件形式声明流程,配套会话持久化与运行统计体系,把流程记忆和普通文本记忆做隔离管理。
Skill 有三类来源:人工预置用于冷启动、离线梦境复盘从历史成功轨迹自动提炼、调度执行过程中基于反馈动态迭代。自动生成的 Skill 默认进入待验证状态,需要多次复现成功后才提升调度优先级,避免把偶然正确的路径固化为错误范式。
Skill 不是简单的 Tool:Tool 是不可编排的原子动作;Skill 是带有分支判断、异常重试、上下文传递的复合工作流。调度层会并行检索陈述性记忆库与 Skill 注册表,优先匹配适用 Skill;执行结束后自动更新统计指标。
Skill 同样存在遗忘机制:长期不调用效用逐步衰减、匹配权重降低;连续执行失败会触发复审;在离线的梦境整理阶段,系统会批量合并重复 Skill、归档淘汰失效技能,维持固化库的质量。
五、不同类别的主流记忆中间件速览
| 定位 | 项目 | 核心侧重点 | 记忆范式 | 适合场景 |
|---|---|---|---|---|
| 终端用户画像记忆 | Mem0 | 用户偏好、个人事实、跨会话用户记忆 | 陈述性记忆,向量库为主 | C 端助手、用户偏好长期记忆 |
| 时序会话追踪记忆 | Zep | 会话时序、摘要、消息重要性打分、会话回溯 | L1/L2 分层摘要 + 向量检索 | 长会话聊天、客服类 Agent |
| 知识图谱理解记忆 | Cognee | 实体抽取、关系构建、GraphRAG 结构化记忆 | 陈述性图记忆 | 文档理解、领域知识推理、实体关联查询 |
| 代码 Agent 程序性记忆 | openharness | Skill 流程管理、工具编排、会话落盘 | 程序性记忆(Skill)+ Session 原始日志 | Coding Agent、自动化工作流 Agent |
| 代码场景工作记忆 | AgentMemory | 上下文管理、窗口策略、代码片段召回 | L1 上下文控制、向量片段检索 | 代码类 Agent,控制 prompt 上下文 |
| 本地轻量化会话底座 | QMDOpenclaw | Markdown 本地持久化、会话可阅读、人工可编辑 | Session 原始记录 + 简易摘要缓存 | 本地私有部署、需要人工介入翻看记忆的 OpenClaw 生态 |
选型建议:
-
如果只需要"记住用户偏好",mem0 这类方案通常够了,不必上来就上图谱。
-
如果业务领域实体关系复杂,比如保险理赔、医疗问诊,Cognee / GraphRAG 的价值才会显现。
-
如果需要审计和可追溯,Session 日志 + Markdown 这类人类可读格式更靠谱。
-
如果 Agent 需要积累操作经验,应优先设计 Skill/SOP 层,而不是只堆对话历史。
六、实践中的几个坑
-
不要迷信上下文窗口变大。窗口变大不等于记忆问题消失。长上下文仍可能带来注意力稀释、成本和延迟问题,分层检索依然有必要。
-
摘要压缩是有损且不可逆的。一旦把十轮对话压成摘要,被判定为"不重要"的细节就可能丢失。重要原始对话要留一份在 L3。
-
召回质量决定 Agent 上限。存了一堆但召不回来,等于没存。top-K 的 K 值、embedding 模型、分块策略、是否 rerank,都要调。
-
程序性记忆往往比陈述性记忆更值钱。事实会过期,但"排查问题的套路""写代码的规范"这类流程资产复用价值更高。
-
离线整理不是可选项。没有离线整理,记忆库会越存越乱,重复、冲突和低质量条目会持续拉低检索质量。
-
记忆系统要可观测。至少记录:写入了什么、检索了什么、注入了多少 token、最终是否被使用。否则很难定位"记不住"还是"召不回"。
七、总结
Agent 的记忆系统不是一个单一技术,而是一整套从写入、沉淀、调度、固化到整理的流水线。核心设计原则可以浓缩成三句话:
-
热的东西放近,冷的东西放远:L1/L2/L3 分层,按访问频率和温度摆放。
-
只在必要时付出 token 成本:分层摘要、按需检索、小模型调度,都是为减少不必要的上下文注入。
-
事实要存,流程更要固化:陈述性记忆让 Agent 不健忘,程序性记忆让 Agent 越用越聪明。
上下文窗口还会继续变大,但记忆系统的设计问题不会消失------因为 Agent 要面对的不是"这一轮对话",而是"一个持续运行、不断积累经验的长期角色"。这个问题,值得持续打磨。
