文章目录


前言

一个可靠的 Agent 记忆系统,需要同时具备两种看起来有些矛盾的能力:

  • 快速捕捉当前交互中不断出现的新信息;
  • 保护已经形成的长期知识,避免被短期噪声污染。

现有的记忆系统往往很难同时做好这两点。

一类方法采用统一的流式记忆结构,把新的对话内容直接追加或合并到正在使用的记忆中。这种方法更新速度快,也比较适合持续交互,但由于新信息可以直接进入长期记忆,容易带来记忆污染、记忆丢失和语义漂移。

另一类方法采用离散的结构化记忆,把信息组织成知识图谱或固定结构。这类方法能够提供相对稳定的知识表示,但更新成本较高,而且容易把连续的对话过程切割成互相分离的事实片段,难以捕捉用户状态和主题随时间发生的连续变化。

这篇论文提出了 GAM:Hierarchical Graph-based Agentic Memory,试图在这两类方法之间取得平衡。

GAM 的核心思想是:

不让尚未稳定的对话内容直接修改全局长期记忆,而是先在局部事件图中进行缓冲;只有检测到语义边界后,才把一个相对完整的叙事单元固化到全局主题图中。

具体来说,GAM 将 Agent 的记忆生命周期划分为三个相互配合的阶段:

  1. 情节缓冲 Episodic Buffering
    将实时对话写入局部的事件演进图,捕捉当前对话中的时间和因果关系,同时与长期记忆隔离。

  2. 语义固化 Semantic Consolidation
    当系统检测到主题发生变化时,将缓冲区中的完整语义单元总结并写入全局主题关联网络。

  3. 图引导的多因素召回 Graph-Guided Multi-Factor Retrieval
    先在主题层定位相关语义,再沿跨层连接下钻到具体事件,并结合时间、置信度和角色信息进行重排。

简单来说,GAM 不是让长期记忆随着每一轮对话持续变化,而是:

先在局部记忆中快速记录,等一个话题相对完整后,再统一整理进长期记忆。


零、论文基本信息

  • 论文名称GAM: Hierarchical Graph-based Agentic Memory for LLM Agents
  • 发表平台:ACL 2026 Long Papers
  • 作者信息
    • Zhaofen Wu,Zhejiang University
    • Hanrong Zhang,University of Illinois Chicago
    • Fulin Lin,Zhejiang University
    • Wujiang Xu,Rutgers University
    • Xinran Xu,Zhejiang University
    • Yankai Chen,MBZUAI / McGill University
    • Henry Peng Zou,University of Illinois Chicago
    • Shaowen Chen,Zhejiang University
    • Weizhi Zhang,University of Illinois Chicago
    • Xue Liu,MBZUAI / McGill University
    • Philip S. Yu,University of Illinois Chicago
    • Hongwei Wang,Zhejiang University

一、这篇论文想解决什么问题?

这篇论文想解决的是 Agent 记忆系统中一个经典的矛盾:

如何同时保持记忆的可塑性和稳定性?

这里的可塑性指的是系统能够快速吸收新信息;稳定性则指已经建立的长期知识不会因为暂时性信息或错误信息而被破坏。

1. 统一流式记忆的问题

很多记忆系统采用统一的流式结构:新的观察结果、用户输入和模型回复不断进入同一个记忆流,并直接参与长期记忆更新。

这种架构的优点是:

  • 写入速度快;
  • 能够快速响应当前对话;
  • 适合持续变化的交互场景。

但是,由于当前对话和长期知识之间缺少明确的写隔离,新信息可能直接污染已经建立的记忆。

论文总结了三个典型风险。

(1)记忆污染 Memory Contamination

一些暂时性、不完整甚至错误的信息,可能过早进入长期记忆。

例如,用户在讨论旅行时说:

我可能会去东京,不过还没有确定。

如果系统立即将它写成:

用户下个月会去东京。

一条尚未确定的计划就被固化成了事实。

(2)记忆丢失 Memory Loss

当图结构不断被新信息修改时,原有记忆节点可能因为连接越来越弱而变得孤立,最终难以被召回。

这里的“丢失”不一定意味着节点真的从数据库中删除,而可能是:

记忆仍然存在,但由于它和其他节点的结构联系过弱,召回阶段几乎不会再访问到它。

(3)语义漂移 Semantic Drift

系统可能把属于不同主题的信息错误地合并到一起,导致原有主题逐渐偏离。

例如:

话题一:用户准备去东京旅行。
话题二:用户正在阅读东京大学的一篇论文。

如果只根据“东京”这个词建立关联,记忆系统可能逐渐把旅行计划和论文研究混为同一个主题。

2. 离散结构化记忆的问题

另一类系统会把信息组织成固定的知识图谱、实体关系或结构化条目。

这类架构的优点是:

  • 知识结构稳定;
  • 适合多跳检索;
  • 便于解释和局部修改。

但它也存在两个明显问题。

(1)缺少实时叙事流

结构化系统通常倾向于把对话拆解成独立事实:

用户喜欢日本。
用户计划去东京。
用户查询京都列车。

这些事实本身可能是正确的,但它们没有保留完整的对话演变过程:

用户最初只计划去东京,后来在讨论行程时才考虑增加京都。

对于长期个性化 Agent 来说,信息是如何演变的,有时和最终事实同样重要。

(2)结构构建成本较高

知识图谱通常需要:

  • 抽取实体;
  • 判断关系;
  • 去重和融合;
  • 维护索引;
  • 更新图结构。

如果每轮对话都进行这些操作,就会引入较高延迟,不适合需要实时响应的开放域对话。

