Skip to content

高频面试题

如何让 LLM Agent 具备长期记忆能力?

长期记忆题最容易答浅:向量库只是存储方案之一,真正的考点是记什么、何时写、怎么召回、冲突怎么处理、用户如何查看和删除。

适合阶段:Agent 工程 / Memory 架构面核心能力:Memory Write · Retrieval · Governance · Privacy

面试官角度分析,想考什么

  • 长期记忆要记什么、何时写入?
    考只记跨会话仍有价值的稳定信息,写入要过滤而不是全存聊天。

  • 怎么存储、检索和注入?
    考外部 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 通常检索外部知识文档。
  • 长期记忆检索用户偏好、历史经验、项目事实和运行轨迹。
  • 两者都需要检索、重排、引用和上下文注入。
  • 长期记忆额外强调隐私、删除、冲突和个性化边界。

基于 MIT 协议开源