跳到主要内容

Agent 记忆

Agent 记忆是在模型上下文之外保存信息,并在后续调用中有选择地取回的机制。模型本身没有跨请求的记忆,每次调用只看到当前上下文;“记住用户偏好”“延续上周的任务”都需要程序写入和检索。本文讲短期与长期记忆、写入与检索流程、更新与遗忘,以及常见的分层设计。

1. 面试核心​

先记住这几条,再读正文
  • 短期记忆是当前会话的消息历史和任务状态,随会话存在,靠窗口管理和压缩控制长度;长期记忆跨会话保存,存放用户偏好、事实、经验,按需检索后放入上下文。卡 · 记忆的类型
  • 记忆系统由写入(提取什么)、存储(怎么组织)、检索(何时取哪些)、更新与遗忘(冲突、过期、去重)四部分组成。卡 · 写入、存储与检索
  • 写入要有筛选:只保存稳定、未来有用、用户明确表达或多次出现的信息,不把整段对话原样存入。
  • 新旧记忆冲突时,以更新时间更近、来源更可信的为准,并保留修改记录;临时性信息设置过期时间。卡 · 写入、存储与检索
  • 记忆是可被污染的输入:从外部材料中提取的“事实”可能是注入内容,写入前要校验来源。

2. 记忆的类型​

类型内容典型存储生命周期
工作记忆当前任务的消息、工具结果、待办内存、会话存储(Redis)当前会话
会话摘要历史会话的压缩摘要数据库数周到数月
语义记忆用户事实与偏好,如“偏好 Python”“在上海”键值或文档库 + 向量索引长期,可更新
情景记忆过去的具体经历,如“上次部署因端口冲突失败”带时间戳的记录 + 向量索引长期,可淘汰
程序记忆做事的方法、规则,如团队代码规范规则文件、Skill、系统提示长期,人工维护

常说的“三层记忆”通常是:最近几轮原文(工作记忆)→ 较早轮次的摘要 → 跨会话的长期记忆库。不同产品分层方式不同,面试中讲清每层存什么、何时写入、何时读取比记住名称更重要。

上下文与长期记忆的区别:上下文是本次请求模型实际看到的内容,受窗口限制;长期记忆在模型之外,可以很大,但只有被检索并放入上下文的部分才对本次回答起作用。

3. 写入、存储与检索​

写入

  • 时机:会话结束时批量提取,或在对话中发现重要信息时即时写入。批量提取成本低,即时写入保证同一会话内后续可用。
  • 提取:用模型从对话中抽取结构化条目,如 {type: preference, subject: user, content: "回复使用中文", source: "会话 123", time: ...}。抽取任务简单、调用频繁,可以用较小的模型完成。
  • 筛选:只保存明确表达、稳定、未来可能有用的信息。一次性的请求(“这次用英文回答”)不写入长期记忆。

存储

  • 结构化字段(用户 ID、类型、时间、来源、过期时间)放数据库,便于精确过滤和删除。
  • 内容做向量化,用于语义检索。
  • 按用户或租户隔离,不同用户的记忆不能互相检索。

检索

  • 每轮根据当前问题检索相关记忆,结合相关性、时间新近度和重要性打分,取少量条目放入上下文。
  • 稳定的核心信息(用户名、语言偏好)可以每次固定加载,不经过检索。
  • 也可以把检索做成工具,由模型决定何时查询记忆。

4. 更新与遗忘​

  • 去重与合并:写入前检索相似记忆,相同含义的合并,只更新时间和出现次数。
  • 冲突:用户先说“在北京”,后来说“搬到上海了”。新信息覆盖旧信息,旧条目标记为失效并保留历史,回答时只使用有效条目。无法判断时可以向用户确认。
  • 过期:临时状态(“这周在出差”)设置过期时间;长期未被访问、重要性低的记忆可以降权或归档。
  • 用户控制:提供查看、修改和删除记忆的方式,满足隐私和合规要求。

5. 常见问题​

5.1 编码 Agent 的记忆是怎么做的​

常见做法是基于文件:项目根目录的指令文件(如 AGENTS.md、CLAUDE.md)保存构建命令、代码规范等稳定规则,会话开始时自动加载;用户级的同类文件保存个人偏好。长任务的进度写入待办或进度文件。文件记忆可读、可编辑、可以纳入版本管理,缺点是需要人或 Agent 主动维护,内容变长后同样要精简,见仓库指令。

5.2 记忆和 RAG 有什么区别​

6 · 面试题卡片​

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

出现公司:虾皮、小红书、科大讯飞、快手、字节跳动、阿里巴巴

考察重点

  • 两类记忆的存储位置、生命周期和进入上下文的方式。
  • 长期保存的筛选标准。

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

参考回答

短期记忆是当前会话的消息历史、工具结果和任务状态,存在内存或 Redis 等会话存储中,按会话 ID 读取,超出窗口时用滑动窗口和摘要压缩。长期记忆跨会话保存,结构化字段放数据库、内容做向量索引,每轮按当前问题检索少量相关条目放入上下文。

适合长期保存的是稳定且未来有用的信息:用户明确表达的偏好、身份与背景事实、重要决定、过去任务的经验教训。一次性请求、临时状态和闲聊不进入长期记忆,临时但有用的信息设置过期时间。上下文是本次实际输入,长期记忆只有被检索进上下文的部分才起作用。

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

出现公司:字节跳动、快手、安软、蚂蚁、新旦智能

考察重点

  • 写入、存储、检索、维护四个模块。
  • 分层设计和各层的读写时机。

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

参考回答

分三层:最近几轮原文作为工作记忆;较早轮次压缩成会话摘要;跨会话的长期记忆库。

写入:会话结束或发现重要信息时,用模型从对话中抽取结构化条目(类型、内容、来源、时间),只保留明确、稳定、有用的信息。抽取任务简单、调用频繁,可以交给小模型降低成本和延迟。存储:元数据放数据库便于过滤和删除,内容向量化便于语义检索,按用户隔离。检索:按当前问题检索,综合相关性、时间和重要性取少量条目;核心偏好固定加载;也可以把检索做成工具交给模型调用。维护:写入前去重合并,冲突时新的覆盖旧的并保留历史,临时信息过期,用户可以查看和删除。如果记忆存在按日期的大文件中,应切分为条目并建立索引,而不是每次读取整个文件。

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

出现公司:快手、字节跳动、高德、百度

考察重点

  • 提升为长期记忆的判断标准。
  • 去重合并、冲突覆盖、过期与用户控制。

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

参考回答

判断标准有:用户明确要求记住;信息稳定且对未来有用,如偏好、背景、长期目标;在多个会话中重复出现;任务中得到的经验教训。会话结束时用模型按这些标准抽取候选条目,经过去重后写入长期库。

去重:写入前检索相似条目,含义相同的合并,更新时间和出现次数。冲突:新信息覆盖旧信息,旧条目标记失效并保留历史,难以判断时向用户确认。过期:临时状态设置 TTL,长期未访问且重要性低的条目降权或归档。还要校验来源,避免把外部材料中的注入内容写成事实,并提供查看和删除接口。

7. 参考资料​