做了很久 AI Agent 开发的人,大概率都碰到过同一个场景:昨天刚让 Agent 记住的任务偏好,今天开一个新会话,它就失忆了。Agent 记忆,是这类系统从“能跑”走向“好用”的核心分水岭。很多时候我们抱怨模型推理能力不够,其实真正拖后腿的,是整个 Agent 根本没有一套完整的记忆系统。这个命题听起来很理论,拆开看却是一套可以一步步落地的工程方法:先记录、再检索、再注入、再更新,最后形成跨会话、跨任务、甚至多 Agent 共享的长期记忆。下面我会从“为什么会失忆”讲起,再给出一条从理论到实战的落地路径,并附上实际踩坑之后的排查思路。
1. 先搞清楚“Agent 失忆”到底是在失忆什么
1.1 模型本身没有“记住”这个能力
大语言模型在推理时,只看得到当前上下文窗口内的内容。窗口内有的,它能用;窗口内没有的,对它来说就是不存在的。这意味着每次新会话开始,Agent 对之前发生过什么是一无所知的。
这不是模型能力不够,而是架构上的无状态设计带来的必然结果。可以把它理解成一个临时项目组:组内信息都写在一块共享白板上,白板有大小限制,换一批人进来,白板就被清掉了。如果不主动把之前结论写成文档保存下来,后面的人不会知道前面讨论过什么。
所以在 Agent 系统里,发现“它忘了上次的偏好”“它不知道昨天已经完成了某件事”时,不要下意识归因于模型太笨。失忆不是模型的问题,而是系统的记忆层没有设计到位。
解决路径也很清楚:不能指望模型天生拥有记忆,必须主动设计一套外部记忆系统,负责信息的保存和取回。这也是 Agent 架构里记忆模块存在的根本原因。
1.2 失忆问题的四层分类:从对话上下文到长期事实
实际开发中,“失忆”这个词是一个笼统的说法。不同场景下的失忆,解决方式差异很大。我把它们拆成四层:
- 会话内短期记忆:当前对话窗口内能记住的多轮信息,主要由上下文窗口承载。
- 会话间长期记忆:跨多个会话保留的事实、偏好、项目背景,需要外部存储。
- 事实性记忆:类似知识库的部分,比如用户资料、业务规则、代码仓库结构。
- 过程性记忆:Agent 在任务中积累的策略和步骤,比如“碰到这个报错时应该走哪条排查路径”。
这四层不能混在一起处理。短期记忆对实时性和连贯性要求高,长期记忆对持久性和检索质量要求高,事实记忆强调结构化程度,过程记忆则需要抽象和沉淀能力。一个完整记忆系统,往往不是某一种方案,而是四层同时存在。
搞清楚这一点,很多设计冲突就自然解开了。比如有人问“为什么我用向量库存了所有聊天记录,还是感觉 Agent 记不住东西”。原因可能是他只是在做会话间长期记忆,却没有处理短期记忆中意图延续的问题;也可能他存的原始聊天记录缺少结构化处理,检索时噪声太多。失忆问题先分类,再对症下药,比一上来堆技术方案重要得多。
2. 记忆系统不是“多存点聊天记录”那么简单
2.1 记忆系统需要具备四个基本功能
很多人第一次设计记忆系统时,第一反应是“把聊天记录存进数据库,下次取出来再塞给模型”。这样做在很小规模下能跑通,但一旦任务复杂起来,问题会立刻出现。
一个真正可用的记忆系统,至少要具备四个能力:
- 写入:把有长期价值的对话内容做摘要、抽取和格式化,而不是原样落库。
- 存储:决定保存形式,是结构化字段、原始文本、向量索引,还是三者组合。
- 检索:按当前任务需要,把最相关的记忆找出来,而不是把所有历史都翻出来。
- 更新:对已有记忆做去重、合并、过期、删除,避免信息越积越乱。
这四个能力缺一个,后面都会出问题。只写不检,记忆库会变成垃圾堆;只检不更新,旧信息会持续污染新任务;不设过期时间,系统越用越笨。
所以记忆系统本质上不是一个存储方案,而是一个数据处理系统。它的输入是不断产生的对话和任务日志,输出是模型真正用到的高质量上下文。
2.2 从“临时聊天”到“长期记忆库”的三种形态
按照使用场景,记忆在工程上通常有三种形态。
第一种是会话日志。它把完整对话原样保存下来,主要目的是审计、回溯和调试。在真实项目里,会话日志非常重要,但它不直接参与模型推理,因为它太原始、太长、噪声太多。把日志直接塞进提示词,是最常见的错误。
第二种是短期记忆缓存。它保存最近几轮对话的摘要和关键状态,让模型在同一个会话里能接着之前的话题往下聊。它通常放在上下文窗口开头,或者以一个专门的系统提示块存在。这种方案适合 demo 和轻量应用,能够解决“当前会话内看起来还记得”的问题。
第三种是长期记忆库。它使用外部存储保存用户偏好、任务状态、领域知识和历史关键事实。当用户发起新请求时,系统先从长期记忆库里检索出相关内容,再作为上下文注入。它解决的是跨会话、跨任务的“真正记住”。
这三者不是替代关系,而是叠加关系。成熟系统里,会话日志会留一份,短期记忆缓存管当前会话,长期记忆库负责跨时间沉淀。很多 Agent 项目在早期只做日志,用户体感上“它完全没有记忆”;如果要做产品化,就至少要有短期记忆缓存和长期记忆库两层。
2.3 为什么“写入之前的过滤”比“读取的时候检索”更关键
一个很反直觉的点是:记忆系统好不好用,关键往往不在检索,而在写入。
你可以把记忆库存成“档案馆”:档案馆每天收到大量材料,如果入库之前不做筛选、索引、归档,之后就很难找到有用信息。检索环节做得再好,也只能在混乱里找东西。
写入阶段的过滤,通常要做三件事:
- 去噪:去掉寒暄、语气词、临时性表述,只保留有长期价值的信息。
- 压缩:把长对话提炼成关键事实,比如“用户项目是电商系统,技术栈是 Java 和 Spring”。
- 结构化:把信息拆成实体、关系、事件,方便后续按字段查询。
举个例子,用户在对话里说:“你按上次那个风格写吧,上次那个比较简洁。”如果不做结构化处理,系统只会存下一句口语。但经过处理后会变成:“用户偏好简洁文风,参考上次定义。来源:2026-03-11 会话。”这样在后续检索时,才能通过“写作风格”“简洁”“用户偏好”这些维度命中。
所以,写记忆不是“复制粘贴”,写记忆本质上是“提炼”。这一步做不好,后面所有环节都会被拖累。
3. 一套从理论到实战的落地路径:先跑通,再优化,最后工程化
3.1 第一层:用 Prompt 模拟短期记忆,适合 Demo
最简单的记忆实现,不需要外部存储。把最近几轮对话压缩成一个“当前状态”,然后在系统提示词里注入。
用伪代码表示大概是这样的:
# 伪代码:短期记忆注入 history_summary = summarize(previous_messages) system_prompt = f""" 当前会话状态:{history_summary} 请基于这个状态继续处理用户请求。 """这个方案的学习价值在于,它把“记忆”从玄学变成了一种可操作的机制:先摘录当前状态,再注入到推理上下文。对演示用途来说,它已经足够。但它的天花板也很明显:换一个新会话,所有状态都会丢失。它没有办法回答“你昨天给我推荐的方案是什么”这类跨会话问题。
如果只是刚接触 Agent 开发,建议先在这一层跑通。不要一上来就搭向量库,那样很容易在基础设施上消耗大量时间,最后却对记忆的机制没有直观理解。
3.2 第二层:用向量检索做事实回忆,进入 RAG 式记忆
当 Agent 需要跨会话回忆时,就要引入外部存储。目前最常见、也最容易理解的一种形态,就是把记忆做成 RAG 式检索。
基本思路是:
- 对话过程中,将用户输入或 Agent 输出做摘要或切片。
- 对摘要做向量化,得到语义向量。
- 把向量和原文一起存进向量数据库。
- 新请求到来时,将当前输入做向量化,检索最相关记忆片段。
- 把命中片段按相关度包装,注入到模型上下文。
这个流程并不复杂,但要落地需要准备几块内容:
- 一个文本向量化模型,负责把文本转换成向量。
- 一个向量存储服务,用来存向量、算相似度、返回 top-k。
- 一个检索配置,通常包括返回条数 top_k 和相似度阈值。
- 一个注入模板,决定记忆片段怎么拼到系统提示词里。
在第一次落地时,不要追求大而全,先固定一个小场景,比如“用户喜欢什么风格的代码注释”“上次项目的技术栈是什么”,跑通整个检索链路。验证不是看技术指标,而是看模型行为:如果模型在第二个会话里能正确引用第一个会话中的用户偏好,这个链路就通了。
3.3 第三层:结构化长期记忆与多 Agent 共享记忆
向量检索适合处理非结构化信息,但它不适合处理精确状态。比如“当前审批流程走到第几步”“用户是否已经付费”“这个项目部署到哪台服务器”,这类信息用向量检索效果并不好。所以,长期记忆库还需要结构化表来支撑。
常见做法是,把记忆拆成几个子库:
- 用户偏好表:维护用户画像、偏好字段。
- 任务状态表:记录每个任务的当前进度、待办项、完成状态。
- 项目知识表:保存项目背景、技术选型、业务规则。
- 向量知识库:保存无法结构化但需要语义检索的文本片段。
多 Agent 共享记忆,并不是把同一个字符串广播给所有 Agent。它真正要做的是,让多个 Agent 访问同一套“状态库”,并规定谁可以读、谁可以写。
一个典型例子:客服 Agent 负责读取用户投诉记录,订单 Agent 负责更新订单状态。如果两者不分领域边界,客服 Agent 写入的中间判断就会污染订单 Agent 的任务状态。实现共享记忆时,不一定要用很重的架构。早期用一个外部数据库,按 Agent 角色分表,再加一层访问控制,就比所有人共用一个大表要靠谱得多。
3.4 第四层:把记忆系统本身当做一个稳定服务来建设
到这里,记忆系统已经从“一段代码”变成了“一个模块”。如果项目要继续往前走,还要把它当成一个稳定服务来建设。
要思考以下几个问题:
- 写入是不是可以异步化。如果每次对话都同步写记忆,主链路延迟会被拖慢,所以通常使用消息队列或异步任务来消化写入。
- 检索需不需要缓存。热门问题或高频用户,可以缓存一部分固定记忆片段,减少外部存储的压力。
- 失败怎么办。记忆服务挂了,主对话还要不要继续。好的做法是记忆系统作为增强项,失败时降级为“无记忆模式”,而不是整个 Agent 直接崩溃。
- 日志和审计。谁在什么时间写了什么记忆,谁在什么时间读到过哪段记忆,都要有记录。尤其是涉及用户数据的场景,审计是底线。
记忆模块应该向上层暴露稳定接口:写、读、更新、删除。接口稳定之后,底层换数据库、换向量引擎、调整检索策略,都不会影响 Agent 主流程。这也是“工程化”这个词落地的真正含义。
4. 落地时最常见的四个坑和排查链路
4.1 坑一:只写不检,上下文被无效记忆撑爆
很多项目在做完记忆功能后,效果反而变差,原因是每次请求都会把检索到的内容一股脑塞进上下文。检索这步确实做了,但返回了几十条片段,把模型可用的上下文空间占掉一大半,反而冲淡了用户当前的真实意图。
解决办法是,在检索之外再做一层“注入裁剪”。给记忆注入设定一个上限,比如最多返回 5 条片段,每条最长 200 字,总长度不超过一定大小。还要按相关度排序,只保留真正和当前任务相关的记忆。
现实里,好的记忆不是“把能拿出来的都拿出来”,而是“只给模型当下最需要的少量上下文”。
4.2 坑二:检索到了,但注入位置不对
另一个常见问题是,记忆虽然没有检索失败,但注入位置不合适。有的场景需要放在系统提示词里,有的场景需要放在用户消息前,还有的场景要拼在历史对话之后。
如果系统提示词非常短,而用户输入很长,把记忆放在系统提示词里,可能被后面的长输入挤压。更好的做法是,把记忆放在一个独立、明确的上下文块里,并在提示词中写明“以下内容是记忆信息,不是当前用户输入”。
比如在构建 prompt 时,可以用类似这样的结构:
[Memory] 相关历史信息: - 用户偏好简洁文风 - 上次讨论了电商系统迁移方案 [Current User Request] 用户当前的请求:...这样的结构能减少模型将记忆误当成用户实时输入的概率。如果模型开始“自己脑补”记忆内容,很可能就是因为记忆和用户指令之间没有明确分隔。
4.3 坑三:多 Agent 共享变成了“复制粘贴”
多 Agent 共享记忆的常见错误,是把“共享”理解成“所有人都能看,所有人都能写”。结果就是 A 任务产生的中间状态被 B 任务捡到,B 任务把 A 的历史当成自己的上下文,整个系统逻辑混乱。
正确的做法是给记忆分领域、分角色。每个 Agent 只读自己的关键字段,只写自己负责的状态。共享记忆的重点,不是共享所有上下文,而是共享一个统一的“真相源”。订单状态是真相,项目进度是真相,用户偏好是真相。不同 Agent 围绕同一套真相源协作,而不是互相复制聊天记录。
4.4 坑四:没有更新和遗忘机制
记忆系统如果只增不改,时间一长就会信息过剩。用户改了偏好,旧偏好没有作废;任务状态变了,旧状态没有结转。检索出的内容可能已经过时,模型却当成最新事实来用。
所以记忆库里每条数据都应该有“更新时间”和“状态”字段。检索时,相似度相差不多时优先取时间更新的一条。对长期不读取、低价值的记忆,可以定期清理或归档。更新机制能做到“纠正”,遗忘机制能保证“不臃肿”。
一个好的记忆系统,不是一个“越存越多”的系统,而是一个“越用越精准”的系统。
4.5 记忆问题的排查顺序
当 Agent 表现明显“失忆”时,按下面的顺序排查会更快:
| 步骤 | 检查内容 | 常见问题 |
|---|---|---|
| 1 | 现象判断 | 是完全不知道,还是知道但答错,还是答得模糊。现象不同,问题层次不同 |
| 2 | 写入检查 | 记忆有没有真的被保存,保存前有没有做摘要和结构化 |
| 3 | 存储检查 | 数据落在哪张表、哪个集合,字段是否齐全,时间戳是否正确 |
| 4 | 检索检查 | top_k 和阈值是否合理,召回结果是不是和当前问题相关 |
| 5 | 注入检查 | 记忆有没有真正进入模型上下文,位置和格式是不是清楚 |
| 6 | 更新检查 | 新信息有没有覆盖旧信息,旧信息有没有被遗忘或过期 |
这一套顺序,核心思想是“先确认数据有没有进来,再确认数据有没有被找到,最后确认数据是不是真的被模型用上”。如果一上来就调模型参数或换 prompt,往往会绕远路。
5. 什么项目需要做记忆系统?什么项目不需要?
5.1 需要长期记忆的典型场景
并不是所有 Agent 都需要复杂的记忆系统。但在下面几类场景里,记忆系统是刚需。
第一类是个人知识助手。它需要记住用户偏好、已经阅读过的内容、长期关注的主题。如果每次会话都从零开始,用户使用意愿会大幅下降。这里长期记忆的价值已经不是“更方便”,而是产品能不能成立。
第二类是任务型 Agent。它需要跨多个步骤、多个会话来维护任务状态。比如一个“项目重构辅助 Agent”,用户今天提出重构方向,明天继续讨论实施细节,Agent 必须记得昨天已经敲定过哪些约束。否则所有讨论都从起点重来。
第三类是多 Agent 协作系统。它需要共享项目背景、角色边界、任务进度和决策记录。共享记忆在这里用于解决“让多个 Agent 在同一个现实里工作”的问题。
第四类是情感陪伴或长期对话产品。用户会反复回到产品中聊天,产品需要记住用户的关键事件、情绪偏好和生活背景。这其实是最接近“记忆”定义的使用场景。
5.2 不需要或暂时不需要记忆的场景
有些场景不应该为了“有记忆”而强行加记忆。
一次性问答工具就不需要。用户查一个政策、翻译一段文字、写一段文案,任务完成后,对话和任务目标都已经结束。下次再来是新任务,旧任务历史和当前任务没有直接关联。这种情况下,会话日志做审计就够了,额外做长期记忆库只会增加维护成本。
纯工具型 Agent 也不需要。比如执行一条部署命令、查一次天气预报、调用一个接口获取数据,每次调用都是无状态的,模型只需要看到当前这个请求和返回结果。长期记忆在这里没有意义。
学习项目也不需要一上来就做记忆系统。学习 Agent 开发时,先把工具链跑通,理解输入输出、提示词和工具调用,比搭建一个复杂的记忆系统更重要。过早引入记忆,反而会把核心难点掩盖掉。
5.3 一个判断清单
可以用一张表快速判断“要不要给这个项目加记忆系统”:
| 场景 | 是否需要长期记忆 | 建议方案 | 复杂度 |
|---|---|---|---|
| 单次问答 | 不需要 | 直接用提示词处理 | 低 |
| 多轮会话演示 | 需要短期记忆 | 用上下文摘要缓存最近几轮 | 低 |
| 个人知识助手 | 需要长期记忆 | 向量检索 + 结构化用户偏好表 | 中 |
| 任务型 Agent | 需要长期记忆 | 任务状态表 + 事实记忆 | 中高 |
| 多 Agent 协作系统 | 需要共享记忆 | 外部存储 + 分领域读写控制 | 高 |
| 情感陪伴产品 | 需要长期记忆 | 偏好表 + 关键事件记录 | 中 |
判断标准只有三条:用户是否会在不同时间回到同一个上下文里继续任务?Agent 是否需要跨会话使用旧决策?多个 Agent 之间是否存在统一状态?三条里有一条命中,就值得做记忆系统;一条都不中,就先不做。
回到开头那个问题:Agent 失忆不是某个模型的问题,而是系统设计里没有给记忆留位置。真正有效的路径,不是调出一个万能提示词,而是把记忆当成一个工程模块来设计,让它具备写入、存储、检索、更新四类能力,并配合更新与遗忘机制。
对大多数项目来说,不需要一开始就做大规模系统。先从“摘要 + 外部存储 + 按需检索”这个最小闭环开始,跑通一个真实场景,再逐步扩展。这样做出来的 Agent,才不只是会对话,而是真的能在多轮任务里和用户一起工作。