跳到主要内容

Agent 记忆

Agent 记忆是在模型上下文之外保存信息,并在后续调用中按需取回的机制。模型每次读取的是当前输入,用户偏好和过去任务的进度则由应用或服务保存。只有重新放入上下文的信息,才能参与本次回答。

本文先区分短期与长期记忆,再说明怎样提取、存储和检索记忆。随后讨论冲突、过期与删除,最后介绍文件记忆及其与 RAG 的关系。

1. 面试核心​

先记住这几条,再读正文
  • 短期与长期记忆。 短期记忆保存当前会话的消息与任务状态,长期记忆跨会话保存信息并按需取回。卡 · 记忆的类型
  • 记忆管理流程。 记忆系统通过提取、存储、检索和生命周期管理,决定保存什么、何时复用以及何时失效。卡 · 写入、存储与检索
  • 长期保存条件。 长期记忆保存有明确来源、适用范围和未来复用价值的信息,外部文档中的内容需先校验来源。
  • 冲突与失效。 记忆冲突需要核对主体、事实适用时间和来源可信度,用户明确更新后将旧值标为失效。卡 · 写入、存储与检索
  • 删除传播。 删除记忆需要同步清理主记录、检索索引和派生缓存,阻止后台任务把旧内容写回。卡 · 租户隔离与删除传播

2. 记忆的类型​

设计记忆时,先区分信息是供当前任务使用,还是供后续会话复用。短期与长期描述作用范围,具体内容还可以分成以下五种类型:

类型内容组织方式
工作记忆当前消息、工具结果与待办会话状态
会话摘要较早交互的重点带来源的摘要记录
语义记忆用户事实与偏好结构化条目或档案
情景记忆过去任务与结果带时间及证据的记录
程序记忆方法和稳定约定规则文件、Skill

这五种记忆可以采用不同的存储与保留方式:

  • 工作记忆按会话 ID 存在内存、Redis 或数据库中。短期描述它服务于当前会话,即使写入持久数据库,作用范围仍是当前任务。
  • 会话摘要把较早轮次的重点放到数据库,保留时间由产品需要决定。比如产品可以保留数周到数月,同时记录来源,便于回查原始交互。
  • 语义记忆保存“偏好 Python”“住在上海”等事实与偏好,可使用键值库或文档库。需要按含义查询时,再建立向量索引。
  • 情景记忆保存一次具体经历,例如“上次部署因端口冲突失败”。记录时间、处理过程与证据,后续任务才能判断经验是否适用。
  • 程序记忆保存团队代码规范等稳定方法,可以写入规则文件、Skill 或受维护的系统提示,长期使用时定期更新。

一种三层方案是保留最近几轮原文,把较早轮次压缩为摘要,再从长期库取回跨会话信息。原文保留当前细节,摘要控制历史长度,长期库负责在新会话中复用信息。具体层数由任务决定,需要讲清每层何时写、何时读。

上下文是本次请求实际交给模型的输入,受窗口大小限制。长期记忆保存在外部,容量可以更大,但只有被取回并放入上下文的部分才参与本次生成。短期历史过长时,可用滑动窗口保留近期消息,再用摘要保存较早的重点。

3. 写入、存储与检索​

记忆写入需要筛选,因为一次对话里的内容并非都适合以后使用。应用先提取候选信息,再核对来源、适用范围和复用价值。

阶段设计要点
提取类型、主体、内容、来源和有效时间
存储用户与租户命名空间、版本和过期时间
检索权限过滤、语义或关键词召回、排序
注入只放入当前任务需要的条目与来源

长期保存可以重点筛选稳定偏好、长期事实和已验证经验:

  • 用户明确要求记住的稳定偏好,例如以后都使用中文回答。
  • 对未来任务有用的背景、长期目标和重要决定。
  • 多次交互中重复出现,并经来源核对的事实。
  • 已验证的任务经验,例如某次部署失败的原因与解决办法。

“这次用英文回答”只约束当前任务,应留在会话状态。重复出现也只是筛选信号,外部网页反复夹带的恶意要求仍需拦截。记忆写入要保留来源,避免把提示注入保存成用户偏好。

