如果你在搭 Agent,或者在做任何需要"记住用户"的产品,这个问题迟早会撞上来,所以记录一下我的理解。
当前主流方案:Vector Store + Embedding
目前最常见的实现方式很直接:
- 用户对话或行为生成 embedding
- embedding 存入 vector database
- 新请求来了,生成 query embedding
- 通过 similarity search 找到 top-k 相关记忆
这套东西能跑,也确实能解决"历史信息检索"的问题。但说实话,它更像一个可检索日志系统,而不是一个记忆系统。
真正难的地方在三件事:记忆压缩、记忆演化、记忆冲突解决。
记忆压缩:你不能什么都存
如果系统把每次对话都往 vector store 里塞,数据量会爆炸式增长。
比如用户在不同场合说了这些:
- "I like sushi"
- "I love sushi"
- "Sushi is my favorite food"
- "I enjoy eating sushi"
一个 naive 的系统会存 4 条记忆,但真正有价值的信息其实只有一条:用户喜欢寿司。
这个问题很像数据库里的 LSM-tree compaction——原始日志需要被压缩成更高层的状态快照。AI 记忆也一样:原始交互要压缩成结构化知识。
比如用户说了"我搬到西雅图了"、"西雅图老下雨"、"我挺喜欢住这儿的",压缩后应该是一条:用户住在西雅图。
但这里有几个坑我觉得挺难处理的:
抽象层级怎么定? 用户喜欢寿司、拉面、披萨,系统应该总结成"喜欢食物"还是"喜欢日料"?这个自动决定起来很微妙。
什么时候触发压缩? 可以定期做(每积累 N 条记忆压缩一次),也可以基于相似度触发(当一组记忆在 embedding space 里形成 cluster 时自动压缩)。两种都有取舍。
信息丢失问题最致命。 比如用户喜欢寿司,但对贝壳类过敏。如果被压缩成"用户喜欢海鲜",这就完全错了。所以压缩这一步必须非常谨慎,不能简单粗暴地 summarize。
记忆演化:人会变,记忆也得跟着变
人的状态不是静态的。2023 年用户住在纽约,2024 年搬到了西雅图。系统必须理解纽约是过期信息,西雅图才是当前状态。
但 vector store 天生是 append-only 的,它不管你是新信息还是旧信息,只管往里加。
真正的记忆系统需要的是一个状态机,而不是一个追加日志。
这里面有几个关键问题:
事实更新。 用户以前最喜欢 Python,后来说"我转 Rust 了"。系统应该做的是更新记忆,而不是简单地加一条新的。
时间维度。 记忆通常需要带上时间戳、置信度和有效时间窗口。比如"用户住在纽约(2019-2024)"、"用户住在西雅图(2024-至今)",这样系统才能正确推断当前状态。
长期记忆和短期记忆要分开。 "用户喜欢寿司"是长期稳定的,"用户正在东京旅行"是短期信息。认知科学里把这分成情景记忆(Episodic Memory)和语义记忆(Semantic Memory),AI 记忆系统也需要类似的分层。
记忆冲突:这可能是最头疼的部分
记忆互相矛盾的情况比想象中常见。
一条记忆说"用户是素食主义者",另一条说"用户喜欢牛排"。系统得做出判断:到底哪个对?
冲突的来源有好几种:用户行为真的变了(以前吃素现在不了)、用户表达不一致(一会说讨厌 Python 一会又说 Python 真香)、或者模型自己推断错了。
目前常见的解决策略:
- 时间优先(Latest Wins):最新的信息覆盖旧的。简单直接,但不总是对——有些旧信息可能仍然有效
- 置信度机制:给记忆打分,用户明确说的话置信度高,LLM 推断出来的置信度低,冲突时选高的
- 来源追踪:记录每条记忆的来源(用户直接陈述、模型推断、系统生成),冲突时优先信任用户亲口说的
- 多版本记忆:保留多个时间版本,比如"用户是素食主义者(2018-2023)"和"用户吃肉(2023-至今)",在不同时间上下文里用不同的记忆
一个更完整的架构长什么样
如果把这些问题都考虑进去,AI Memory 系统的架构大概是这样:
原始交互
│
▼
记忆提取(LLM)
│
▼
结构化记忆存储
│
├── 压缩(compaction)
├── 演化(evolution)
└── 冲突解决(conflict resolution)
│
▼
检索层
其中记忆存储可能需要用到 Graph Database、Document Store 甚至关系型数据库,而不仅仅是 vector database。
因为说到底,AI Memory 要解决的不是相似度检索,而是知识表示、知识演化和知识冲突解决。这更像是在建一个知识图谱 + 数据库系统 + 推理引擎的组合体。
对搭 Agent 的实际启示
目前像 mem0 这类项目已经开始探索记忆提取、记忆打分、记忆更新这些方向,但整体来说还是第一代方案。
如果你现在在做需要长期记忆的 Agent 产品,我的建议是:不要只依赖 vector store 做记忆。至少在设计阶段就把记忆的更新和冲突处理考虑进去,哪怕初期实现简单一些,架构上要留出空间。
真正成熟的 AI 记忆系统,最终会更接近一个持续演化的知识系统——能压缩经验、更新事实、解决矛盾。而这背后最核心的问题其实就一个:我们到底应该怎么表示"记忆"本身。这个问题没想清楚,后面怎么做都是在打补丁。