考察点
这道题考的是你对「记忆」这个被用烂的词有没有工程化的拆解。面试官想听:短期记忆和长期记忆的边界在哪、各自怎么存怎么取、写入策略怎么设计。背出 MemGPT 或 Mem0 的名词只是起点,能讲清「什么该进长期记忆、怎么召回、怎么防污染」才算答到位。追问常往 RAG 与记忆的关系、记忆更新冲突、隐私合规走。
参考答案
先立框架:记忆不是一样东西
Agent 的记忆系统可以借人类认知的分层来设计:短期记忆(工作记忆)是当前任务进行时的上下文,长期记忆是跨会话持久化的信息。两者的本质区别在于生命周期和存储介质:短期记忆活在上下文窗口里,会话结束即消亡;长期记忆存在外部存储(向量库、KV、关系库)里,按需召回注入上下文。
一个 Agent 系统通常拆成三层:
| 层次 | 内容 | 存储 | 生命周期 |
|---|---|---|---|
| 工作记忆 | 当前会话的对话历史、工具调用结果、scratchpad | 上下文窗口 | 单会话 |
| 情景记忆 | 历史会话的摘要、过去任务的执行记录 | 向量库/文档库 | 跨会话 |
| 语义记忆 | 用户画像、偏好、领域事实 | 结构化 KV/关系库 | 长期 |
短期记忆:管好上下文窗口
短期记忆的核心问题不是「存什么」,而是「窗口满了怎么办」,因为所有信息都挤在有限的上下文里。常见策略:
- 滑动窗口:只保留最近 N 轮对话,简单粗暴,但会丢早期关键信息(比如用户开头说的约束条件)。
- 摘要压缩:超阈值后让模型把早期历史压缩成摘要,保留最近几轮原文。摘要要聚焦「已确认的事实和待办」,不能写成流水账。
- scratchpad 外置:中间推理、大段工具返回不必常驻上下文,提取结论后原始内容可以丢弃或归档。
短期记忆还要管「状态」而不只是「对话」:当前任务进行到哪一步、已收集哪些参数、哪些工具调过了——这些结构化状态最好单独维护,别让模型每次从对话历史里重新推断。
长期记忆:写、读、更新三个环节
写入(什么值得记) 是最难的设计点。全记等于没记——噪音淹没信号,还撑爆存储。实践中分两类触发:显式写入(用户说「记住我喜欢简洁的回答」)直接落库;隐式写入由模型在会话结束或关键节点判断「这条信息未来有用吗」,常见可记的包括用户偏好、事实性信息(姓名、公司、项目)、任务执行的经验教训。每条记忆带元数据:来源、时间戳、置信度。
召回(怎么取) 主流是向量检索:把当前对话的 query 编码后取向量库 top-K(常用 3-5 条),注入系统提示。注意纯语义相似会召回到过时或无关的记忆,工程上要做混合排序:语义相似度 + 时间衰减 + 重要性打分,重要的、最近用过的优先。用户画像这类强结构信息不该走向量召回,直接按 user_id 精确查,100% 命中。
更新与遗忘 最容易被忽略。用户说「我换工作了」,新旧两条记忆冲突,不能只追加不更新——要么按 key 覆盖(画像类),要么写入时做相似记忆去重和冲突检测。过时记忆要能被清理,否则召回质量持续劣化。
和 RAG 的关系,以及边界
技术上长期记忆的召回就是 RAG 的 pipeline,但定位不同:RAG 检索的是「世界知识」(文档库,对所有用户一致),记忆检索的是「用户相关的个性化信息」(每用户一份,持续生长)。很多系统两者并存,路由层先判断该查知识库还是查记忆库。
最后提一句合规:长期记忆存的是用户数据,要有查看、删除的入口(欧盟 GDPR 的遗忘权是硬性要求),敏感信息(密码、身份证)要做过滤不写入。这点在 to C 产品的面试里是加分项。
可能的追问
追问:记忆召回不准确怎么办?
先分错误类型:召回不到是 embedding 或索引问题,可以改混合检索(向量+关键词)、调 top-K;召回错了是写入质量问题,回溯写入策略,给记忆加重要性和类型标签,召回时加权过滤。建一个小规模回归集(已知该召回哪条的 query 集)来量化改动效果。
追问:对话里的信息怎么变成结构化记忆?
两种路子:规则式的,对「记住…」「我的…是…」这类显式表达直接抽取;模型式的,会话结束后用一个抽取 prompt 让模型从全文中提炼候选记忆条目,输出带类型的结构化 JSON,再去重入库。Mem0 这类开源项目走的就是模型式路线。
追问:长期记忆会不会越用越差(污染)?
会,三个污染源:错误信息被写入(模型理解错了用户的话)、过时信息没清理、低价值信息稀释召回。对策:写入时带置信度和来源、支持用户查看和纠正、定期做冲突合并和过期淘汰,把记忆库当数据资产一样治理。