3. GAM 的解决思路

论文 Figure 1 对比了统一流式记忆系统和 GAM。

图1

图源:Wu et al., 2026,Figure 1。

上半部分的统一流式系统会直接更新活跃记忆,因此可能造成记忆丢失和语义漂移。

GAM 则在局部事件图和全局主题图之间增加了一层隔离:

实时对话
→ 先进入局部事件演进图
→ 检测到语义边界
→ 再固化到全局主题关联网络

这样既能快速捕捉当前对话,又能避免暂时性信息不断改写长期知识。


二、相关工作

论文将现有记忆系统大致分为三类。

1. 统一的流式记忆系统

统一流式记忆系统倾向于用一条连续的信息流记录 Agent 的观察和交互。

早期的 Generative Agents 会把观察结果记录在线性记忆流中,再根据相关性、时效性和重要性进行召回。

后续一些系统借鉴操作系统中的内存层级思想,在工作上下文和外部存储之间交换信息,例如:

  • MemGPT:将大模型上下文看作主存,将外部存储看作更大的虚拟内存;
  • MemoryOS:组织短期、中期和长期记忆;
  • Mem0:通过记忆抽取、更新和检索维护长期用户信息;
  • A-Mem:借鉴 Zettelkasten,让记忆节点动态建立链接并实现自进化。

这类方法能够快速编码新信息,但通常缺少严格的写隔离。尚未验证的新信息可能被直接追加或合并进长期记忆,从而带来污染风险。

论文还指出,一些方法采用固定 token 数、时间间隔或轮次数触发更新,但这些触发条件并不能保证当前话题已经表达完整。

2. 离散的结构化记忆架构

离散结构化记忆通过固定知识表示提高记忆稳定性。代表方法包括:

  • GraphRAG:从文档中构建实体关系图和社区摘要;
  • StructRAG:根据任务和数据结构组织检索信息;
  • LightRAG:使用实体层和关系层的双层图结构;
  • G-Memory:面向多 Agent 系统构建层级化组织记忆。

这些方法适合静态知识检索和多跳推理,但对开放域对话而言,存在结构构建成本高、更新延迟大和叙事信息碎片化的问题。

3. 结构化动态记忆

近期一些工作尝试在结构化记忆中加入动态机制,例如:

  • AriGraph:将语义知识图和情节记忆结合,用于文本游戏中的世界状态建模;
  • Zep:通过时序知识图谱支持动态长期记忆。

不过,论文认为 AriGraph 更适合具有明确状态转移的文本游戏,而自然对话中的主题边界通常较模糊;Zep 则更偏向优化时序图检索,没有从架构上分离实时编码和长期固化。

GAM 的区别在于:

它不是单纯构建一个动态图,而是把“实时记录”和“长期固化”拆成两个不同状态,并通过语义事件控制二者切换。


三、GAM 方法总览

GAM 将记忆管理形式化为一个推理阶段的在线决策过程。

它希望在两个目标之间取得平衡:

  • 新信息能够被快速记录;
  • 长期记忆尽量不受干扰。

论文将优化目标写成:

π ∗ = arg ⁡ min ⁡ π E [ ∑ t = 0 T ( C e n c ( t ) + C i n t e r ( t ) ) ] \pi^{*}=\arg\min_{\pi}\mathbb{E}\left[\sum_{t=0}^{T}\left(C_{\mathrm{enc}}^{(t)}+C_{\mathrm{inter}}^{(t)}\right)\right] π=argπminE[t=0T(Cenc(t)+Cinter(t))]

其中:

  • π \pi π 表示记忆管理策略;
  • C e n c ( t ) C_{\mathrm{enc}}^{(t)} Cenc(t) 表示第 t t t 步的记忆编码与更新成本;
  • C i n t e r ( t ) C_{\mathrm{inter}}^{(t)} Cinter(t) 表示新信息对已有长期记忆造成的预期干扰成本。

这个公式表达的意思是:

记忆系统既不能为了保护长期记忆而让每次写入都非常昂贵,也不能为了快速写入而放任新信息污染长期记忆。

不过,系统在在线阶段很难准确计算一条新信息未来会造成多少干扰。

因此,GAM 使用语义漂移作为近似触发信号。为了避免 CSDN 对复杂指示函数公式的兼容问题,这里可以直接写成:

Δ ( G e v e n t ( t ) , G t o p i c ( t ) ) > ϵ \Delta(G_{\mathrm{event}}^{(t)},G_{\mathrm{topic}}^{(t)})>\epsilon Δ(Gevent(t),Gtopic(t))>ϵ 时,令 b t = 1 b_t=1 bt=1,触发语义固化;否则令 b t = 0 b_t=0 bt=0,继续在局部事件图中缓冲当前对话。

其中:

  • G e v e n t ( t ) G_{\mathrm{event}}^{(t)} Gevent(t) 表示当前局部事件图;
  • G t o p i c ( t ) G_{\mathrm{topic}}^{(t)} Gtopic(t) 表示全局主题图;
  • Δ ( ⋅ ) \Delta(\cdot) Δ() 表示二者之间的语义差异;
  • ϵ \epsilon ϵ 表示语义边界阈值;
  • b t b_t bt 表示是否触发语义固化。

通俗地说就是:

当前对话还在围绕原话题展开:
继续写入局部事件图。

当前对话已经进入新话题:
把前一个话题整理并固化到全局主题图。

需要注意的是,实际实现中并不一定真的计算两张复杂图之间的距离。论文使用大模型作为语义判别器,判断当前缓冲区是否出现了主题边界。

