核心要点

  • 短期记忆 = 当前对话窗口/buffer,保存原文或滚动摘要,随会话即时可用

  • 长期记忆 = 把对话/事实/偏好向量化存向量库或结构化存 DB,跨会话持久化

  • 检索 = 用当前 query 按语义相似度(可叠加时间衰减)召回相关片段注入上下文

  • 关键工程点:写入时机与粒度、事实抽取、去重与更新、遗忘/淘汰、用户隔离

标准回答

记忆机制一般拆成短期长期两层,分别解决「当前对话连贯」与「跨会话记住用户」两个问题。

短期记忆(working memory
就是当前对话窗口里的内容,通常用一个 buffer 保存最近若干轮原文;当逼近上下文上限时,对较旧部分做滚动摘要压缩,保证窗口内既有近期细节又有早期概要。它随会话即时可用,会话结束基本失效。

长期记忆(long-term memory)
把需要跨会话保留的信息持久化:

  • 存什么:对话片段、抽取出的事实/偏好(如「用户是 Python 后端」「偏好简洁回答」)、任务结论。
  • 怎么存:语义型内容向量化写入向量库(文本 + embedding + 元数据如 user_id、时间戳、来源);强结构化信息(用户档案、配置)则存关系型/文档 DB,便于精确查询与更新。

检索与召回
新一轮对话时,用当前 query(或最近上下文)生成查询向量,到向量库做 top-k 语义检索,常叠加时间衰减(越新越优先)与元数据过滤(限定当前 user_id),把召回的相关片段拼进 prompt,让模型「想起」相关历史。这本质就是一套面向记忆的 RAG

实现要点

  1. 写入时机与粒度:每轮全写会噪声大、成本高,常按规则/小模型判断「值得记的事实」再写,粒度控制在原子事实级别。
  2. 事实/实体抽取:从对话中抽出结构化事实再入库,比直接存原文更易检索与更新。
  3. 去重与更新:新信息与旧记忆冲突时(如用户改了偏好)要能覆盖/合并,而非无限堆叠矛盾记录。
  4. 遗忘 / 淘汰:按时间衰减、访问频率或容量上限淘汰低价值记忆,避免库无限膨胀、检索变噪。
  5. 持久化与隔离:以 user_id / session_id 做多租户隔离,严防把 A 用户记忆检索给 B。

与「纯长上下文」方案的取舍
纯长上下文实现最简单,但成本随长度增长、且无法跨会话、超长时注意力稀释。记忆机制用额外的存储与检索复杂度,换取跨会话持久、成本可控、按需召回,是个性化助手与长期 Agent 的主流选择。

常见误区

⚠️ 常见踩坑

把「记忆」简单实现为「把所有历史对话原样塞回 prompt」。这既无法跨会话持久化,又会迅速撑爆上下文、抬高成本并稀释注意力。正确做法是分层(短期 buffer + 长期向量/结构化存储)并按相关性检索召回,而非全量回灌。

追问

追问 1什么内容该写入长期记忆?全写还是有选择地写?

应有选择地写。全量写入噪声大、成本高,还会让检索召回大量无关内容。常见做法是用规则或一个小模型判断「是否值得长期记住」,优先写入稳定事实(用户身份、偏好、长期目标、关键结论),过滤寒暄、临时性内容与可重算信息,并以原子事实为粒度,便于后续去重和更新。

追问 2检索时只用语义相似度够吗?

通常不够。纯语义相似容易召回「相关但过时」的记忆,实践中会叠加多种信号:时间衰减(越新越优先)、按 user_id/类型做元数据过滤、必要时混合关键词检索(如精确匹配实体、ID),再对 top-k 结果做重排。对结构化档案类记忆则直接用 DB 精确查询而非向量召回。

追问 3记忆冲突或过时如何处理?

要支持更新与淘汰而非只追加。写入前先检索是否已有相关记忆,命中则按时间或可信度做覆盖/合并,避免库中并存矛盾事实;对长期不被访问或低价值的记忆按时间衰减、访问频率或容量上限淘汰(软删除或归档),保持记忆库精简、检索结果干净。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习