前言当大模型的上下文窗口从 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 是关键缓冲层。没有 L2L1 溢出的内容要么被摘要一次到位细节丢失要么直接全量进 L3检索压力大。有了 L2近期会话可以以“半压缩”形态多留一阵等真正判定重要后再进 L3。四、各层的关键技术方案对比写入层工作记忆 / 当前上下文窗口策略补充总结1.朴素滑动窗口Fixed Turn Window规则只保留最近 N 轮对话更早内容直接移出 L1优点最简单、无额外开销、行为稳定缺点早期关键约束容易丢失2.滚动摘要压缩 (Recursive Rolling Summary)规则溢出后把旧对话合并成一段摘要替换原文留在上下文优点保留会话主线比纯滑动窗口记忆更长缺点摘要漂移、细节不可逆丢失、摘要本身持续膨胀3.分块窗口 区块摘要 (Chunked Window Block Summary)规则对话分块最新块放原文更早块压缩成块摘要优点粒度可控兼顾新鲜细节 历史脉络缺点多段摘要叠加后依然会失真4.优先级滑动窗口 (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 PoolingSAC 这类规则不在文本层压缩在模型 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-agentopenharness它原生将 Skill 作为一等公民支持以文件形式声明流程配套会话持久化与运行统计体系把流程记忆和普通文本记忆做隔离管理。Skill 有三类来源人工预置用于冷启动、离线梦境复盘从历史成功轨迹自动提炼、调度执行过程中基于反馈动态迭代。自动生成的 Skill 默认进入待验证状态需要多次复现成功后才提升调度优先级避免把偶然正确的路径固化为错误范式。Skill 不是简单的 ToolTool 是不可编排的原子动作Skill 是带有分支判断、异常重试、上下文传递的复合工作流。调度层会并行检索陈述性记忆库与 Skill 注册表优先匹配适用 Skill执行结束后自动更新统计指标。Skill 同样存在遗忘机制长期不调用效用逐步衰减、匹配权重降低连续执行失败会触发复审在离线的梦境整理阶段系统会批量合并重复 Skill、归档淘汰失效技能维持固化库的质量。五、不同类别的主流记忆中间件速览定位项目核心侧重点记忆范式适合场景终端用户画像记忆Mem0用户偏好、个人事实、跨会话用户记忆陈述性记忆向量库为主C 端助手、用户偏好长期记忆时序会话追踪记忆Zep会话时序、摘要、消息重要性打分、会话回溯L1/L2 分层摘要 向量检索长会话聊天、客服类 Agent知识图谱理解记忆Cognee实体抽取、关系构建、GraphRAG 结构化记忆陈述性图记忆文档理解、领域知识推理、实体关联查询代码 Agent 程序性记忆openharnessSkill 流程管理、工具编排、会话落盘程序性记忆Skill Session 原始日志Coding Agent、自动化工作流 Agent代码场景工作记忆AgentMemory上下文管理、窗口策略、代码片段召回L1 上下文控制、向量片段检索代码类 Agent控制 prompt 上下文本地轻量化会话底座QMDOpenclawMarkdown 本地持久化、会话可阅读、人工可编辑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 要面对的不是“这一轮对话”而是“一个持续运行、不断积累经验的长期角色”。这个问题值得持续打磨。