资讯动态

AI Agent记忆系统:分层架构、存储召回与个性化落地

发布时间:2026/9/10 8:48:27 来源:尧图企业网站定制
很多人聊AI Agent第一反应都是“它能干什么”能规划、能搜索、能调工具。但真正把Agent用起来以后你会发现决定它好用不好用的往往不是能力上限而是它“记不记得住你”。你有没有过这种经历明明昨天刚告诉Agent你负责哪个项目、偏好哪种汇报风格今天再开一个对话它又像个陌生人一样问你“您所在的部门是”那一刻你会有种深深的无力感——这不是智能这是失忆。所以系列第三篇我打算把记忆这件事掰开揉碎讲清楚。前两篇拆过Agent的规划链路和工具调用机制今天聊的是让Agent真正“属于你”的关键记忆。这篇文章会覆盖记忆的分层架构、短期与长期记忆各自怎么实现、记忆的写入与遗忘策略以及我实际动手搭建时踩过的坑。无论你是用LangChain、自研编排层还是已经上手了带记忆能力的商业平台这套思路都能直接照着落地。1. 拆开“记忆”这个黑盒Agent的三层存储模型记忆这个词在Agent圈子里被用得有点烂了有人把记忆等同于多轮对话记录有人觉得把东西塞进向量数据库就算记住了。但实际上工程上可落地的Agent记忆至少分三层交互缓冲、工作记忆、长期记忆。三层各司其职混在一起设计后面必定出问题。交互缓冲就是当前这轮对话的原始消息队列。它保证Agent知道你现在这句话是在回答上一句的问题这段信息是临时的任务结束就可以丢。工作记忆当前任务运行过程中需要随时调用的信息集合。比如你要Agent帮你写一份行业分析那“目标行业是什么”“读者是谁”“资料从哪来”这些就是工作记忆。它介于会话和永久存储之间通常在单次任务完成后就清理。长期记忆跨会话、跨任务沉淀下来的用户画像和事实性信息。“用户偏好思维导图而非PPT”“用户上周提过公司在做出海业务”——这些需要持久化下次对话还能召回。分层有什么实际意义举个例子如果把所有对话历史都塞进长期记忆你检索的时候会捞上来大量垃圾信息比如昨天聊天气的那句“今天好热啊”检索质量和成本都会崩掉。分层的目的就是让信息以不同的生命周期、不同的检索频率去管理——这跟人的记忆系统是类似的我们也不会把早餐吃了什么记十年但我们会长期记得家人忌口什么。这三层落到工程实现上交互缓冲基本就是消息列表list of messages工作记忆通常用全局字典或者状态存储来维护长期记忆则需要数据库配合向量索引。后面我会逐个展开细说重点讲长期记忆因为它才是“记住你”的核心。2. 短期记忆没你想的那么简单上下文窗口的管理艺术短期记忆最直观的载体就是大模型的上下文窗口context window。很多初学者觉得上下文窗口越大越好——不用管全塞进去模型自己会看。这种思路在小规模demo里确实能跑通但到了真实场景上下文管理一定不能偷懒。2.1 窗口不是越大越好塞满反而会“稀释注意力”上下文窗口越大能塞的内容越多但模型对所有位置信息的注意力是不均匀的。我实测过在上下文接近饱满时做多步工具调用模型在最后几步的决策质量会出现肉眼可见的下降——它“迷路”了忘了最初的任务目标是什么。原因不复杂在几千上万token里找出真正关键的那几条信息还要同时保持推理连贯性模型的任务难度随上下文长度增长不是线性的。所以短期记忆管理的第一个原则是只放当前任务必要的信息能不放就不放。比如Step1的工具返回结果已经处理完了就没必要全程挂在上下文里。把中间产物从窗口里摘出去给核心推理留足空间。2.2 三种上下文瘦身策略的取舍我自己在项目里用过三种策略按推荐程度排个序滑动窗口rolling window只保留最近N轮对话。实现最简单但缺点也很明显——早期提到的关键信息会被直接丢掉Agent会有“短期失忆”。摘要压缩summarization定期把过期的对话浓缩成一段摘要替换原始对话塞回上下文。效果比滑动窗口好但摘要本身会丢失细节而且每次调用摘要模型都有额外延迟和成本。关键信息提取key-value extraction从对话里实时抽取结构化的关键实体和偏好存入长期记忆。上下文里只保留当轮对话和从长期记忆召回的内容。这个策略最接近理想状态但对抽取模型的能力和记忆系统的设计都有更高要求。实际操作中我常用的是“滑动窗口摘要”的组合窗口内的原始消息全部保留窗口外的消息压缩成摘要放在最前面摘要里只提取和任务目标相关的内容。这套方案能在成本可控的前提下把对话早期的关键约束保住。你如果自己搭Agent第一版建议就跑这个组合方案等稳定了再加长期记忆的召回层。2.3 短期记忆的三个工程细节Token预算要提前划分别把整个上下文窗口全留给对话要在系统提示词、工具描述、当前任务数据、历史摘要之间提前分好预算。我习惯留15%~20%的buffer给模型输出和临时工具结果腾空间。注意系统提示词也是短期记忆的一部分很多人更新系统提示词是全局替换但有些用户偏好实际只对当前会话有效那就要把“会话级提示词”和“全局级提示词”区分开各占一个槽位。工具的中间结果要设过期时间比如一次检索可能返回5条候选网页但模型只引用了其中2条剩下的3条就该从上下文里移除了否则它们会持续占用token还可能产生干扰。短期记忆的本质是资源调度不是信息存储。3. 长期记忆的基座向量化存储与可靠召回短期记忆决定了Agent“当下聪不聪明”长期记忆决定了Agent“跟你合不合拍”。这一节是整个记忆系统的核心也是工程上最容易做糙的地方。3.1 为什么用向量化存储让Agent“想起来”而非“查出来”传统的关系型数据库做精确匹配很在行比如“查用户ID123的邮箱”。但它们没法回答“查一条跟用户上次提到旅行偏好类似的记忆”。长期记忆要解决的是语义召回——用户今天说的是“我最近对露营有点兴趣”这句话和昨天存下的“用户说到周末喜欢去爬山”语义相近但关键词没有一个相同。这事只有向量化存储能干。具体做法不复杂把每条记忆文本喂给embedding模型得到一串几百维的浮点向量存进向量数据库。召回的时候把当前对话的文本也转成向量然后在库里做相似度检索取出最相近的几条。这套链路就是现在常说的RAGRetrieval-Augmented Generation记忆本质上就是一种轻量级的RAG应用。强调一下向量化召回只是长期记忆检索的第一步多数场景下光有向量不够精准我一般在召回的候选集上再做一层简单的重排把向量相似度分数和记忆的时间衰减因子、权威度权重做一个加权求和最终才决定把哪几条塞进上下文。这样能避免“语义像但实际不相关”的记忆被误召回。3.2 记忆写入不是每条对话都值得记住长期记忆最大的坑不是存不下而是乱存。如果把每轮对话都向量化存进去检索时召回的全是“今天午饭吃什么”这种语义相似度很高的噪音。所以记忆系统必须有个“写入筛选器”——在信息进入长期记忆之前先问三个问题这条信息是否包含可泛化的事实或偏好“我周三下午要开会”是临时事实不一定值得存“我更喜欢下午开会”是偏好值得存它是否具有跨会话的复用价值“我家猫叫豆豆”你未来对话大概率还会用到值得存它与已有记忆是否冲突冲突的不能直接写要走后面的整合逻辑实操中我倾向于用一个便宜的模型做信息抽取把对话中的“用户陈述”“用户偏好”“用户行动计划”三类信息分别抽取出来。抽取出来的结构化结果再判断是否入库不要把原始对话直接存进去。“存结构化记忆而非原始聊天记录”——这是长期记忆系统设计里优先级最高的一条原则。3.3 记忆召回上下文里的“适可而止”原则召回环节容易犯的毛病是多多益善一次捞回20条记忆塞进上下文让模型自己挑。但实际效果很差召回的相关性参差不齐而且大量不相关信息会挤占推理资源干扰模型判断。我的经验是召回的条数控制在3~7条宁缺毋滥。设定相似度阈值低于阈值宁可不召回也别硬塞。召回结果要做去重和聚类——如果5条记忆其实都在描述同一件事那就合并成一条更完整的常识而不是把5条碎片都放进去。这里有个细节长期记忆里存的不只是用户偏好还应该包括“对话中提到的关键事实链”。比如用户在第三步告诉你“我们公司的技术栈是Java”第四步说“后端团队八人”这两条事实独立存没问题但如果后续要召回“这个公司的技术团队背景”系统能把两条事实拼起来才是真正的理解。所以我会在存储层额外维护一个“实体-关系-属性”的简单图谱帮助做关联召回。这个图不用很复杂有实体表和关系表就够了和向量检索互补使用。4. Agent不能只记不忘更新、冲突与遗忘机制对话过了一段时间后用户说“我现在改用LangGraph了不再用LangChain”。而你记忆库里还存着“用户使用LangChain”这条旧信息。如果不处理冲突Agent下一次大概率会给出一个过时的建议。长期记忆系统里更新的优先级不比写入低但许多人恰恰忽略了这一点。4.1 冲突检测新信息的“准入关卡”每次准备写入一条新记忆前先用同一条实体或者相近语义在库里检索一下已有记忆。如果发现已有记忆与新记忆矛盾就要进入冲突处理流程。处理方式按可信度优先级排列新近的信息通常比旧信息更可信用户明确改变偏好直接陈述的事实优于间接推测用户主动表达的内容优于Agent推断出的内容如果新信息胜出旧记忆不能被直接物理删除——因为有可能用户只是一时情绪明天又改回去了。更好的做法是给旧记忆打上superseded_by标记逻辑隔离但物理保留。这样万一后面需要回溯历史数据还在。4.2 遗忘曲线不是所有记忆都值得永远存在“记住你”和“记得太死”之间有一条平衡线。有些临时性记忆比如这周用户在准备一个招聘面试下周可能就完全没价值了。如果这些对象始终以同样的权重参与召回长期下来会持续干扰新信息的检索。我参照艾宾浩斯遗忘曲线设计了一套简化版的时间衰减机制每条记忆有三个属性——last_accessed最近访问时间、access_count被召回次数、importance人工或模型判定的重要度。当系统做检索时相关性打分里会乘一个衰减系数越久没被调用的记忆权重越低。当某条记忆长时间低权重且与当前任务无关时就进入归档或清理流程。手动设置这项机制时有个小技巧可以给记忆的importance设几个粗略档位高/中/低高重要记忆的衰减系数非常小基本永不淡忘低重要记忆的衰减系数大几周不访问就自动降权。不建议做太精细的连续值维护成本高且实际收益有限。4.3 定期记忆整理Agent的“睡前回顾”除了按需遗忘还可以设计一个定期整理任务——比如每天凌晨跑一次离线脚本对当天新增的记忆做去重合并、补全实体链接、清理低质量记录。这个东西很不起眼但对长期体验的提升极大。它相当于一个“记忆养护工”保证你存进去的长期记忆库越来越干净而不是越来越混乱。整理任务能顺便生成一份当日“用户兴趣变化摘要”写入一个总览记忆让Agent在第二天第一天对话时快速感知用户最新状态。5. 让记忆真正“属于你”身份识别与个性化输出前面聊的都是记忆系统的“存储与检索”本质上还是基础设施。但对普通用户来说真正感知到“Agent记住了我”的瞬间是它说出那种“只有跟你足够熟的人才会知道的话”——这才是记忆存在的意义。5.1 先解决“你是谁”身份识别是记忆的前提一个冷知识Agent先要能识别“你是谁”才知道该调取哪一套长期记忆。同一个Agent后台如果服务多个用户记忆表必须带上用户ID字段这是脑子正常的人都会做的设计。但容易被忽略的是模糊身份场景比如用户在手机端和网页端分别登录生成两个用户ID记忆就变成孤岛了。这块要在产品层做打通或者用用户唯一标识把多个会话聚合成一个profile_id。另一个被忽视的点是在单次会话里Agent也要能感知“当前是以什么身份和用户在聊”。如果是个人助理那记忆应该紧紧围绕用户个人事务如果是企业客服Agent那记忆主体是“客户企业”而非个人。身份识别决定了记忆的归属粒度这个搞错后面所有设计都白搭。5.2 从“被动回答”到“主动想起”个性化的三层境界我把Agent的个性化程度分了三层你可以拿自己的Agent对比一下第一层记住名字和称呼。最低成本的个性化。就是对话开头能叫出用户的名字结尾能顺带提一句用户上次聊过的事。很多商业平台已经做到了。第二层记住偏好并执行。用户说过“报告里少放文字多用图表”下一次生成报告时Agent在规划阶段就主动检索到这条偏好然后调整输出结构。这一层需要长期记忆和工作记忆打通是当前多数Agent项目的重点突破方向。第三层预判需求并提供价值。用户没开口Agent根据记忆预测出用户接下来可能要做的事。比如用户连续三周都在周五上午让Agent整理项目周报到了第四周周五Agent主动问一句“今天的周报我已经准备好了初稿要看一下吗”——能做到这一层就是你自己的Agent和别人的Agent之间的分水岭了。第三层听起来很酷但工程上不建议一上来就做。先把前两层打磨稳定在规划链路里真正把“记忆”当做一个独立信息来源去调用再一步步尝试主动预判成功率会高得多。5.3 个性化不是“有记忆就够了”会有读者问我存储和召回都做了为什么个性化效果还是不够明显我排查过很多次类似问题最终根因十有八九是记忆召回了但模型没按照召回的偏好去执行。原因在于召回出来的信息只是混在一堆上下文里和用户当前指令的重要性没有做显式区分。解法很简单——在给模型的提示词里明确要求“以下是从用户长期记忆中检索到的偏好信息它们是用户的既定要求请在新任务中优先遵守。如果与本次指令冲突以本次指令为准并说明原因。”给偏好信息配上显式的“指令级别”语义比指望模型自己从上下文里悟出“这是要遵守的”可靠得多。这个细节很小但价值很大你们搭的时候别漏了。6. 工程落地避坑实录存储选型、成本控制与隐私边界最后聊一批我在实际搭建Agent记忆系统时遇到的比较典型的坑很多是靠调bug调到头秃才总结出来的。6.1 向量数据库选型别迷信热门先看场景再定市面上的向量数据库五花八门有专门的向量库也有在传统数据库上加了向量索引的。选型前先问自己三个问题你的数据量级是多少你的检索QPS是多少你的运维能力够不够数据量十万级以内直接用一个带pgvector的PostgreSQL就行了别多搞一套基础设施。数据量百万级以上、且对毫秒级响应有要求再考虑上专门的向量搜索引擎。如果是个人项目或者小团队一切以运维简单为主别给Agent记忆单独搞一套高可用集群没必要。我自己现在的习惯是记忆量小、检索简单用SQLite手工循环比对都行等到了数据量撑不住的那一天再换。为了所谓“未来的扩展性”在第一天引入重基础设施大概率会在后面拖慢你的迭代速度。6.2 注意成本向量化调用费和存储膨胀是隐形杀手长期记忆的增量写没那么贵但有两个成本容易被忽略一是写入时的embedding调用费。如果对话高频、信息抽取粒度很细embedding调用量会非常可观。建议信息进写入筛选器之前先做一个去重判断如果和已有记忆相似度极高就不重复调用embedding存储了。二是记忆库的无限膨胀。时间一久什么陈年旧事都躺在库里检索耗时和费用都会涨。我用过一套“月度归档策略”超过90天没被访问过且重要度不高就转移到冷存储不再参与在线检索只保留离线可查。实测下来库的体积能保持在稳定水平还能兼顾历史数据留存。还有一个隐藏坑如果你频繁把大段记忆拼进上下文context变大导致的推理token费用会直接让项目预算失控。所以“记忆召回条数设上限”这个原则不只是为了效果更是为了钱包。6.3 隐私边界该记住的记住不该记住的坚决不碰做记忆系统的人必须想清楚一件事有能力记住不等于可以记住一切。用户聊天记录、工作文档、个人隐私全往长期记忆里塞一旦数据库泄露那不只是产品事故可能直接变成法律事故。我给自己定的几条硬规矩供你参考记忆最小化只存让任务协作更顺畅的必要信息比如偏好和关键事实。用户银行卡号、密码这类信息不管是什么对话里提到的一律不落库。记忆可见化给用户提供“查看Agent记住了我什么”的界面。这一点特别重要透明是信任的前提。用户看到你能记住也看到你具体记住了哪些才有安全感。一键删除任何记忆都要支持即时删除而且删除必须级联——向量库里的、图谱里的、历史快照里的一起清理不能留备份。敏感信息逃逸检测在写入筛选器里加一道敏感信息识别碰到身份证号、手机号等模式就拦截不进入记忆库。记忆是Agent从“通用变为专属”的灵魂但记忆的边界感决定了这个产品能不能走得长远。技术上不是“存在哪”的问题而是“不该存哪”的自觉。最后再说点心里话。做Agent记忆这大半年我最大的体会是记忆系统的技术栈并不复杂难的是对“什么值得记”的判断力。同样的对话数据有的人存出了能主动关怀你的助理有的人存出了一堆检索不到重点的死数据。建议你动手搭建之前先花两周时间把自己和Agent的对话记录下来手动标一标你希望它记住什么、忘掉什么再拿着这批黄金样本来设计你的筛选规则。规则和数据是记忆系统的两条腿缺一条都走不远。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价