GAM 的完整架构如 Figure 2 所示。

GAM架构

图源:Wu et al., 2026,Figure 2。

整个框架可以分成三个部分:

  1. 基于状态的记忆固化
    在情节缓冲和语义固化两个状态之间切换。

  2. 层级图记忆
    用全局主题关联网络保存高层语义,用事件演进图保存细粒度叙事过程。

  3. 图引导召回
    先在主题层定位,再下钻到事件层,最后通过多因素重排返回相关上下文。


四、层级图记忆架构

GAM 将时刻 t t t 的完整记忆表示为:

H t = { G t o p i c ( t ) , G e v e n t ( t ) , S a r c h ( t ) , E c r o s s ( t ) } \mathcal{H}_t=\{\mathcal{G}_{\mathrm{topic}}^{(t)},\mathcal{G}_{\mathrm{event}}^{(t)},\mathcal{S}_{\mathrm{arch}}^{(t)},\mathcal{E}_{\mathrm{cross}}^{(t)}\} Ht={Gtopic(t),Gevent(t),Sarch(t),Ecross(t)}

其中包含四个部分:

  • G t o p i c ( t ) \mathcal{G}_{\mathrm{topic}}^{(t)} Gtopic(t):全局主题关联网络;
  • G e v e n t ( t ) \mathcal{G}_{\mathrm{event}}^{(t)} Gevent(t):当前活跃的事件演进图;
  • S a r c h ( t ) \mathcal{S}_{\mathrm{arch}}^{(t)} Sarch(t):已经完成固化的历史事件图集合;
  • E c r o s s ( t ) \mathcal{E}_{\mathrm{cross}}^{(t)} Ecross(t):主题节点和历史事件图之间的跨层连接。

这四部分承担不同职责:

组成部分 作用
Topic Associative Network 保存稳定的高层主题和主题间关系
Active Event Progression Graph 实时记录当前对话的细节与发展过程
Archived Event Graphs 保存已经结束的历史叙事单元
Cross-layer Edges 连接高层主题与底层原始事件证据

1. Topic Associative Network

全局主题关联网络表示为:

G t o p i c = ( V t o p i c , E t o p i c ) \mathcal{G}_{\mathrm{topic}}=(\mathcal{V}_{\mathrm{topic}},\mathcal{E}_{\mathrm{topic}}) Gtopic=(Vtopic,Etopic)

其中:

  • V t o p i c \mathcal{V}_{\mathrm{topic}} Vtopic 是主题节点集合;
  • E t o p i c \mathcal{E}_{\mathrm{topic}} Etopic 是主题之间的语义关系集合。

主题节点不是单条原始对话,而是从一段完整交互中抽象出来的高层语义主题,例如:

日本旅行计划
论文投稿安排
用户的宠物信息
工作经历变化

主题之间还可以建立关系:

日本旅行计划
└── related_to → 京都交通安排

论文使用大模型语义评分器判断主题之间的关系类型和置信度。这个过程成本较高,因此只在语义固化阶段执行,而不是每一轮实时执行。

2. Event Progression Graph

局部事件演进图表示为:

G e v e n t = ( V e v e n t , E e v e n t ) \mathcal{G}_{\mathrm{event}}=(\mathcal{V}_{\mathrm{event}},\mathcal{E}_{\mathrm{event}}) Gevent=(Vevent,Eevent)

其中:

  • V e v e n t \mathcal{V}_{\mathrm{event}} Vevent 表示事件节点;
  • E e v e n t \mathcal{E}_{\mathrm{event}} Eevent 表示事件之间的时间或因果关系。

一个事件节点可以是:

  • 一条用户输入;
  • 一条模型回复;
  • 一次工具结果;
  • 一个原子交互单元。

例如:

事件 1:用户说下个月想去日本。
事件 2:用户说主要考虑东京。
事件 3:用户询问东京到京都的交通。

事件之间不仅按时间连接,还可以体现对话的逻辑发展:

想去日本
→ 选择东京
→ 考虑加入京都行程

新的事件到来后,局部图的节点集合更新为:

V e v e n t ( t ) = V e v e n t ( t − 1 ) ∪ { e t } \mathcal{V}_{\mathrm{event}}^{(t)}=\mathcal{V}_{\mathrm{event}}^{(t-1)}\cup\{e_t\} Vevent(t)=Vevent(t1){et}

边集合更新为:

E e v e n t ( t ) = E e v e n t ( t − 1 ) ∪ E t e m p ( t ) \mathcal{E}_{\mathrm{event}}^{(t)}=\mathcal{E}_{\mathrm{event}}^{(t-1)}\cup\mathcal{E}_{\mathrm{temp}}^{(t)} Eevent(t)=Eevent(t1)Etemp(t)

其中:

  • e t e_t et 是当前新事件;
  • E t e m p ( t ) \mathcal{E}_{\mathrm{temp}}^{(t)} Etemp(t) 是连接新事件与已有上下文的时间或逻辑边。

这两个公式的含义比较直观:每当新事件到来,系统只需要向局部图中增加一个节点,再补充新事件与已有事件之间的关系边。

这个更新过程主要是追加节点和边,因此速度较快,适合实时对话。

3. 为什么需要两层图?

如果只保存主题摘要,虽然结构清晰,但容易丢掉具体细节。

如果只保存原始事件,又会造成记忆数量过多,召回效率较低。

GAM 通过两层图同时保留:

主题层:
用户正在规划日本旅行。

事件层:
用户先选择东京,后来又询问京都交通。

主题层适合快速定位,事件层适合恢复具体证据。


