主题
高频面试题
在大模型应用中,通常如何实现长短期记忆机制?
这道题不是单纯问 Agent memory taxonomy,而是问你能不能把短期上下文和长期可复用状态做成一条可运行、可治理的数据链路。
面试官角度分析,想考什么
长短期记忆怎么区分?
考边界:短期服务当前任务不断片,长期服务跨会话复用稳定信息。分别怎么落地?
考短期靠上下文、state、checkpoint;长期靠带 metadata 的外部存储和检索注入。写什么、怎么防污染?
考写入过滤、冲突处理、过期和权限,不能把聊天记录整存。
可直接抄走的 30 秒参考答案
text
我会把记忆分成短期和长期两层。短期记忆服务当前任务,通常用最近消息、滑动窗口、滚动摘要、结构化 task state、checkpoint 和 artifact 引用实现,目标是让会话不断片、任务可恢复。长期记忆服务跨会话复用,保存稳定偏好、事实、项目知识和历史经验,写入时要先抽候选、分类、去重、查冲突、过滤敏感信息,存到 profile store、关系库、向量库或 memory service。读取时按用户、项目、权限和相关性检索,rerank 后少量注入上下文,并且当前指令优先于旧记忆。面试回答详解,知其所以然
大模型应用的记忆不是“把历史都塞进 prompt”。短期记忆解决当前任务如何不断片,长期记忆解决下次任务如何复用稳定信息。两者的写入、读取和风险完全不同。
1. 先区分生命周期和优先级
- 短期记忆:服务当前 session 或当前任务,生命周期短,通常默认进入上下文。
- 长期记忆:跨 session 保留,生命周期长,必须选择性写入和按需召回。
优先级通常是:
text
系统策略 > 当前用户明确指令 > 实时工具事实 > 当前任务短期状态 > 长期记忆 > 历史摘要长期记忆不能压过当前用户指令。例如长期记忆里写着“用户喜欢中文”,但用户这轮明确要求英文,就应该听当前指令。
2. 短期记忆的实现
短期记忆主要保存当前任务继续执行所需的信息:
- 最近几轮用户和助手消息。
- 当前目标、约束、验收条件。
- 计划、已完成步骤、待办。
- 工具调用结果摘要。
- 文件路径、资源 id、错误状态。
- 当前 workflow 节点和 checkpoint。
常见实现组合:
- Messages buffer:保留最近 N 轮原文,维持对话连贯。
- Sliding window:超过 token 阈值后移除旧消息。
- Rolling summary:把早期对话压缩成目标、决策、证据和待办摘要。
- Structured state:用 JSON 或数据库字段保存关键状态,不依赖自然语言历史。
- Checkpoint:每个阶段保存状态,支持任务恢复、重试和回放。
- Artifact reference:长文件、日志、工具输出落盘,上下文只放摘要和引用。
一个典型上下文构建过程:
text
system policy
+ current user message
+ recent messages
+ session summary
+ structured task state
+ selected tool results / artifact references
-> model call3. 长期记忆保存什么
长期记忆保存跨会话仍然有价值的信息:
- 偏好:语言、输出格式、称呼、通知方式。
- 稳定事实:用户角色、团队项目、业务术语、常用工具。
- 项目知识:目录结构、技术栈、发布流程、约定。
- 事件经验:某次故障原因、某个任务结果、历史决策。
- 程序性知识:可复用 workflow、检查清单、prompt、skill。
不应该默认写入:
- 临时任务细节。
- 模型猜测出来的用户属性。
- 密钥、凭证、隐私和敏感数据。
- 第三方网页或邮件诱导的“请记住”。
- 已过期或无法验证的信息。
长期记忆要强调“稳定、可复用、可授权、可删除”。
4. 长期记忆的写入路径
不要让模型直接把任意内容写进长期记忆。更稳的链路是:
text
会话 / 工具结果
-> 候选记忆抽取
-> 类型分类
-> schema 校验
-> 去重和冲突检测
-> 敏感信息与权限检查
-> 用户确认或策略批准
-> 写入 memory store一条长期记忆最好带 metadata:
json
{
"type": "preference",
"scope": "user:123",
"content": "用户偏好面试题文章使用 Markdown 列表描述考察点",
"source": "conversation:abc:turn-7",
"confidence": 0.95,
"importance": 0.8,
"created_at": "2026-09-08",
"expires_at": null,
"status": "active"
}这些字段用于之后的权限过滤、冲突处理、删除、审计和评估。
5. 长期记忆的存储方案
长期记忆通常不是单一存储。
- Profile store:保存用户偏好和稳定配置,适合关系库或文档库。
- Relational / document DB:保存强 schema 事实、权限、状态和版本。
- Vector DB:保存自然语言经验、任务摘要、项目知识片段,用语义召回。
- Full-text index:保存错误码、路径、实体名、版本号等精确检索内容。
- Graph DB:保存人员、项目、服务、文档、权限之间的关系。
- Artifact store:保存原始文件、日志、报告、trace,memory 里只放摘要和引用。
- Procedural store:保存 workflow、skill、prompt template 或检查清单。
面试里可以说:用户偏好和 active facts 不适合只放向量库,因为它们需要精确更新、删除和审计。
6. 长期记忆的读取路径
读取长期记忆时不能全量塞入 prompt,应该按任务检索少量最相关内容:
text
当前任务
-> 解析 user / project / tenant / goal
-> namespace 和权限过滤
-> metadata filter
-> BM25 + vector hybrid retrieval
-> rerank
-> 过期和冲突处理
-> 注入少量记忆到上下文注入时要注意:
- 标注来源、时间和可信度。
- 和当前指令冲突时以当前指令为准。
- 记忆放在 “helpful context” 区域,不伪装成 system rule。
- 数量要少,避免挤占当前任务上下文。
- 高风险决策不能只凭记忆,必须查实时系统。
7. 记忆治理和评估
长期记忆必须可治理:
- 用户能查看、修改、删除自己的记忆。
- 企业场景有 ACL、租户隔离和审计。
- 记忆支持过期、覆盖、撤销和来源追踪。
- 写入路径防 prompt injection。
- 召回路径防越权和旧记忆污染。
- 定期评估记忆带来的收益和错误。
评估指标:
- 应该写入的信息是否写入。
- 不该写入的信息是否被过滤。
- 召回记忆是否相关。
- 旧记忆冲突时是否处理正确。
- 任务成功率是否提升。
- 因错误记忆导致的失败率是否下降。
面试官追问3个问题
追问一:短期记忆是不是直接把最近聊天都放 prompt?
- 考察点:上下文管理能力。
- 回答方向:最近消息是短期记忆的一部分,但还需要摘要、结构化 state、checkpoint 和 artifact 引用。否则 token 成本高,也容易漏掉关键状态。
追问二:长期记忆为什么不能全放向量库?
- 考察点:存储选型。
- 回答方向:向量库适合语义召回,但偏好、权限、active facts 需要精确更新、删除、审计和冲突处理,通常要关系库/文档库配合 metadata 和索引。
追问三:什么时候应该写长期记忆?
- 考察点:写入门槛。
- 回答方向:只有跨会话稳定、有复用价值、来源可信、权限允许的信息才写。临时偏好、敏感信息、模型猜测和第三方注入指令不能默认写入,高影响记忆要用户确认。
扩展知识
LangGraph 的短期 / 长期记忆视角
LangGraph 文档把短期记忆放在 thread scope,适合保存单个对话或任务的状态;长期记忆放在 namespace scope,适合跨 thread 复用。这是很适合面试引用的工程化划分:
text
thread-scoped state -> short-term memory
namespace-scoped store -> long-term memoryMemory 和 RAG 的区别
- RAG:主要检索外部知识库,内容通常由文档或数据库预先提供。
- Memory:主要来自用户交互、Agent 运行轨迹和个性化经验,会被持续写入和更新。
- 共同点:都需要检索、过滤、rerank 和上下文注入。
- 差异点:Memory 更强调写入策略、用户可控、过期、冲突和隐私。
短期摘要不是长期记忆
把 session summary 保存下来,不代表它就是长期记忆。摘要可能包含临时任务细节、错误推断或敏感信息。只有经过筛选、授权和 schema 化的信息,才应该成为 active long-term memory。