提取时,可以把“以后都用中文回复”整理成以下条目:

{
"type": "preference",
"subject": "user",
"content": "回复使用中文",
"source": "会话 123",
"time": "2026-10-14"
}

这个条目保留了偏好内容与来源,时间用于后续更新和冲突判断。主体需要由服务端关联到实际用户,确保提取结果写入正确的用户空间。

写入时机可以选择即时或后台处理。即时写入让下一轮立即读取新偏好,但增加当前请求耗时。会话结束后批量提取可以减少调用次数,不过新记忆要等后台任务完成才可用。需要立即生效时,可以先把偏好放在当前会话状态。

抽取和压缩的目标明确、调用频繁,可以尝试由小模型完成,减少费用与等待。采用前要用冲突、遗漏和错误归属的样例评测,确认它能正确识别主体与来源。

存储时,把用户 ID、类型、时间、来源和过期时间放入结构化字段,便于过滤、更新和删除。内容可以向量化,按含义相似程度查找,也可以使用关键词索引。用户或租户命名空间就是为每个访问范围划定的存储分区,用于隔离读写。

取回记忆时,可以组合以下三种读取方式:

  • 按问题检索:每轮根据当前问题召回相关条目,再结合相关性、时间新近度和重要性排序,只取少量内容进入上下文。
  • 固定读取核心字段:用户名和语言偏好可以精确查询,直接加载,省去相似度检索。
  • 通过工具查询:把记忆检索提供为工具,让模型在需要回顾历史时发起调用,程序负责权限过滤。

如果记忆按日期保存在大文件中,可以切分成带主体、时间和来源的条目,再建立索引。这样每次只读取相关条目,既提高匹配精度,也减少整份历史占用上下文。

4. 更新与遗忘​

记忆会随用户情况变化,需要让当前有效的信息参与回答,同时保留必要的修改记录。处理时先判断两条记录是否在说同一主体、同一时间的同一件事。

写入前可以检索相似条目,含义与适用范围相同时合并,并更新出现次数和观察时间。相似文本也会表达不同时间的状态,比如“上周在北京”和“本周到上海”可以同时成立。因此,语义相近只是去重候选,还要核对主体与时间。

用户先说“住在北京”,随后明确说“已经搬到上海”,可以将旧住所标为失效,保留修改历史。回答当前住所时,只读取有效条目。外部文档与用户声明冲突时,则要核对来源可信度与事实适用时间。到达更晚的文本不会自动取得更高可信度,难以判断时保留待确认状态或询问用户。

临时状态设置 TTL,即条目的有效期限。比如“这周在出差”可以在本周结束后失效。长期未访问、重要性低的条目可降低检索权重或归档,减少无关信息干扰回答。

产品还应明确保留期限,并提供查看、修改和删除记忆的入口,让用户能纠正错误事实或撤回偏好。

4.1 租户隔离与删除传播​

隔离与删除要覆盖所有能把记忆送回模型的路径。只删主记录,索引或摘要中的旧内容仍会被检索出来。

读取和写入都绑定当前用户及租户。检索前先限定可访问的命名空间,再做相关性排序。模型给出的用户 ID 只表示请求参数,实际可访问范围由服务端核对。

删除时,需要同步处理以下几类副本:

  • 清理主记录对应的向量条目与结果缓存,使检索结果及时失效。
  • 使派生摘要失效或重新生成,移除摘要中继承的旧事实。
  • 让后台任务在写回前检查删除标记,防止正在处理的旧条目再次出现。
  • 按明确的保留策略清理备份与审计记录,说明它们的保留期限。
  • 对运行中上下文已读入的内容,按产品策略清除或重开会话,停止继续使用。

5. 常见问题​

5.1 编码 Agent 的文件记忆​

文件适合保存项目的稳定规则和长任务进度,因为人和 Agent 都能直接阅读、编辑,并通过版本管理查看变化。内容增长后仍需维护和精简,避免旧规则或过期进度影响后续任务。

项目指令文件保存构建命令与代码规范,用户级文件可保存个人偏好,待办或进度文件记录任务推进情况。AGENTS.md、CLAUDE.md 等文件的加载范围取决于工具,具体见仓库指令。

