Skip to content

Agent记忆系统设计综述

https://github.com/LinJinl/CodeLife

这几天在把器灵这个AI Agent的设计重新理一遍,打算针对记忆系统做大更新,因此需要整体梳理一下当前的一些想法,主要探讨 Memory分层/写入策略/检索融合 这条线

对于长期陪伴式的agent,最稳的不是单层记忆,而是五层记忆模型

  • 即时上下文
    • 包括本轮和最近几次对话,当前任务目标、当前页面、系统规则,它的作用是保证这次回答接的上话
  • 工作记忆
    • 工作记忆是为了完成正在进行中的中短期任务,比如今天正在排查某个审批链bug,这周在读哪篇论文,当前一轮工具调用拿到了什么中间结果,它的特点是高相关,短寿命,任务结束就该清理或者降级
  • 长期偏好
    • 存的是用户稳定风格,比如“少分段、高密度、技术内容附带上参考”等信息,会持续影响输出风格
  • 技能、洞察记忆
    • 复用价值高的技术结论,比如“写操作审批必须tool + payload hash绑定token”,或者“深度文档生成要先结构后展开并覆盖边界、权衡”,它是未来可复用的方法
  • 事件、轨迹记忆
    • 存的是时间性事实,比如哪天收藏了什么文案的那个,哪天排查了什么bug,哪天形成了什么决策

当前的系统中已经设计了一些雏形,比如 : 对话、偏好、誓约、技能卡、日志、藏经阁等,但是还需要把它们从功能模块升级到记忆层模型

长期记忆设计

这五层里,最容易出问题的是把“什么都存进一个向量库”误当成长期记忆。这么做短期省事,长期必炸。原因很直接:向量检索擅长召回语义相近的信息,但不擅长天然区分“这是稳定偏好”“这是过时事件”“这是高价值技能”“这是临时情绪化表达”。如果把用户一次随口抱怨、一个旧项目上下文、一个过期决定、一个高价值技术原则都混在一起,模型下一次检索到什么就看 embedding 运气,最后器灵会出现两种坏症状:第一,人格和判断不稳定,一会儿像记得你,一会儿又被旧垃圾召回带偏;第二,当前任务被历史噪声污染,本该专注当前问题,却被相似但无关的旧对话强行拉走。所以你后面改器灵,第一条铁律是:长期状态不要只靠语义检索组织,必须有显式结构化记忆。 至少稳定偏好、技术洞察、誓约、日志这几类,都应该有各自独立的数据结构和调用策略,向量检索只作为补充,而不是唯一记忆机制

写入策略

接下来讨论写入策略,真正好的agent不是随时能存,而是要明白什么时候不能存,我们可以给器灵设计四种写入触发

  • 显式授权写入
    • 最简单,用户说“记一下”、“记住这个偏好”等,那就直接写,写到对应层
  • 规则触发写入
    • 适合高确定性的场景,比如用户明确表达稳定偏好、誓约变更、收藏文档、完成某个长期目标,这类可以即时入库
  • 观察延迟写入
    • 比如我说“后续回答不要分太多段”,这是明确偏好,可以立刻存,但是如果只是某一次嫌解释太长,不能立刻稳定偏好,应该先作为observation积累,重复出现后再升级成偏好
  • 总结型写入
    • 总结写入适合对话结束或者任务完成后,把高价值的内容提炼成短而稳的结构化记录,而不是把整段原文塞进去,现在系统里已经有 save_preference、save_skill_card、write_note 这些工具,下一步最值得优化的不是“再加一个记忆工具”,而是把何时调用哪个写入工具的规则做成可解释的 policy。这会让器灵从“会记”变成“记得有节制”。

检索策略

器灵什么适合该检索,不该靠每次都搜一遍,也不该靠大模型自己想不想搜,应该要有对应的机制和分类,可以分为三类

  • 强触发
    • 该场景是必须查的场景,比如用户问“最近状态”,“上次我们聊到哪里”,“我有哪些誓约”,“我之前总结过这个问题吗“,”我写过相关博客吗“,这些都有明确数据源,应该优先走结构化查询或者定向检索,而不是让模型凭借印象答
  • 弱触发
    • 弱触发时可能需要补充历史背景的场景,比如用户说继续上次那个设计思路,或者说按我之前的偏好来,这种情况下可以先看最近上下文和显式偏好,不够再搜历史对话
  • 禁止触发
    • 比如用户问一个纯技术问题,当前任务不依赖于用户历史,此时不应该为了显得有记忆强行召回一堆无关记录,检索不是越多越好,而是只有在历史信息能提高当前决策质量时才触发。这点和 RAG 系统一样,真正难的不是检索能力,而是检索克制

