MemForest:基于分层时序索引的高效智能体记忆系统 MemForest: An Efficient Agent Memory System with Hierarchical Temporal Indexing
用分层时序树索引 + 并行分块抽取重写 LLM 智能体长时记忆系统。
前置知识
LLM 智能体记忆系统
为 LLM 智能体维护长期状态的子系统,把累积的对话转化为可检索、可更新的记忆。它通常包含抽取(把对话转为事实)、检索(按查询召回相关记忆)和维护(合并/重写/重组已有记忆)三个环节。代表性系统如 Mem0、MemoryOS、EverMemOS、LightMem、Zep 等。
MemForest 的所有设计取舍都围绕「记忆抽取-维护-检索」这条流水线展开,不了解这三段式结构就抓不住它的优化切入点。
向量检索与 Embedding-based RAG
把文本/事实编码成稠密向量,按余弦相似度在向量数据库中做最近邻检索,是 RAG(Retrieval-Augmented Generation)的核心机制。语义相似度强但不能编码时间顺序、前后继关系。
本文指出「embedding 相似性 ≠ 时序关系」,是它从平面向量池切到分层时序树的根本动机。
分层树状索引(如 RAPTOR、GraphRAG)
把文档按语义层级组织成树:叶子保存原文/原始 chunk,内部节点对子节点做摘要/聚合,根节点保存全局概要。检索时从粗到细下钻,兼顾全局召回与细粒度证据。RAPTOR、GraphRAG 是典型代表。
MemTree 的设计直接借鉴此类分层索引,但显式加入了「时间顺序」语义,是它的关键扩展。
写优化的数据结构(LSM-tree、B-tree)
传统数据库中应对高写入吞吐的核心结构。LSM-tree 通过把随机写转为顺序追加+后台合并,避免反复重写热状态;B-tree 通过节点分裂保持树高有界,使单点更新成本为 $O(\log N)$。
MemForest 把「避免热状态反复重写」这一思想从键值存储迁移到 LLM 记忆维护,是其 $O(\log N)$ 维护复杂度的依据。
时序作用域(temporal scope)与状态演化
对某个会随时间变化的目标(如用户居住地、健康状态、项目进度),用一个「作用域」聚合所有时间锚定的事实。状态型作用域需要保留历史变迁,而不只是当前状态快照。
MemForest 引入 temporal scope 作为抽象单位,并用 MemTree 对其做显式时序索引,是它与「最新状态摘要」类系统最本质的区别。
研究动机
现有 LLM 智能体记忆系统在长程部署中存在两个结构化瓶颈。**写入路径严重串行化**:Mem0 对每条新证据先检索旧记录再让 LLM 决定增/删/改,MemoryOS 走有序晋升+热状态重写,EverMemOS 流式边界判定+逐单元合并,LightMem 走缓冲区+全局整合——几乎都把 LLM 推理放在写入关键路径上,每次新会话到来都要排队执行串行 LLM 调用。**维护粒度过粗**:Mem0/MemoryOS/EverMemOS/LightMem 都把记忆维护成可变 profile/summary,遇局部新证据就重写整段状态,维护成本随已积累的 $N$ 增长而非随新证据 $M$ 增长(Table 1)。MemoryOS 单条 queryable 记忆构造平均需 2439.9s(30B),EverMemOS 1048.8s。LongMemEval-S 中 temporal-reasoning 占 26.6%、multi-session 占 26.6%;LoCoMo 中 temporal 类高达 42.3%。纯最新摘要或纯平面事实库都难以同时支持当前、历史与迁移查询。
本文的目标是把长程智能体记忆重新框定为 write-efficient 的时序数据管理问题,目标有三个:(1) 低延迟记忆构造——新会话经写入路径后能快速可查询,延迟与新证据量 $M$ 和受影响作用域大小相关,而不是与累积记忆总量 $N$ 相关;(2) 时序作用域保真——保留时间局部证据、历史状态和状态迁移,不在压缩中丢失中间态;(3) 局部化维护——写入只影响被触及的作用域和派生访问结构,避免全量重写。最终在 LongMemEval-S 上达到 79.8% pass@1(30B 设置下所有有状态基线中最强),同时把写入吞吐推到约 6× 于 EverMemOS。
与已有工作不同的是,已有工作大多单独优化「抽取质量」「检索质量」「压缩效率」中的某一项:Mem0 强调抽取决策但串行;MemoryOS 强调分级存储但要重写 profile;LightMem 强调压缩但仍走全局合并;MemPalace 直接追加原文不维护时序结构;Zep/EverMemOS 引入时序图但写入仍是 per-unit 串行合并。MemForest 的独特切入是把「写入路径的工程瓶颈」与「时序语义保真」这两个被分别处理的问题统一到一个数据结构里:用 canonical fact 作为稳定写入单元 + MemTree 作为作用域级时序索引,把并行抽取和局部维护绑定到同一个分层时序结构上。这一视角借鉴了数据库中 LSM-tree「避免热状态反复重写」的精神,但把维护对象从键值数据换成 LLM 派生记忆。
核心方法
MemForest 整体直觉类比图书馆编目:每来一批新书,先并行让多个管理员摘录要点,再规范成统一卡片,按主题/作者/卷期分到对应目录树,卡片按时间顺序插入叶子节点,每张卡片只更新所在分支,读者先按总目录找相关子树,再沿时间摘要由粗到细下钻。技术路线:会话切成长度 $b=2$ 轮的 chunk 并行抽取事实;事实归一化为带时间锚、实体、主题标签的 canonical fact;按 session/entity/scene 三种作用域路由到 MemTree 叶子;MemTree 是 $k$-ary 平衡树(默认 $k=10$),叶子按时间顺序存原始事实,内部节点摘要区间,根节点保存粗粒度概要。写入只标脏叶到根的祖先节点,脏节点按层级并行刷新;查询先按 root embedding 召回候选树,再在树内由粗到细下钻。
MemForest 相对已有方法的本质区别在于「把抽取并行化和维护局部化绑到同一个时序索引结构里」。Mem0/MemoryOS/EverMemOS/LightMem 都把抽取和维护设计成「针对可变 profile/summary 的串行 LLM 决策」,导致关键路径依赖累积状态;MemPalace 走另一极端,直接追加原文不做维护,避开了写瓶颈但失去时序结构。MemForest 引入两个核心创新:(1) canonical fact 作为稳定写入单元——并行抽取会产出碎片化、重复的事实,但 canonical fact 不需要立即决定如何融入「全局记忆」,可以被路由、合并、删除而不用重写整段累积状态;(2) MemTree 作为作用域级时序索引——把作用域 $\sigma$ 物化成时间有序的 $k$-ary 平衡树,叶子保留 time-local 证据,内部节点摘要区间,根节点给出 coarse 状态。新证据到来只影响该叶到根的 $O(\log N)$ 路径,且派生摘要/embedding 在受影响路径之外无需重算,同时解决「串行抽取瓶颈」和「状态大小依赖」两个问题。
方法步骤详情
**写入路径**:会话按 $b=2$ 轮切分为 chunk 并行抽取事实,candidates 归一化、去重、合并形成 canonical fact;按 $R_t=\{(\sigma,r)\}$ 路由到 session、entity、scene 三族作用域。按 Algorithm 1 执行 Local MemTree Update:按时间排序逐 fact 创建叶子,MarkDirtyAncestors 把叶到根的祖先标脏,脏节点按层级 bottom-up 刷新。**查询路径**:forest recall 由 root recall 和 fact-to-tree recall 合成候选集;tree browse 从根下钻到叶级证据,可选 embedding-only 或 LLM-guided 模式再叠 planner。**生命周期维护**:merge 对齐 canonical fact 和 scope assignment 再合并子树;deletion 用 session registry 移除并标脏祖先;migration 直接合并已物化记忆森林避免重放 $D_T$。
技术新颖性
技术新颖性主要在三方面。第一,**canonical fact + 作用域路由**让并行抽取碎片化和「是否合并到现有记忆」的串行决策解耦,把抽取 LLM 调用从「必须串行判定的写路径」中解放出来,这一点 Mem0/MemoryOS 没有做到。第二,**MemTree 把「时序保真」与「局部维护」绑到同一棵 $k$-ary 平衡树**:用叶子时序+内部区间摘要+根粗粒度概要同时表达 predecessor/successor/transition 关系和层级化检索,而 RAPTOR 这类分层检索不显式建模时间顺序,LSM-tree 这类写优化结构不保留历史细节,MemForest 是两者在 LLM 记忆场景下的融合。第三,**dirty-path lazy refresh + level-parallel flush** 把维护成本从「累积记忆大小」降到「受影响路径+不同脏节点数」,并允许同层节点跨树并行刷新,从而在大树规模下加速比反而上升(图 6c)。这三个点共同支撑了 $O(\log N)$ 的写入关键路径深度。
实验结果
**写入路径+时延**:LongMemEval 30B 下 MemForest 把单条 queryable 记忆构造时间从 MemoryOS 2439.9s 压到 178.0s(13.7× 加速),对 EverMemOS 1048.8s 达 5.9×;planner-guided 4.60s,embedding-only 2.19s。**LongMemEval-S**:MemForest 79.8% pass@1 全场领先,multi-session 73.7%、temporal-reasoning 79.7% 优势最明显。**LoCoMo**:MemForest 68.4% 仅落后 EverMemOS 69.6% 1.2 个百分点,open-ended 65.6% 反超;multi-hop 67.3% 弱于 86.6%。**迁移+消融**:合并多份 MemForest 比顺序重写快 2.42×–2.70×;entity+scene 86.7%;browse flat-10 78.3%、emb 85.0%、llm 88.3%、llm+planner 90.0%。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| LongMemEval-S (Qwen3-30B, overall) | pass@1 准确率 | 79.8% | EverMemOS 66.2% | +13.6 个百分点,6.9× 写入吞吐优势 |
| LongMemEval-S (Qwen3-30B, multi-session) | pass@1 准确率 | 73.7% | EverMemOS 62.1% | +11.6 个百分点 |
| LongMemEval-S (Qwen3-30B, temporal-reasoning) | pass@1 准确率 | 79.7% | EverMemOS 52.5% | +27.2 个百分点 |
| LongMemEval-S (Qwen3-4B, overall) | pass@1 准确率 | 70.4% | EverMemOS 56.2% | +14.2 个百分点 |
| LongMemEval (写入路径, 30B) | 端到端构造时间/问题 | 178.0s (1.143M tokens) | MemoryOS 2439.9s | 13.7× 加速,~6× 于 EverMemOS |
| LoCoMo (Qwen3-30B, overall) | pass@1 准确率 | 68.4% | EverMemOS 69.6% | -1.2 个百分点(第二强) |
| LoCoMo (Qwen3-30B, open-ended) | pass@1 准确率 | 65.6% | EverMemOS 62.5% | +3.1 个百分点 |
| LongMemEval 60-question 消融集 (30B, browse) | pass@8 | llm+planner 90.0% / emb 85.0% | flat-10 78.3% / root-only 73.3% | 时序树 browse +11.7 / +16.7 |
| LongMemEval 迁移合并 ($N=5\text{-}6$) | 迁移速度比 | 2.42×–2.70× | 顺序重写 1.0× | 峰值 2.70×,状态规模差异 <1% |
| LongMemEval 60-question 消融集 (30B, tree-family) | pass@8 | entity+scene 86.7% | entity 63.3% / scene 81.7% / session 85.0% | 多作用域互补 +5.0 至 +23.4 个百分点 |
局限与改进
作者承认四点局限:(1) **token 数高于部分基线**——MemForest 30B 下 1.143M tokens 高于 Mem0 294.1K 和 MemoryOS 527.8K,对 API 成本敏感场景不友好。(2) **LoCoMo 多跳组合弱于 EverMemOS**——30B multi-hop 67.3% vs 86.6%,缺 agentic retrieval + 证据充分性检查。(3) **Adversarial 类问题难**——LoCoMo 30B adversarial 仅 35.9%。(4) **chunk 与 $k$ 是工程权衡**——$b\geq 8$ fidelity 退化(Ent-GR 95→72),$k=10$ 为经验值,$k\approx 16$ 后 capacity 出现 soft knee。我的观察:(a) 缺少跨作用域矛盾的系统级冲突解决;(b) placement map 与 scope routing 由 LLM/启发式托底;(c) 仅覆盖英文,未验证中文或多语种下 canonical fact 归一化的鲁棒性。
独立分析的弱点
**弱点 1:依赖 LLM 抽取质量**——抽取漏掉关键事实或合并错误时下游 MemTree 不会自动恢复,Mem0/MemoryOS 有维护阶段重读旧记录的兜底。改进:在 canonical fact 层引入弱监督/规则校验。**弱点 2:planner-guided 查询时延偏高**——30B 下 4.60s 对实时聊天偏慢,embedding-only 准确率略低(78.4% vs 79.8%)。改进:按查询类型自适应选模式。**弱点 3:multi-hop 弱于 EverMemOS**——browse 主要「每棵候选树内层次化下钻」,缺跨树证据合成。改进:forest recall 后增加 cross-tree evidence composition。**弱点 4:迁移合并仅验证 $N\leq 8$**;**弱点 5:可能形成热点实体**——所有关于同一实体的 fact 路由到同一 entity 树。改进:按时间窗或话题切分 entity 树。
未来方向
作者未单列未来工作,但结合全文可延展几个方向。第一,**冲突解决与版本化**:把 temporal scope 升级为多版本 B-tree 式的状态机,显式记录 supersession 和 contradiction,并支持时间点快照查询。第二,**跨实例/跨用户的记忆共享**:Table 10 的 migration 已展示森林级合并能力,可扩展到 expert memory transfer 和分布式记忆构造场景。第三,**自适应操作点**:根据 chunk 大小、$k$、planner 开销的 empirical 数据,让系统在线学习每个 scope 的最优参数。第四,**结合 EverMemOS 的 agentic retrieval**:把 MemForest 的「低写入成本 + 时序结构」与 EverMemOS 的「查询时多跳证据合成」组合,可能补齐 multi-hop 弱点。第五,**多模态记忆**:canonical fact 可扩展到 image/voice 等多模态 anchor;第六,**可解释性**:基于 MemTree 路径生成 provenance 图。
复现评估
代码已开源:https://github.com/Concyclics/MemForest。**算力需求**:每模型用专用 NVIDIA H100 GPU 跑 vLLM 0.18.0 + FlashAttention,同时跑 Qwen3-4B-Instruct-2507 和 Qwen3-30B-A3B-Instruct-2507;评测用 DeepSeek-V3.2;30B 下单实例 ≈ 178s,单卡 H100 即可复现。**数据**:LongMemEval-S(500 题 6 类)和 LoCoMo(10 长对话 1986 题 5 类)公开,附录 A 给 judge prompt 模板。**实现难度**:中等偏上——并行 chunk extraction、canonicalization、MemTree 维护、dirty-path refresh、三种 browse 模式都需工程实现,论文给出 Algorithm 1。**已知风险**:vLLM 0.18.0 版本敏感;DeepSeek-V3.2 API 需自行保证;canonical fact 抽取 prompt 需参照附录 A。
论文图表
(a) 拆解端到端每问题延迟的来源,显示 extraction + maintenance(写入路径)占绝对主导,retrieval(读取)只占小部分。(b) 在 accuracy 与 throughput 二维平面上的位置:MemForest 把 efficiency-accuracy 边界推到右上方,约 6× 于 EverMemOS 的写入吞吐,同时 pass@1 最高。
这是全文核心论点「写入路径才是瓶颈」的证据基础,决定了后续章节为何要并行化抽取并局部化维护。