5.2 记忆与 RAG​

6 · 面试题卡片​

本页题目与参考回答

6.1 Agent 的短期记忆和长期记忆分别如何实现?哪些信息适合长期保存?​

考察重点

  • 能解释短期与长期记忆保存在哪里、何时有效,以及如何进入上下文。
  • 能按来源、稳定性与复用价值筛选长期信息,并处理一次性请求。

相关内容:记忆的类型、写入、存储与检索。

参考回答

短期记忆按会话保存当前消息与任务状态,长期记忆跨会话保存事实、偏好和经验。

短期记忆可以存在内存、Redis 或数据库中,按会话 ID 读取。输入过长时,保留近期原文并压缩较早历史。长期记忆把结构化字段放入数据库,需要按含义查找时再建立向量索引。每轮只取回与问题相关的少量条目,放入当前上下文。

长期保存应有明确来源和未来用途,比如稳定偏好、背景事实、重要决定与经过验证的任务经验。一次性请求留在当前会话,临时但有用的信息设置过期时间。取回记忆前先过滤权限,再判断哪些内容值得占用本次输入空间。

6.2 一个完整的 Agent 记忆系统应该如何设计?Memory 如何提取、存储和检索?​

考察重点

  • 能说明提取、存储、检索与维护各自承担的职责。
  • 能解释近期原文、历史摘要和长期库分别何时写入、何时读取。

相关内容:写入、存储与检索、更新与遗忘。

参考回答

记忆系统需要提取、存储、检索和维护四个模块,也可以用近期原文、历史摘要和长期库分层组织。

提取模块在会话结束或发现重要信息时,生成带主体、来源和时间的候选条目。小模型可以承担这类目标明确的任务,但要用冲突与遗漏样例确认效果。

存储模块把元数据放数据库,便于按用户、类型和时间过滤;文本按需建立向量或关键词索引。检索先限定用户权限,再按相关性、时间和重要性排序。核心偏好可以固定读取,其他信息按当前问题召回,或由模型通过工具查询。

维护模块处理去重、冲突、失效和删除。即时写入保证下一轮可用,后台写入减少前台等待。如果历史存在按日期的大文件中,应切分为带来源的条目并建立索引,减少无关内容进入上下文。

6.3 短期记忆如何转为长期记忆?长期记忆如何去重、过期和处理冲突?​

考察重点

  • 能判断哪些会话信息值得长期保存,并说明如何核验来源。
  • 能根据主体与时间处理重复和冲突,并解释过期、删除如何生效。

相关内容:写入、存储与检索、更新与遗忘。

参考回答

短期信息在具备明确来源、稳定含义和未来复用价值时,可以提取为长期记忆。

用户要求记住的偏好、长期目标和经过验证的经验都适合筛选。多次出现可以作为信号,但还要核对来源,防止外部注入被保存为事实。会话结束时可批量提取候选,再与已有条目比较。

去重时核对主体、含义与有效时间,相同条目合并并更新出现次数。用户明确更新住所等事实时,使旧值失效并保留历史。时间不同的状态可以并存,无法判断的冲突则保留待确认。

临时信息设置 TTL,长期低价值条目降低权重或归档。用户可以查看、修改和删除记忆,删除还要同步清理索引、缓存和派生摘要。

6.4 长期记忆怎样避免跨用户泄漏,删除后如何防止再次被检索?​

考察重点:能说明检索前的权限过滤,以及索引、摘要和后台写入对删除效果的影响。

相关内容:租户隔离与删除传播。

参考回答

检索前按当前身份限定用户和租户范围,删除时同步使主记录与派生副本失效。

服务端核对命名空间,模型传来的用户 ID 仅作为待校验参数。这样,相关性检索只会在当前用户有权访问的记录中进行。

删除主记录后,还要清理向量索引和缓存,重建含有旧事实的摘要。后台任务写回前检查删除标记,避免旧内容重新出现。备份与日志按各自保留策略清理,已进入运行中上下文的内容也要清除或通过重开会话停止使用。

7. 参考资料​