Paper

EverMemOS 论文速读:把 LLM Agent 的长期记忆做成『海马体级』的操作系统

6 min read ·

💡 一句话总结:长期记忆不是『把过去存下来』,而是『让过去在合适的时候被想起来』。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 包含:

事实抽取用了一个 13B 级的小 LLM;Foresight 信号用一个二分类微调模型 + 规则后处理。两者都是异步的,不阻塞对话主链路。

阶段 2:Semantic Consolidation(语义巩固)

这是 EverMemOS 最有想法的一层。系统不是把 MemCell 简单堆在一起,而是按”主题”聚合成 MemScene:

这个机制让记忆系统能处理”用户状态演化”。例如用户先说『我做 Athena 项目』,三个月后说『我换到 Lyra 项目了』,系统不会两条都保留导致 Agent 困惑,而是把 Athena scene 的状态置为 archived,Lyra 成为 active

阶段 3:Reconstructive Recollection(重构式回忆)

这一阶段是 retrieval-time 的逻辑。Query 进来后:

  1. 用 Query embedding 先在 MemScene 索引上召回 top-K scene
  2. 对每个候选 scene,把『当前共识摘要』加进 context
  3. 同时检查 Foresight signal,主动 pull 进任何 trigger 命中的 cell(即使 query 表面没匹配上)
  4. LLM agent 决定要不要进一步展开某个 scene 的细节 cell

第 3 步是关键。回到开头那个花生过敏的例子:Foresight signal ("晚餐|餐厅|食物推荐", 30天, "饮食偏好检索") 会在『推荐餐厅』query 上被触发,过敏 fact 主动加进 context,Agent 不会再推 Pad Thai。

实验结果与消融

论文在三个基准上做了评估:

基准任务类型之前 SOTAEverMemOS
LongMemEval长程对话事实检索58.3% (A-MEM)64.1%
LoCoMo长程对话推理71.2% (MemGPT)78.5%
PersonaMem v2用户画像保持62.7% (RAG baseline)74.3%

消融实验里:

三层贡献排序 Scene > Foresight > Cell。但有个有意思的子集分析:在『时间敏感问题』(如『3 周前我说过什么』)上,Foresight 的收益从 +5.5 拉到 +11,说明这个机制对”该想起来但被埋了”这类长尾问题特别有效。

和近期相关工作的对比

A-MEMAgeMemEverMemOS
记忆结构平铺 note + Zettelkasten 链接平铺 + 操作日志两级层级(Cell + Scene)
检索控制被动语义相似LLM agent 主动调用 toolForesight 主动 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 签发条件。

几个开放问题

论文坦白了三个未解决的问题:

  1. 冷启动:新用户前 10 轮对话 scene 还没形成,记忆系统等同于 RAG baseline。论文建议用『种子档案模板』缓解,但效果有限。
  2. 跨用户隐私:MemScene 抽象层包含『当前共识』,如果 LLM 提供商训练数据沾染了这些 scene,可能泄露用户画像。论文建议本地化部署 scene store。
  3. 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 给的答案不一定唯一,但思路值得抄。

Frequently asked questions

EverMemOS 和 A-MEM、AgeMem 这些『agentic memory』论文有什么本质区别?
A-MEM 强调 Zettelkasten 式的动态索引和链接,每条记忆是平的 note;AgeMem 把记忆操作(store/retrieve/update/summarize)当成 agent 工具暴露给 LLM,由 policy 决定调用时机。EverMemOS 的差异在两个层级化(hierarchy):MemCell 是『一次对话片段』的原子单元,MemScene 是『某个主题在用户身上的演化轨迹』的高阶聚合,检索时不是平铺搜 cell,而是先定位 scene 再展开。第二个差异是引入了 Foresight signal——记忆里显式预存『下次什么时候可能用到这条信息』的时间窗信号,让 retrieval 不再是被动 query。
MemCell 里的 atomic fact 和 Foresight signal 具体是什么?怎么抽取?
atomic fact 是从单轮对话里抽出来的最小可独立验证的事实陈述,例如『用户在 2026-04-15 提到自己对花生过敏』。论文用一个小 LLM(13B 级)做事实抽取,输出 (subject, predicate, object, timestamp, confidence) 五元组。Foresight signal 是另一类元数据,结构是 (trigger_pattern, time_window, expected_use_case),比如『当对话出现「晚餐推荐」且距离上一次询问超过 7 天时,调出过敏档案』。Foresight 的训练数据来自人类标注 + 模型自蒸馏,论文有 1.2 万条种子样本。
MemScene 是怎么从 MemCell 聚合出来的?聚类还是图?
都不是,是『topical chain』。系统跑一个轻量的语义聚类(HDBSCAN over sentence embedding)拿候选 cluster,再让 LLM 做语义合并和拆分,最终每个 MemScene 对应一个主题(如『用户的饮食偏好』『用户的工作项目 Athena』),内部按时间序保存 cell 引用,并维护一个『当前共识状态』摘要。当新 cell 与旧 scene 冲突(用户说『我已经不在 Athena 项目了』),LLM 会判定是更新共识还是分裂出新 scene。这个机制让 EverMemOS 能处理用户状态演化,而不是机械地累积事实。
在 LongMemEval 上拿到 SOTA 的核心收益来自哪一层?
论文做了三组消融。只保留 MemCell(关闭聚合)时 EM 得分 47.2%;加上 MemScene 聚合升到 58.6%;再加 Foresight 引导的主动检索升到 64.1%(SOTA)。三层贡献排序是 Scene > Foresight > Cell 抽取本身,但 Cell 是基础。值得注意的是在『时间敏感问题』子集(如『3 周前我说过什么』)上,Foresight 收益最大(+11 个点),因为它把『何时该回忆』编进了记忆本身。
如果我要在生产 Agent 里抄 EverMemOS 的思路,最低成本怎么做?
三步走。第一步(1 天):每轮对话后异步抽 atomic fact 入库,单独 collection,每条带 timestamp 和 confidence。第二步(1-2 周):每天跑一次 batch consolidation,把同主题 fact 聚成 scene 摘要,retrieval 时优先查 scene 命中后再 fan-out 到 cell——能拿到论文 60% 的收益。第三步(1-2 月):训练 Foresight 标注器给 fact 打 (trigger, time_window) 标签,让 retrieval 变成 push 模式。建议直接抄 EverMind-AI/EverOS 仓库开源实现。
// next.txt ›

Some outbound links in this post are affiliate links — see disclosure.