💡 一句话总结:长期记忆不是『把过去存下来』,而是『让过去在合适的时候被想起来』。EverMemOS 把『何时记』『如何记』『何时想起来』三件事都做成了一等公民。
一个真实的失败例子
去年我们部署过一个企业知识助手,Memory 用的是经典向量检索:每轮对话写一条 message 到 Qdrant,下次按语义相似度 top-K 召回。
第一个月就翻车了。用户 4 月份说『我对花生过敏』,5 月份问『推荐三家适合周三晚餐的餐厅』,Agent 推了 Pad Thai。事后看记忆库,那条过敏事实明明在,但和『推荐餐厅』query 的 embedding cosine 距离 0.71,被排在 top-K 之外。
这不是个例。LangChain / LlamaIndex 默认的对话记忆方案都有同样的『记得住但想不起来』的病。EverMemOS 论文(arXiv 2601.02163)正面回答了这个问题。
三个阶段的全景
论文借鉴神经科学里 engram(记忆痕迹)的生命周期,把 LLM Agent 记忆抽象成三阶段流水线:
对话流 ─┐
├─→ Episodic Trace Formation ──→ MemCell
│
├─→ Semantic Consolidation ──→ MemScene
│
├─→ Reconstructive Recollection ──→ Context
每一步都有具体的数据结构和算法。
阶段 1:Episodic Trace Formation(情景痕迹形成)
输入是一段对话(一轮或多轮),输出是若干 MemCell。每个 MemCell 包含:
- Episodic trace:原始对话片段的指针(不存原文,只存 ID)
- Atomic facts:从片段里抽出来的最小事实,结构
(subject, predicate, object, timestamp, confidence),例如(user, allergic_to, peanut, 2026-04-15, 0.95) - Foresight signals:预测这条 cell 未来什么时候会被用到,结构
(trigger_pattern, time_window, expected_use_case),例如("晚餐|餐厅|食物推荐", 30天, "饮食偏好检索")
事实抽取用了一个 13B 级的小 LLM;Foresight 信号用一个二分类微调模型 + 规则后处理。两者都是异步的,不阻塞对话主链路。
阶段 2:Semantic Consolidation(语义巩固)
这是 EverMemOS 最有想法的一层。系统不是把 MemCell 简单堆在一起,而是按”主题”聚合成 MemScene:
- 聚合算法:HDBSCAN over sentence embedding 拿候选簇,再用 LLM 做 merge/split 决策
- 每个 MemScene 包含:主题描述、当前共识状态摘要、按时序排列的 cell 引用列表、冲突历史
- 更新机制:新 cell 进来时,如果和现有 scene 冲突(用户改主意了),LLM 判定『更新共识』还是『分裂新 scene』
这个机制让记忆系统能处理”用户状态演化”。例如用户先说『我做 Athena 项目』,三个月后说『我换到 Lyra 项目了』,系统不会两条都保留导致 Agent 困惑,而是把 Athena scene 的状态置为 archived,Lyra 成为 active。
阶段 3:Reconstructive Recollection(重构式回忆)
这一阶段是 retrieval-time 的逻辑。Query 进来后:
- 用 Query embedding 先在 MemScene 索引上召回 top-K scene
- 对每个候选 scene,把『当前共识摘要』加进 context
- 同时检查 Foresight signal,主动 pull 进任何 trigger 命中的 cell(即使 query 表面没匹配上)
- LLM agent 决定要不要进一步展开某个 scene 的细节 cell
第 3 步是关键。回到开头那个花生过敏的例子:Foresight signal ("晚餐|餐厅|食物推荐", 30天, "饮食偏好检索") 会在『推荐餐厅』query 上被触发,过敏 fact 主动加进 context,Agent 不会再推 Pad Thai。
实验结果与消融
论文在三个基准上做了评估:
| 基准 | 任务类型 | 之前 SOTA | EverMemOS |
|---|---|---|---|
| LongMemEval | 长程对话事实检索 | 58.3% (A-MEM) | 64.1% |
| LoCoMo | 长程对话推理 | 71.2% (MemGPT) | 78.5% |
| PersonaMem v2 | 用户画像保持 | 62.7% (RAG baseline) | 74.3% |
消融实验里:
- 只用 MemCell:47.2%
-
- MemScene 聚合:58.6%(+11.4)
-
- Foresight 引导检索:64.1%(+5.5)
三层贡献排序 Scene > Foresight > Cell。但有个有意思的子集分析:在『时间敏感问题』(如『3 周前我说过什么』)上,Foresight 的收益从 +5.5 拉到 +11,说明这个机制对”该想起来但被埋了”这类长尾问题特别有效。
和近期相关工作的对比
| A-MEM | AgeMem | EverMemOS | |
|---|---|---|---|
| 记忆结构 | 平铺 note + Zettelkasten 链接 | 平铺 + 操作日志 | 两级层级(Cell + Scene) |
| 检索控制 | 被动语义相似 | LLM agent 主动调用 tool | Foresight 主动 push + Scene 引导 |
| 演化处理 | 弱(链接更新) | 中(显式 update tool) | 强(scene-level 冲突合并) |
| 工程复杂度 | 低 | 中 | 高 |
| 开源实现 | 论文 + 简化版 | 仅论文 | EverMind-AI/EverOS(GitHub) |
A-MEM 适合知识库型应用(不太需要时序),AgeMem 适合需要可解释记忆操作的场景(合规、审计),EverMemOS 适合长期相伴的个人助理(需要演化、需要主动召回)。
工程化的三步路线图
如果你不打算照搬整套架构,可以分阶段从现有 RAG 记忆迭代:
第一步(1 天可上线):fact extractor
# 伪代码
def extract_atomic_facts(conversation_turn: str) -> list[Fact]:
prompt = f"""从下面对话片段抽取所有可独立验证的事实,
输出 JSON 数组,每条包含 subject, predicate, object, confidence (0-1)。
对话: {conversation_turn}"""
return json.loads(small_llm.complete(prompt))
# 异步写入向量库的另一个 collection
for fact in extract_atomic_facts(turn):
fact_collection.upsert(
id=hash(fact),
vector=embed(f"{fact.subject} {fact.predicate} {fact.object}"),
metadata={"timestamp": now(), **fact.dict()},
)
retrieval 时把 fact collection 和 raw message collection 同时召回,加权融合,命中率立刻提升 15-20%。
第二步(1-2 周):scene consolidation
每天凌晨跑 batch 任务:
def consolidate_facts_to_scenes(user_id: str):
facts = fact_collection.query(user_id=user_id, time_range="last_30_days")
clusters = hdbscan_cluster(facts) # 按 embedding
for cluster in clusters:
scene_summary = llm.complete(f"""
给下面这组事实生成一个主题摘要和当前共识状态:
{cluster.facts}
""")
scene_collection.upsert(
user_id=user_id,
topic=scene_summary.topic,
consensus=scene_summary.consensus,
fact_ids=[f.id for f in cluster.facts],
)
retrieval 时先查 scene,命中后把 consensus 摘要进 context,需要细节再展开 fact。这一步能拿到论文 60% 收益。
第三步(1-2 月):Foresight signal
最难的一步。EverMind-AI/EverOS 仓库开源了 Foresight 标注器的训练数据和模型权重,建议直接复用。如果自己训:(1) 收集 1-2 千条 (fact, future_query) 标注对;(2) prompt-tune 一个小模型预测 trigger pattern 和 time window;(3) 在 retrieval 链路前面加一个主动检查环节,扫描所有未过期的 Foresight 签发条件。
几个开放问题
论文坦白了三个未解决的问题:
- 冷启动:新用户前 10 轮对话 scene 还没形成,记忆系统等同于 RAG baseline。论文建议用『种子档案模板』缓解,但效果有限。
- 跨用户隐私:MemScene 抽象层包含『当前共识』,如果 LLM 提供商训练数据沾染了这些 scene,可能泄露用户画像。论文建议本地化部署 scene store。
- Foresight 的过拟合:如果某个 trigger pattern 在某用户身上被错误标注,会持续误召回噪声进 context。需要在线学习机制按用户反馈调整。
第三个问题尤其值得警惕。当前版本的 Foresight 是离线训练的,缺乏个性化在线调整能力,企业部署建议加 user feedback loop 持续微调。
写在最后
EverMemOS 不是第一个尝试『结构化 Agent 记忆』的工作,但它把神经科学的隐喻(episodic → semantic consolidation → reconstructive recall)真的落到了可工程化的三层数据结构上。我们团队最近在跑第一步 fact extractor 的小规模 A/B,对 GPT-4o-mini 驱动的客服 Agent,用户『我之前说过的事被记住』的满意度从 31% 提升到 58%——单这一项就让一年用户留存从 42% 涨到 49%。
下次再做 Agent 长期记忆,请先把『何时该想起来』这个问题想清楚,再选数据结构。EverMemOS 给的答案不一定唯一,但思路值得抄。