五、基于状态的记忆固化

GAM 将叙事动态建模成一个有限状态机,在两个状态之间切换:

  1. Episodic Buffering State
  2. Semantic Consolidation State

1. 语义边界检测

系统需要判断当前局部对话和已有主题状态之间的语义差异是否超过阈值。

可以用下面的条件表示:

Δ ( G e v e n t ( t ) , G t o p i c ( t ) ) > ϵ \Delta(G_{\mathrm{event}}^{(t)},G_{\mathrm{topic}}^{(t)})>\epsilon Δ(Gevent(t),Gtopic(t))>ϵ 时,认为当前出现了新的语义边界。

但直接计算复杂图之间的高维语义距离成本较高,也容易受到词汇噪声影响。

因此,论文使用大模型作为语义判别器,判断当前缓冲内容中是否出现主题边界。

这里有一个重要的工程细节:

GAM 并不是每一轮对话都调用大模型检测主题变化。

系统维护一个最大为 2048 tokens 的事件缓冲区,只在以下稀疏事件发生时进行检测:

  • 会话结束;
  • 自然交互暂停;
  • 缓冲区接近溢出。

这样可以避免主题检测本身带来过高开销。

2. 情节缓冲状态

在情节缓冲状态中,系统持续接收当前对话,将每条输入构造成事件节点,并追加到局部事件图中。

这一阶段不会直接修改全局主题图。

可以理解为:

用户:我下个月可能去日本。
用户:主要想去东京。
用户:也许会顺便去京都。

这些内容先被放在一个局部缓冲区中,而不是立即分别写入长期记忆。

这一机制相当于一个严格的写隔离层:

暂时性内容
    ↓
局部事件图
    × 暂不修改全局主题图

这样可以防止一句尚未说完整的话直接影响长期知识。

3. 语义固化状态

b t = 1 b_t=1 bt=1,也就是检测到主题边界时,系统进入语义固化状态。

此时,当前事件图会被转换成一个新的主题节点:

v n e w = { c s u m , c r a w } v_{\mathrm{new}}=\{c_{\mathrm{sum}},c_{\mathrm{raw}}\} vnew={csum,craw}

其中:

  • c s u m c_{\mathrm{sum}} csum 是事件图的高层语义摘要;
  • c r a w c_{\mathrm{raw}} craw 是缓冲区中所有原始事件文本的拼接。

这是一个双粒度表示:

字段 作用
c_sum 支持高层主题定位和抽象推理
c_raw 保存原始细节,避免总结造成信息损失

例如:

c_sum:
用户正在规划日本旅行,主要考虑东京和京都。

c_raw:
用户说下个月可能去日本;
主要想去东京;
又询问是否可以加入京都行程。

这种设计兼顾了“总结便于检索”和“原文便于精确回答”。

4. 将新主题加入全局网络

新主题节点生成后,系统不会和全图中的所有节点逐一比较。

它采用粗到细的候选筛选:

  1. 用向量相似度找到最相近的 Top-5 主题;
  2. 只让大模型分析这几个候选主题;
  3. 判断具体关系类型和置信度;
  4. 置信度超过阈值后再建立边。

全局主题节点集合更新为:

V t o p i c ( t ) = V t o p i c ( t − 1 ) ∪ { v n e w } \mathcal{V}_{\mathrm{topic}}^{(t)}=\mathcal{V}_{\mathrm{topic}}^{(t-1)}\cup\{v_{\mathrm{new}}\} Vtopic(t)=Vtopic(t1){vnew}

全局主题边集合更新为:

E t o p i c ( t ) = E t o p i c ( t − 1 ) ∪ E n e w \mathcal{E}_{\mathrm{topic}}^{(t)}=\mathcal{E}_{\mathrm{topic}}^{(t-1)}\cup\mathcal{E}_{\mathrm{new}} Etopic(t)=Etopic(t1)Enew

其中, E n e w \mathcal{E}_{\mathrm{new}} Enew 表示新主题与已有主题之间通过语义判断建立的关系边。

固化完成后:

  • 当前事件图被放入历史归档集合;
  • 新主题节点与对应历史事件图建立跨层链接;
  • 当前局部缓冲区被清空;
  • 系统重新进入情节缓冲状态。

整个过程可以概括为:

局部事件图
→ 生成摘要和原始文本
→ 创建主题节点
→ 建立主题关系
→ 归档事件图
→ 清空局部缓冲区

六、图引导的多因素召回

GAM 的存储层是分离的,但回答问题时需要同时使用主题和事件信息。

因此,论文提出了一套自顶向下的召回方法,包括三个步骤:

  1. 语义锚定与扩展;
  2. 结构化下钻;
  3. 多因素重排。

1. 语义锚定与扩展

首先,系统根据查询和主题节点之间的向量相似度,找到最相关的 Top- k k k 个主题节点:

查询:
用户最终决定去哪些日本城市?

直接主题锚点:
日本旅行计划

但只依赖直接相似度可能漏掉隐含相关主题。

因此,GAM 还会把这些主题节点的一阶邻居加入召回范围:

V a n c h o r = V t o p ∪ N ( V t o p ) \mathcal{V}_{\mathrm{anchor}}=\mathcal{V}_{\mathrm{top}}\cup\mathcal{N}(\mathcal{V}_{\mathrm{top}}) Vanchor=VtopN(Vtop)

其中:

  • V t o p \mathcal{V}_{\mathrm{top}} Vtop 是通过向量检索直接找到的主题节点;
  • N ( V t o p ) \mathcal{N}(\mathcal{V}_{\mathrm{top}}) N(Vtop) 表示这些主题节点的一阶邻居集合;
  • V a n c h o r \mathcal{V}_{\mathrm{anchor}} Vanchor 是最终用于下钻的主题锚点集合。

例如,系统直接找到“日本旅行计划”,随后可能沿图关系扩展到:

京都交通安排
东京住宿偏好
旅行时间变化

这种扩展能够召回词面不完全匹配、但语义相关的主题。

2. 结构化下钻

找到高层主题后,系统沿跨层连接找到对应的历史事件图,并提取其中的事件节点。

这个过程可以分成两步理解。

第一步,找到与主题锚点关联的历史事件图。为了避免 CSDN 对复杂集合公式的兼容问题,这里不再保留原始嵌套公式,可以直接理解为:

相关历史事件图
=
所有与主题锚点存在跨层连接的归档事件图

记作:

S q = LinkedGraphs ⁡ ( V a n c h o r ) \mathcal{S}_{q}=\operatorname{LinkedGraphs}(\mathcal{V}_{\mathrm{anchor}}) Sq=LinkedGraphs(Vanchor)

第二步,从这些历史事件图中收集全部事件节点:

C = ⋃ G ∈ S q V ( G ) \mathcal{C}=\bigcup_{\mathcal{G}\in\mathcal{S}_{q}}\mathcal{V}(\mathcal{G}) C=GSqV(G)

其中:

  • S q \mathcal{S}_{q} Sq 是和当前查询相关的历史事件图集合;
  • V ( G ) \mathcal{V}(\mathcal{G}) V(G) 表示事件图 G \mathcal{G} G 中的节点集合;
  • C \mathcal{C} C 是最终形成的候选事件集合。

召回路径可以概括为:

用户查询
→ 主题节点
→ 相邻主题
→ 历史事件图
→ 原始对话细节

这种方法兼顾了高层语义覆盖和底层证据精度。

3. 多因素重排

得到候选事件后,系统先使用 cross-encoder 计算基础语义相关概率:

P s e m ( v ∣ q ) P_{\mathrm{sem}}(v\mid q) Psem(vq)

其中:

  • v v v 表示候选记忆;
  • q q q 表示当前查询;
  • P s e m ( v ∣ q ) P_{\mathrm{sem}}(v\mid q) Psem(vq) 表示候选记忆与查询的语义相关程度。

随后,系统结合多个显式上下文信号进行调节:

S c o r e ( v , q ) = P s e m ( v ∣ q ) ∏ k ∈ K β k I k ( v , q ) \mathrm{Score}(v,q)=P_{\mathrm{sem}}(v\mid q)\prod_{k\in\mathcal{K}}\beta_k^{I_k(v,q)} Score(v,q)=Psem(vq)kKβkIk(v,q)

参与重排的因素集合为:

K = { t i m e , c o n f , r o l e } \mathcal{K}=\{\mathrm{time},\mathrm{conf},\mathrm{role}\} K={time,conf,role}

其中:

  • K \mathcal{K} K 表示参与重排的因素集合;
  • β k \beta_k βk 是第 k k k 个因素的提升系数;
  • I k ( v , q ) I_k(v,q) Ik(v,q) 的取值为 0 或 1;
  • 当候选记忆满足某个因素时, I k ( v , q ) = 1 I_k(v,q)=1 Ik(v,q)=1
  • 当候选记忆不满足该因素时, I k ( v , q ) = 0 I_k(v,q)=0 Ik(v,q)=0

当某个因素不满足时,对应乘法项为 1,不改变最终分数;当某个因素满足时,该候选记忆的分数会获得相应提升。

三个因素分别是:

(1)时间因素

当问题包含明显的时间约束时,提升包含相关时间信息的记忆。

例如:

用户上个月最终决定去哪座城市?

与“上个月”匹配的事件会获得更高分。

(2)置信度因素

优先保留在写入阶段通过自一致性检查、置信度更高的记忆。

这样可以降低错误总结或不确定信息进入最终上下文的概率。

(3)角色因素

在多人对话中,优先召回与目标说话人匹配的内容。

例如问题是:

Rachel 对这件事有什么看法?

系统应该避免召回 Ross 或 Monica 的相似表达。

4. 为什么采用乘法调节?

GAM 没有简单把多个分数相加,而是用乘法调节基础语义概率。

这样做的好处是:

一条记忆即使时间、角色完全匹配,但如果语义本身与问题无关,也不会因为附加因素而被错误提升到很高的位置。

例如:

记忆 A:
时间匹配、角色匹配,但内容和问题无关。

记忆 B:
语义高度相关,同时角色匹配。

由于记忆 A 的基础语义概率很低,乘法提升后仍然不容易超过真正相关的记忆 B。


七、一个简单例子:GAM 如何管理一段长期对话?

假设用户和 Agent 进行了以下对话。

第 1 轮:
我下个月可能去日本。

第 2 轮:
主要想去东京,但还没完全决定。

第 3 轮:
如果时间够,也许会去京都。

第 4 轮:
对了,我最近还在准备毕业论文。

第 5 轮:
论文实验部分还需要补几组结果。

1. 情节缓冲

前三轮围绕日本旅行展开,系统先构建一个局部事件图:

计划去日本
→ 考虑东京
→ 可能加入京都

此时,系统不会立即建立三个独立的长期记忆节点。

2. 检测到语义边界

第 4 轮从旅行切换到毕业论文,系统判断发生了主题变化。

此时令 b t = 1 b_t=1 bt=1,触发语义固化。

3. 生成主题节点

旅行相关事件被整合为:

主题:
日本旅行计划

摘要:
用户计划下个月去日本,主要考虑东京,也可能加入京都。

原始事件:
保留前三轮完整对话。

这个主题节点被写入全局主题图,原始事件图被归档并与主题节点相连。

随后,第 4、5 轮开始构建新的“毕业论文”事件图。

4. 后续召回

如果用户后来询问:

我之前考虑去日本的哪些地方?

GAM 会执行:

查询
→ 锚定“日本旅行计划”
→ 下钻到历史事件图
→ 找到东京和京都相关事件
→ 结合时间、角色和置信度重排

最后回答:

你主要考虑去东京,如果时间允许,也想去京都。

相比只保存一段摘要,GAM 还能够区分:

  • 东京是主要计划;
  • 京都只是可能加入的行程。

这是底层原始事件图带来的价值。


八、实验设置

1. 数据集

论文在两个长期对话记忆数据集上进行实验。

LoCoMo

LoCoMo 用于评估长期多会话对话中的记忆能力,包含:

  • Multi-Hop;
  • Temporal;
  • Open-Domain;
  • Single-Hop。

其中 Temporal 和 Multi-Hop 更能体现结构化记忆与跨会话推理能力。

LongDialQA

LongDialQA 基于长篇、多角色电视剧对话构建,包括:

  • The Big Bang Theory;
  • Friends;
  • The Office。

这类数据包含频繁的说话人切换和交错剧情,适合检验角色感知召回和长期叙事理解。

2. Baseline 方法

论文对比了以下方法:

  • ReadAgent:用 gist memory 压缩长文本;
  • MemoryBank:基于长期记忆流保存交互信息;
  • MemGPT:使用分层存储管理有限上下文;
  • A-Mem:动态链接和演化 Agent 记忆;
  • MemoryOS:分层组织短期、中期和长期记忆;
  • Mem0:面向生产级 Agent 的长期记忆系统。

3. 模型

论文使用了四种不同规模的模型:

  • Llama-3.2-3B-Instruct;
  • Qwen2.5-7B-Instruct;
  • Qwen2.5-14B-Instruct;
  • GPT-4o-mini。

GAM 本身是一个 training-free 框架,不需要微调这些模型参数。

4. 实现细节

论文使用:

  • all-MiniLM-L6-v2 生成向量索引;
  • cross-encoder/ms-marco-MiniLM-L-6-v2 进行候选重排;
  • 默认召回 Top-10 条记忆;
  • Ollama 和 LiteLLM 完成模型调用;
  • NVIDIA RTX 4090 进行实验。

5. 评测指标

论文使用:

  • F1:衡量答案中的实体和参考答案重叠程度;
  • BLEU-1:衡量 unigram 级别的词汇准确性;
  • Tokens / Query:平均每个问题消耗的 token;
  • Latency:平均推理时间。

九、LoCoMo 上的主要结果

论文 Table 1 展示了 GAM 在 LoCoMo 上的结果。

LoCoMo数据集实验结果

表源:Wu et al., 2026,Table 1。

GAM 在四个模型上都取得了最高的平均 F1。

Backbone Mem0 F1 GAM F1 Mem0 BLEU-1 GAM BLEU-1
Llama-3.2-3B 30.11 36.27 21.28 30.02
Qwen2.5-7B 35.38 40.00 28.67 32.99
Qwen2.5-14B 37.29 40.38 30.66 33.55
GPT-4o-mini 40.37 43.14 31.45 36.48

1. 在复杂推理任务上提升明显

以 Qwen2.5-7B 为例:

Temporal F1:
Mem0 = 41.22
GAM = 48.97

相对提升超过 18%。

这说明按语义边界进行固化,并保存事件演进结构,对时间推理比较有效。

2. 更大的模型仍然受益

在 GPT-4o-mini 上,GAM 的平均 F1 达到 43.14,是所有方法中最高的。

这说明 GAM 的提升并不只是用于弥补小模型能力不足。即使模型本身具备较强的上下文处理能力,结构化记忆仍然可以提高长期一致性。

3. 不是每个子任务都绝对领先

论文也明确指出两个例外。

第一,在 GPT-4o-mini 的 Temporal 类问题上,Mem0 的 F1 为 56.42,高于 GAM 的 51.96。

一个可能原因是,Mem0 更直接地保留原始轨迹,而 GAM 在主题固化过程中进行了总结,可能损失了一些精确时间线索。

第二,Open-Domain 是 GAM 相对困难的类别。开放域问题通常缺少明确的主题、角色或时间约束,而 GAM 的结构化筛选在这类广泛主题查询上不一定总占优势。

这说明 GAM 的优势主要体现在:

  • 主题相对明确;
  • 需要时间推理;
  • 涉及特定角色;
  • 需要跨会话定位具体事件。

十、LongDialQA 上的主要结果

论文 Table 2 展示了 LongDialQA 上的结果。

LongDialQA的结果

表源:Wu et al., 2026,Table 2。

GAM 在四个模型上都取得了最高的平均 F1 和 BLEU-1。

Backbone Mem0 F1 GAM F1 Mem0 BLEU-1 GAM BLEU-1
Llama-3.2-3B 6.85 7.36 5.75 6.85
Qwen2.5-7B 10.27 12.55 9.91 12.43
Qwen2.5-14B 11.48 11.86 10.94 11.66
GPT-4o-mini 10.90 11.18 9.84 10.14

其中 Qwen2.5-7B 上的提升最明显:

MemoryOS F1:6.76
GAM F1:12.55

论文指出,相比 MemoryOS 提升约 86%。

LongDialQA 中包含大量多人对话。GAM 的角色因素和事件图能够帮助系统区分:

  • 谁说了什么;
  • 某段情节属于哪个角色;
  • 不同人物的叙事线如何交错。

因此,它在频繁说话人切换的长期对话中表现更稳定。


十一、消融实验

论文在 Qwen2.5-7B 和 LoCoMo 上进行了消融实验。

消融实验结果

表源:Wu et al., 2026,Table 3。

各个变体的结果为:

方法 F1 BLEU-1
w/o TAN 35.07 29.00
w/o MFR 35.94 29.28
w/o SSM 32.58 26.13
w/o EPG 25.06 20.76
GAM 40.00 32.99

其中:

  • TAN:Topic Associative Network;
  • EPG:Event Progression Graph;
  • SSM:Semantic-Event-Triggered State Switching Mechanism;
  • MFR:Multi-Factor Retrieval。

1. Event Progression Graph 最重要

移除 EPG 后,F1 从 40.00 降到 25.06,是下降最明显的变体。

这说明仅仅保存高层主题摘要还不够。底层事件图所保留的时间顺序、因果联系和原始细节,是长期对话推理的重要基础。

2. 状态切换机制不可替代

移除 SSM 后,F1 降到 32.58。

这说明“什么时候固化”并不是无关紧要的工程细节。直接更新或随意按窗口切分,都会增加记忆污染和叙事断裂风险。

3. 主题图和多因素召回均有贡献

移除 TAN 或 MFR 后,性能也会明显下降。

主题图负责组织跨会话的高层语义,多因素召回则负责在具体问题下结合时间、角色和置信度进行精确筛选。


十二、主题分割策略分析

论文比较了多类主题分割方法:

  • Fixed Window 256;
  • Fixed Window 512;
  • Fixed Turns;
  • Session-based;
  • GAM 的 Semantic-Event-Triggered 方法。

主题分割策略分析结果

图源:Wu et al., 2026,Figure 3。

GAM 的平均 F1 为 40.00,高于所有启发式策略;Fixed Window 256 的表现最差,F1 为 34.23。

1. 固定窗口为什么效果较差?

固定窗口只看 token 数量,不看话题是否完整。

例如,一段话题可能在窗口中间被切开:

窗口一:
用户计划去日本,主要想去……

窗口二:
东京,但也在考虑京都。

这样会切断事件之间的逻辑关系。

2. 按 Session 分割为什么仍然不够?

一个会话中可能包含多个主题:

前半段:日本旅行
中间:论文投稿
后半段:健身计划

如果整场会话只生成一个主题节点,仍然会造成多个主题混合。

GAM 根据语义变化动态触发固化,可以捕捉会话内部更细粒度的主题转移。

论文还在附录中加入了噪声实验:即使主题分割存在 40% 噪声,GAM 仍然优于固定窗口方法,说明框架对边界判断误差具有一定鲁棒性。


十三、效率分析

论文 Table 4 比较了不同方法的 token 消耗、延迟和 F1。

效率分析结果

表源:Wu et al., 2026,Table 4。

方法 Tokens / Query Time F1
A-Mem 4221.12 2.21 s 24.20
MemoryOS 3400.41 154.22 s 28.86
Mem0 1533.94 0.51 s 35.38
GAM 1370.18 0.80 s 40.00

GAM 的平均 token 消耗最低,相比 Mem0 减少约 11%。

虽然 Mem0 的延迟略低,但 GAM 在相近速度下取得了更高的 F1:

Mem0:35.38
GAM:40.00

相对提升约 13%。

GAM 的效率主要来自三点:

  1. 实时阶段只更新局部事件图;
  2. 主题关系计算只在语义固化阶段进行;
  3. 新主题只和向量检索得到的小规模候选集合比较,而不是遍历全图。

因此,GAM 并不是简单地“使用图结构”,而是在图更新过程中加入了事件触发和粗到细筛选,控制结构化记忆的计算成本。


十四、和 A-Mem、LightMem、Memory-R1、AgeMem 的区别

如果把 GAM 和前面几篇 Agent 记忆论文放在一起看,可以发现它的重点是:

通过局部事件图和全局主题图的分层隔离,在记忆稳定性与实时更新能力之间取得平衡。

方法 关注点 核心问题
A-Mem 记忆节点动态链接和自进化 记忆如何自动建立关联并不断演化
Memory-R1 强化学习记忆管理和利用 Agent 如何学会添加、更新、删除和筛选记忆
LightMem 轻量高效的记忆构建 如何减少 token、API 调用和运行时间
AgeMem 统一长期和短期记忆管理 如何把 LTM 和 STM 操作统一纳入 Agent 策略
GAM 层级图和事件驱动固化 如何隔离短期噪声,同时保留连续叙事和长期结构

1. GAM 和 A-Mem

A-Mem 重点是让记忆节点能够动态链接和演化。

GAM 更关注“写入隔离”:

  • 新信息先进入事件图;
  • 不直接修改全局主题图;
  • 只有语义单元完成后才固化。

因此,GAM 对记忆污染问题的处理更加结构化。

2. GAM 和 LightMem

二者都采用了“先缓冲、后整理”的思想。

区别在于:

  • LightMem 更强调压缩、主题分组和离线更新带来的效率;
  • GAM 更强调局部事件图、全局主题图和跨层关系带来的结构稳定性。

3. GAM 和 AgeMem

AgeMem 把长期记忆和短期记忆操作设计成 Agent 可以主动调用的工具,并通过强化学习学习调用策略。