此外检索回来之后,很多系统的第二个大坑是不会融合。召回信息不是越全越好,而是要做 context packing。器灵的融合顺序可以参考固定成:系统规则 > 当前用户问题 > 当前任务状态 > 稳定偏好 > 与当前问题直接相关的结构化记忆 > 必要的历史对话片段 > 外部资料。 这个顺序的意义在于,优先保证系统行为和当前任务不被历史噪声压垮。比如用户现在问一个 Anthropic 文档总结问题,这时“你偏好少分段高密度”是相关的,“2026/04/10 你聊过项目结构”就不一定该进上下文。又比如用户问“晨省”,那最近日志和誓约就是高优先级,外部资料反而不重要。后面改器灵时,最好不要把所有召回结果原样堆给模型,而是先做一层memory summarization / packing:每类最多给几条,每条压成结构化摘要,明确来源和时间。这样既节省 token,也降低模型被旧细节带偏的概率。

记忆更新、冲突、衰减机制

没有更新策略,所有的长期记忆系统都会慢慢腐烂,至少需要三种应对机制

  • 覆盖
    • 覆盖适合偏好类,比如今天明确说”后续回答不要分太多段,每段要更丰富一点“,他就应该覆盖同类旧偏好,而不是并列堆积
  • 合并
    • 合并适合技能类和项目经验类信息,比如同一个审批链token设计的主题多次出现,可以积累成一张不断增强的skill card,而不是生成5张重复卡
  • 失效
    • 失效适合事件和临时状态,比如某次”今天在排查bug“任务完成后,就不该高频召回某些只针对特定项目有效的偏好,也应该允许降权

进一步说,我们可以给记忆加两个元属性,confidence可信度和volatility易变性,用户明确授权的写入的偏好,可信度高,通过观察推断的习惯,初期可信度低,临时任务状态易变性高,长期写作风格易变性低

如何做

将上述综述映射到目前项目,可以总结出四个动作

  • 给现有记忆实体重新分层标注
    • 现在的 conversation、daily log、preference、skill card、vow、library item,最好都明确属于哪一层、默认何时检索、有效期多长
  • 补充统一的memory policy文档
    • 里面至少写清:什么情况下写 save_preference,什么情况下只做 observation,什么情况下写 save_skill_card,什么情况下只记入今日 note,什么时候禁止自动写入
  • 做retrieval gating
    • 不是每题都查历史,而是按问题类型映射到记忆源,像你系统提示里那样:问近况先查日志,问誓约先查 vow,问写过什么先查博客/藏经阁,问偏好再查 preference,这个方向已经对了,但可以更系统化
  • 做memory packing
    • 把召回结果统一压成“来源 + 时间 + 一句话摘要 + 可信度”,再交给模型用。这样器灵会明显更稳,不容易被冗长历史淹没

核心结论:好的器灵记忆系统,不是“记得多”,而是“分层清楚、写入克制、检索有门槛、更新有规则”。 后面要改进器灵,优先级不该是“继续堆更多 memory feature”,而是先把这四件事做硬:分层、写入策略、检索触发、更新淘汰。 这四件事一旦理顺,后面的偏好适配、技能积累、长期陪伴感、甚至输出质量,都会一起上一个台阶

最小可行改造路线:先改什么,再改什么

建议分三步。第一步,梳理并标注现有记忆对象的层级、生命周期和检索触发条件,先不改存储,只改认知和调用规则;第二步,补写统一的 memory policy,明确什么场景调用 save_preference、save_skill_card、write_note、update_persona_observation,并补“禁止自动写入”规则;第三步,加入 retrieval gating 和 memory packing,让检索从“想起来就搜”变成“按问题类型查固定记忆源,并先压缩后注入上下文”。这节还应说明为什么不建议先做“大一统向量库重构”:因为在 policy 不清楚前,底层重构只会把混乱写进更复杂的基础设施里

最后更新于: