Agent 架构的记忆系统:从滑动窗口到离线整合,一套分层记忆设计

前言

当大模型的上下文窗口从 8K 涨到 128K,甚至更长,"记忆"问题并没有自动消失。窗口再大,也装不下一个 Agent 连续运行数周甚至数月的全部对话;而如果只靠滑动窗口把旧消息一刀切掉,Agent 就会像只有很短记忆的鱼------每次见面都像第一次。

这篇文章从工程视角梳理 Agent 记忆系统的常见方案:从最朴素的滑动窗口,到分层摘要、GraphRAG、Reflex 调度,再到仿生的离线"梦境"整合。重点不是罗列名词,而是讲清楚每个方案解决什么问题、代价是什么,以及它们如何组合成一套可落地的分层记忆架构。


一、Agent 的记忆到底要解决什么问题

很多人第一反应是:"把历史对话都塞进上下文不就行了?"

真做起来会撞上三面墙:

  1. 容量墙:上下文窗口是硬上限。哪怕有 128K token,扣掉 system prompt、工具定义、当前任务和输出预留,真正能放历史的空间并没有想象中多。

  2. 成本墙:注入更多历史会增加 prefill 计算量、token 费用和首 token 延迟。KV Cache 可以缓解重复前缀的计算,但跨轮、跨任务、跨会话并不能完全依赖它。

  3. 信噪比墙:十轮前的闲聊和关键决策一起塞进去,模型的注意力会被稀释。尤其当关键约束夹在长上下文中部时,被忽略的风险更高。

所以,记忆系统的本质不是"存得多",而是:

在正确的时机,把正确粒度的信息,以尽可能低的 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。

四、各层的关键技术方案对比

写入层:(工作记忆 / 当前上下文窗口)策略补充总结

  1. 朴素滑动窗口(Fixed Turn Window)

规则:只保留最近 N 轮对话,更早内容直接移出 L1

  • 优点:最简单、无额外开销、行为稳定

  • 缺点:早期关键约束容易丢失

  1. 滚动摘要压缩 (Recursive Rolling Summary)

规则:溢出后把旧对话合并成一段摘要,替换原文留在上下文

  • 优点:保留会话主线,比纯滑动窗口记忆更长

  • 缺点:摘要漂移、细节不可逆丢失、摘要本身持续膨胀

  1. 分块窗口 + 区块摘要 (Chunked Window + Block Summary)

规则:对话分块;最新块放原文,更早块压缩成块摘要

  • 优点:粒度可控,兼顾新鲜细节 + 历史脉络

  • 缺点:多段摘要叠加后依然会失真

  1. 优先级滑动窗口 (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 层,而不是只堆对话历史。


六、实践中的几个坑

  1. 不要迷信上下文窗口变大。窗口变大不等于记忆问题消失。长上下文仍可能带来注意力稀释、成本和延迟问题,分层检索依然有必要。

  2. 摘要压缩是有损且不可逆的。一旦把十轮对话压成摘要,被判定为"不重要"的细节就可能丢失。重要原始对话要留一份在 L3。

  3. 召回质量决定 Agent 上限。存了一堆但召不回来,等于没存。top-K 的 K 值、embedding 模型、分块策略、是否 rerank,都要调。

  4. 程序性记忆往往比陈述性记忆更值钱。事实会过期,但"排查问题的套路""写代码的规范"这类流程资产复用价值更高。

  5. 离线整理不是可选项。没有离线整理,记忆库会越存越乱,重复、冲突和低质量条目会持续拉低检索质量。

  6. 记忆系统要可观测。至少记录:写入了什么、检索了什么、注入了多少 token、最终是否被使用。否则很难定位"记不住"还是"召不回"。


七、总结

Agent 的记忆系统不是一个单一技术,而是一整套从写入、沉淀、调度、固化到整理的流水线。核心设计原则可以浓缩成三句话:

  1. 热的东西放近,冷的东西放远:L1/L2/L3 分层,按访问频率和温度摆放。

  2. 只在必要时付出 token 成本:分层摘要、按需检索、小模型调度,都是为减少不必要的上下文注入。

  3. 事实要存,流程更要固化:陈述性记忆让 Agent 不健忘,程序性记忆让 Agent 越用越聪明。

上下文窗口还会继续变大,但记忆系统的设计问题不会消失------因为 Agent 要面对的不是"这一轮对话",而是"一个持续运行、不断积累经验的长期角色"。这个问题,值得持续打磨。

相关推荐
StarRocks_labs1 小时前
StarRocks + Paimon 多模态数据湖检索
starrocks·agent·数据湖·数据·paimon·mip
栈知见2 小时前
14-Context 上下文管理:支撑长期任务的机制
agent
Topskys2 小时前
DeepSeek 稀疏注意力
agent
小七-七牛开发者2 小时前
多 Agent 架构中的 Subagent 拆分与合并策略
agent·multiagent·subagent·agent架构·harness #工程实践
努力变大白2 小时前
ReAct Agent 创建:tools 协议与文本 ReAct 双路线实践
python·agent·react框架
jerrywus2 小时前
DeepSeek Harness 和 Pi Agent 怎么选?先想想你愿意折腾什么
前端·agent·deepseek
武子康2 小时前
HunyuanVideo-1.5 跑得更快,先减步数还是开缓存?
人工智能·后端·agent
货拉拉技术2 小时前
一句话叫车:货拉拉小程序 AI 叫车实战
前端·agent·ai编程
thusloop2 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex