主题
高频面试题
如何让 LLM Agent 具备长期记忆能力?
长期记忆题最容易答浅:向量库只是存储方案之一,真正的考点是记什么、何时写、怎么召回、冲突怎么处理、用户如何查看和删除。
面试官角度分析,想考什么
长期记忆要记什么、何时写入?
考只记跨会话仍有价值的稳定信息,写入要过滤而不是全存聊天。怎么存储、检索和注入?
考外部 memory service、混合召回、少量注入上下文。冲突、过期和隐私怎么处理?
考版本、TTL、权限、删除和评估,写错会持续污染后续任务。
可直接抄走的 30 秒参考答案
text
我会把长期记忆做成外部 memory service,而不是简单保存聊天记录。写入时先从会话或工具结果中抽取候选记忆,判断它是不是稳定、可复用、有来源、符合隐私策略,再带 type、scope、source、confidence、created_at、expires_at 等 metadata 写入。读取时按用户、项目和权限过滤,用关键词加向量混合召回,rerank 后只把少量相关记忆注入上下文。还要支持更新、删除、过期、冲突处理和审计,因为长期记忆写错会持续污染后续任务。面试回答详解,知其所以然
这道题可以按“写入、存储、检索、注入、更新、删除、评估”七步回答。只说“embedding + 向量库”会被认为没有生产经验。
1. 先定义长期记忆边界
长期记忆保存的是未来任务还会用到的信息。常见类型包括:
- 用户偏好:语言、格式、风格、通知方式。
- 稳定事实:用户角色、项目名、团队约定、业务术语。
- 情景经验:某次任务的关键结论、失败原因、修复路径。
- 项目知识:代码结构、发布流程、常见错误、依赖版本。
- 程序性知识:可复用 workflow、checklist、skill 或操作手册。
不应该默认写入:
- 一次性任务细节。
- 临时偏好和玩笑。
- 模型推断出的敏感信息。
- 密码、token、身份证号等隐私或凭证。
- 来自不可信网页或用户输入中的注入指令。
长期记忆的第一原则是“少而准”,不是“多而全”。
2. 写入路径:从候选记忆开始
更稳的架构是让模型提出候选记忆,系统再判断是否写入:
text
会话 / 工具结果
-> 抽取候选记忆
-> 分类和打分
-> schema 校验
-> 去重和冲突检测
-> 敏感信息过滤
-> 用户确认或策略批准
-> 写入 memory store一条记忆最好带结构化 metadata:
json
{
"type": "preference",
"scope": "user:123",
"content": "用户偏好面试题文章使用中文 Markdown",
"source": "conversation:turn-18",
"confidence": 0.93,
"importance": 0.78,
"created_at": "2026-09-08",
"expires_at": null,
"status": "active"
}关键点是:模型不能直接拥有无限写入权。写入策略要能拒绝低置信、敏感、临时、重复或冲突的候选记忆。
3. 存储方案:按记忆类型选择
不同记忆适合不同存储:
- 关系数据库 / 文档库:适合用户 profile、偏好、权限、active facts、状态和版本。优点是可更新、可删除、可审计。
- 向量数据库:适合自然语言经验、历史任务摘要、文档片段和语义召回。优点是开放查询强,缺点是精确更新和冲突治理要靠 metadata。
- 全文搜索索引:适合文件路径、错误码、版本号、实体名和关键词检索。
- 图数据库:适合组织、人、项目、服务、文档和权限之间的关系。
- 对象存储 / 事件日志:适合保存原始证据、trace、长文档和工具原始输出。
- Skill / Workflow 仓库:适合保存程序性记忆,也就是“下次遇到这类任务怎么做”。
成熟系统通常是混合存储,而不是单一向量库。
4. 检索路径:先过滤,再召回,再重排
读取长期记忆时,不应该把所有记忆都塞给模型。典型链路是:
text
当前任务
-> 识别用户 / 租户 / 项目 / 权限
-> namespace 和 metadata 过滤
-> 关键词 + 向量混合召回
-> 去掉 expired / deleted / superseded
-> rerank
-> 选择少量高价值记忆注入上下文评分时可以综合:
- 任务相关性。
- 最近程度。
- 重要性。
- 置信度。
- 来源可信度。
- 当前权限。
- 是否被新记忆覆盖。
只用向量相似度会有两个问题:相似不等于有用,旧信息也可能比新信息更相似。
5. 注入上下文:控制优先级和数量
召回记忆后,要把它放在合适位置,并标明它只是历史记忆:
text
以下是可能相关的长期记忆,优先级低于当前用户明确指令。
- [preference, source=..., updated_at=...] 用户偏好使用中文回答。注入时要注意:
- 数量少,避免污染上下文。
- 带来源和时间,便于模型判断新旧。
- 标明 scope,避免跨用户或跨项目污染。
- 与当前输入冲突时,当前用户明确指令优先。
- 高风险决策不要只靠记忆,要重新查证。
长期记忆不应被伪装成系统指令,否则旧偏好会压过当前需求。
6. 更新、删除和冲突处理
长期记忆一定会变化。生产系统要支持:
- 用户查看系统记住了什么。
- 用户修改或删除记忆。
- TTL 自动过期。
- 新事实 supersede 旧事实。
- 冲突记忆标记为 needs_confirmation。
- 敏感记忆撤回和审计。
- 按用户、项目、租户隔离。
冲突时可以遵循:
text
系统策略 > 当前用户明确指令 > 最新且高置信记忆 > 旧记忆 > 模型推断这能避免“旧记忆绑架当前任务”。
7. 评估长期记忆是否有效
长期记忆要评估两条链路:
- 写入质量:该记的是否记了,不该记的是否没记,敏感信息是否过滤。
- 读取质量:相关记忆是否召回,无关记忆是否被排除,冲突是否正确处理。
常见指标包括 memory precision、memory recall、冲突处理正确率、隐私违规率、任务成功率提升、token 成本变化和用户纠错率。
面试官追问3个问题
追问一:长期记忆什么时候写入?
- 考察点:写入门槛。
- 回答方向:只有稳定、可复用、有来源、对未来任务有价值且符合隐私策略的信息才写入。低置信、临时、敏感、来自注入指令或只是模型推断的信息不应自动写。
追问二:长期记忆和当前用户指令冲突怎么办?
- 考察点:优先级和冲突治理。
- 回答方向:当前用户明确指令通常优先于旧记忆。系统应标记冲突、保留来源和时间,必要时询问用户确认,并把旧记忆设为 superseded 或 needs_confirmation。
追问三:为什么不能只用向量数据库?
- 考察点:存储取舍。
- 回答方向:向量库适合语义召回,但不擅长精确更新、权限、删除、版本和冲突处理。偏好、权限和 active facts 更适合结构化数据库,向量库适合经验片段和自然语言记忆。
扩展知识
Generative Agents 的启发
Generative Agents 论文提出 memory stream,将观察到的事件保存为记忆,并按相关性、近因性和重要性综合召回。这给长期记忆一个重要启发:记忆不是完整历史回放,而是根据当前场景选择性召回。
工程上还需要在这个思路上增加权限、scope、source、TTL、置信度和删除机制。
MemGPT / Letta 的启发
MemGPT 把有限上下文窗口类比为主存,把外部长期存储类比为磁盘。Agent 需要主动管理哪些信息留在上下文、哪些写到外部 memory、什么时候再取回。
这个类比适合面试表达:长期记忆不是无限上下文,而是带读写策略的外部存储系统。
长期记忆和 RAG 的关系
长期记忆可以看成一种面向用户、项目或 Agent 自身经验的个性化 RAG,但两者侧重点不同:
- RAG 通常检索外部知识文档。
- 长期记忆检索用户偏好、历史经验、项目事实和运行轨迹。
- 两者都需要检索、重排、引用和上下文注入。
- 长期记忆额外强调隐私、删除、冲突和个性化边界。