标准回答
记忆机制一般拆成短期与长期两层,分别解决「当前对话连贯」与「跨会话记住用户」两个问题。
短期记忆(working memory)
就是当前对话窗口里的内容,通常用一个 buffer 保存最近若干轮原文;当逼近上下文上限时,对较旧部分做滚动摘要压缩,保证窗口内既有近期细节又有早期概要。它随会话即时可用,会话结束基本失效。
长期记忆(long-term memory)
把需要跨会话保留的信息持久化:
- 存什么:对话片段、抽取出的事实/偏好(如「用户是 Python 后端」「偏好简洁回答」)、任务结论。
- 怎么存:语义型内容向量化写入向量库(文本 + embedding + 元数据如 user_id、时间戳、来源);强结构化信息(用户档案、配置)则存关系型/文档 DB,便于精确查询与更新。
检索与召回
新一轮对话时,用当前 query(或最近上下文)生成查询向量,到向量库做 top-k 语义检索,常叠加时间衰减(越新越优先)与元数据过滤(限定当前 user_id),把召回的相关片段拼进 prompt,让模型「想起」相关历史。这本质就是一套面向记忆的 RAG。
实现要点
- 写入时机与粒度:每轮全写会噪声大、成本高,常按规则/小模型判断「值得记的事实」再写,粒度控制在原子事实级别。
- 事实/实体抽取:从对话中抽出结构化事实再入库,比直接存原文更易检索与更新。
- 去重与更新:新信息与旧记忆冲突时(如用户改了偏好)要能覆盖/合并,而非无限堆叠矛盾记录。
- 遗忘 / 淘汰:按时间衰减、访问频率或容量上限淘汰低价值记忆,避免库无限膨胀、检索变噪。
- 持久化与隔离:以 user_id / session_id 做多租户隔离,严防把 A 用户记忆检索给 B。
与「纯长上下文」方案的取舍
纯长上下文实现最简单,但成本随长度增长、且无法跨会话、超长时注意力稀释。记忆机制用额外的存储与检索复杂度,换取跨会话持久、成本可控、按需召回,是个性化助手与长期 Agent 的主流选择。
常见误区
⚠️ 常见踩坑
把「记忆」简单实现为「把所有历史对话原样塞回 prompt」。这既无法跨会话持久化,又会迅速撑爆上下文、抬高成本并稀释注意力。正确做法是分层(短期 buffer + 长期向量/结构化存储)并按相关性检索召回,而非全量回灌。
追问
追问 1:什么内容该写入长期记忆?全写还是有选择地写?
应有选择地写。全量写入噪声大、成本高,还会让检索召回大量无关内容。常见做法是用规则或一个小模型判断「是否值得长期记住」,优先写入稳定事实(用户身份、偏好、长期目标、关键结论),过滤寒暄、临时性内容与可重算信息,并以原子事实为粒度,便于后续去重和更新。
追问 2:检索时只用语义相似度够吗?
通常不够。纯语义相似容易召回「相关但过时」的记忆,实践中会叠加多种信号:时间衰减(越新越优先)、按 user_id/类型做元数据过滤、必要时混合关键词检索(如精确匹配实体、ID),再对 top-k 结果做重排。对结构化档案类记忆则直接用 DB 精确查询而非向量召回。
追问 3:记忆冲突或过时如何处理?
要支持更新与淘汰而非只追加。写入前先检索是否已有相关记忆,命中则按时间或可信度做覆盖/合并,避免库中并存矛盾事实;对长期不被访问或低价值的记忆按时间衰减、访问频率或容量上限淘汰(软删除或归档),保持记忆库精简、检索结果干净。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习