GAM 不需要训练 Agent 学习记忆动作,而是通过语义边界检测和状态机控制记忆生命周期。

因此:

AgeMem:学习什么时候操作记忆。
GAM:通过架构和语义事件控制什么时候固化记忆。

十五、局限性和未来方向

1. 当前主要支持文本记忆

论文当前只对文本交互进行建模,无法原生处理:

  • 图像;
  • 音频;
  • 视频;
  • 环境视觉状态。

未来可以将主题节点和事件节点扩展为多模态节点,例如同时保存:

文本摘要 + 视频关键帧 + 音频表示

2. 主题边界检测仍然依赖大模型

虽然 GAM 只在稀疏事件下检测主题变化,但仍然需要调用大模型判别语义边界。

如果判别错误,可能出现:

  • 一个完整主题被过早切开;
  • 多个主题被错误合并;
  • 长期主题节点粒度不一致。

3. 语义固化仍然可能造成信息损失

GAM 同时保存摘要和原始事件,已经降低了总结损失,但高层主题图仍然依赖摘要进行索引。

论文也观察到,在部分精确时间推理任务中,直接保留原始轨迹的 Mem0 表现更好。

4. 图结构会持续增长

随着长期交互增加:

  • 主题节点会增多;
  • 历史事件图会增多;
  • 跨层连接会增多。

论文通过 Top- k k k 筛选避免每次遍历全图,但超长期运行下的图压缩、节点合并和过期记忆清理仍值得进一步研究。

5. 隐私和错误记忆问题

长期记忆可能包含用户的敏感信息。

GAM 的固化阶段提供了一个天然的治理节点:在局部内容写入全局图之前,可以加入:

  • 隐私过滤;
  • 用户确认;
  • 敏感信息屏蔽;
  • 保留期限检查。

图结构也方便对错误节点或边进行局部删除,但这并不自动解决隐私和安全问题。


十六、我的理解和启发

这篇论文给我的最大启发是:

Agent 记忆系统不仅要考虑存什么,还要考虑信息在什么时候才有资格进入长期记忆。

很多记忆系统关注:

  • 如何抽取事实;
  • 如何构建索引;
  • 如何召回;
  • 如何更新冲突记忆。

但 GAM 进一步提出了一个更基础的问题:

当前信息是否已经形成了一个足够完整、足够稳定的语义单元?

对我自己做 Agent 项目来说,有以下几点启发。

1. 临时信息和稳定记忆需要写隔离

用户在对话中经常会:

  • 改变主意;
  • 给出不确定判断;
  • 补充前文;
  • 推翻旧计划。

如果每句话都直接更新长期记忆,系统很容易把中间状态当作最终事实。

更合理的结构是:

当前会话缓冲区
→ 主题完成或会话暂停
→ 生成候选长期记忆
→ 检查后再写入长期存储

2. 记忆粒度不应该完全由 token 数决定

固定轮数、固定 token 和固定时间间隔都容易切断完整语义。

语义事件可能是更合理的更新触发条件,例如:

  • 用户明确换了话题;
  • 一个子任务完成;
  • 一个计划已经确认;
  • 一轮工具探索结束。

3. 摘要和原始证据应该同时保留

只保存摘要便于检索,但可能丢掉:

  • 时间;
  • 数值;
  • 条件;
  • 语气;
  • 不确定性。

GAM 的双粒度主题节点值得借鉴:

summary:负责索引和高层推理
raw evidence:负责精确回答和证据追溯

4. 图召回适合采用“先粗后细”

直接在所有历史事件上检索,候选范围太大。

可以先定位高层主题,再下钻到具体事件:

查询
→ 相关主题
→ 相关会话或任务
→ 原始消息和工具结果

这和实际 Agent 项目中的分层索引设计比较接近。

5. 排序不能只依赖语义相似度

长期记忆召回还应该考虑:

  • 时间是否匹配;
  • 说话人是否匹配;
  • 信息是否可信;
  • 当前任务阶段是否匹配。

尤其在长期个性化对话中,单纯向量相似度很容易把不同时间、不同角色的相似内容混在一起。


十七、总结

本文提出了 GAM:Hierarchical Graph-based Agentic Memory,一个面向长程 LLM Agent 的层级图记忆框架。

GAM 主要解决统一流式记忆和离散结构化记忆之间的矛盾:

  • 统一流式记忆更新快,但容易受到临时噪声污染;
  • 结构化记忆稳定,但难以实时捕捉连续叙事。

为此,GAM 将记忆生命周期划分为两个状态:

  1. 情节缓冲状态
    将当前对话实时写入局部事件演进图,并与全局长期记忆隔离。

  2. 语义固化状态
    当检测到主题边界时,将完整事件图总结为主题节点,再写入全局主题关联网络。

在召回阶段,GAM 采用自顶向下的图引导策略:

  1. 在主题图中进行语义锚定;
  2. 扩展到相关主题;
  3. 沿跨层链接下钻到历史事件;
  4. 结合语义、时间、置信度和角色因素进行重排。

实验结果表明,GAM 在 LoCoMo 和 LongDialQA 上取得了较好的 F1 和 BLEU-1,并在 token 消耗和推理效率方面表现出较好的综合权衡。

整体来看,这篇论文的核心价值在于提出了一条明确的设计原则:

新信息不应该直接改写长期记忆,而应该先被缓冲、理解和固化。

对于实际 Agent 项目来说,这个思路非常有价值。长期记忆系统不仅要能记住信息,还需要保护已经建立的知识,避免被暂时性对话状态持续污染。


参考资料

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