文章目录

前言

在长期对话中,Agent 记住一个事实并不算特别困难,真正困难的是:事实会随时间发生变化。

例如,用户在一月份说:

我最喜欢的餐厅是 Italian Garden。

到了三月份,用户又说:

Italian Garden 已经关门了,我现在经常去 Sakura Sushi。

如果记忆系统采用简单覆盖策略,那么新的偏好会直接替换旧偏好。此时 Agent 可以回答“用户现在最喜欢哪家餐厅”,却未必还能回答:

  • 用户以前喜欢哪家餐厅?
  • 用户什么时候改变了偏好?
  • 为什么不再去原来的餐厅?
  • 某个时间点上哪条信息有效?

如果记忆系统不覆盖旧信息,而是把两条记录都放进向量数据库,那么检索时又可能同时召回两个互相冲突的答案。模型虽然看到了完整信息,却不知道哪一条才适用于当前问题。

因此,长期对话记忆需要解决的并不只是“能否召回”,还包括:

  1. 如何识别不同对话中提到的是同一个实体;
  2. 如何保存事实产生、变化和失效的时间;
  3. 如何保留旧事实,而不是过早覆盖;
  4. 如何在查询时根据问题的时间语义解决冲突;
  5. 如何避免将整个对话历史重新塞回上下文。

APEX-MEM 的核心思路是:

写入记忆时,不急于判断哪条事实应该覆盖哪条事实,而是以追加方式保存事实的完整演化过程;等用户真正提问时,再由多工具检索 Agent 根据时间、实体、关系和证据决定哪条信息有效。

为此,APEX-MEM 将对话转换为带有时间信息的属性图,并使用 EntityLookup、GraphSQL、Search 等工具完成实体定位、图遍历、时间计算和语义检索。

这篇论文最值得关注的地方不是简单地“把对话存成知识图谱”,而是将以下三部分组合起来:

实体—事件混合本体
+
追加式事实存储
+
查询时冲突消解

零、论文基本信息


一、背景与问题

1. 更长的上下文不等于更可靠的记忆

解决长期对话记忆最直接的方法,是把所有历史对话放入上下文。

但是,随着历史不断增长,模型面对的不只是更多有用信息,也包括更多噪声:

  • 与当前问题无关的对话;
  • 已经过期的个人偏好;
  • 表述不同但实际相同的实体;
  • 相互矛盾的事实;
  • 重复出现的内容;
  • 缺少明确时间锚点的信息。

即使上下文窗口足够大,模型也可能因为噪声过多而选错事实。

因此,长期记忆系统的目标不应该只是“保存尽可能多的内容”,而应该是:

在保留完整历史的同时,为当前问题提供规模较小、时间一致且证据明确的记忆上下文。

2. 传统 RAG 缺少实体和时间建模

传统对话 RAG 通常将历史切分为文本片段,然后通过语义相似度检索。

这种方法适合回答:

用户以前有没有提到过跑步?

但面对下面的问题时就会比较困难:

用户现在住在哪里?
用户搬家之前住在哪里?
用户什么时候换了工作?
用户换工作后通勤时间增加了多少?

原因在于,普通文本片段没有显式表示:

  • 哪个实体是事实主体;
  • 不同称呼是否指向同一个实体;
  • 事实从什么时候开始有效;
  • 事实什么时候失效;
  • 多个事实之间是什么关系;
  • 当前问题询问的是过去还是现在。

3. 覆盖式记忆会丢失事实演化过程

很多记忆系统会对新旧事实执行 UPDATE 或 DELETE。

例如:

旧记忆:用户住在上海
新记忆:用户住在北京

系统可能将旧记忆直接更新为:

用户住在北京

这种方式适合回答当前状态,却丢失了迁移过程。

如果之后用户询问:

我搬到北京之前住在哪里?

系统已经没有足够的信息回答。

APEX-MEM 因此选择追加式存储:

事实 1:用户住在上海,有效时间从 T1 开始
事实 2:用户住在北京,有效时间从 T2 开始

旧事实不会因为新事实出现而立即删除。查询时,Agent 再根据问题中的时间条件选择对应事实。

4. 本文要解决的问题

APEX-MEM 主要回答以下问题:

  1. 如何把非结构化对话转换成可查询的半结构化记忆?
  2. 如何同时表示实体、事件、事实、时间和原始证据?
  3. 如何避免写入阶段的错误覆盖?
  4. 如何让 Agent 根据问题自主选择不同检索工具?
  5. 如何在超长历史中只为相关文档构建记忆图?

二、相关工作

1. 基于长上下文的对话记忆

这类方法直接将更多历史对话提供给模型。

优点是:

  • 实现简单;
  • 原始信息保存完整;
  • 不需要额外记忆写入流程。

局限是:

  • 输入成本随历史长度增加;
  • 无关信息会干扰回答;
  • 事实冲突需要模型在长文本中自行解决;
  • 时间关系没有被显式表示。

2. 基于文本检索的记忆系统

MemGPT、ReadAgent、MemoryBank 等方法通过分层记忆、摘要或检索减少输入内容。

这类方法的核心是:

保存对话文本或摘要
↓
根据当前问题检索
↓
将相关文本放入上下文

它们缓解了上下文增长问题,但文本检索仍然难以稳定处理实体对齐、多跳关系和事实演化。

3. 结构化长期记忆

Mem0、A-MEM、Zep、MIRIX 等方法开始使用图结构、记忆链接或多个专用记忆库。

这些方法分别关注:

  • Mem0:事实记忆的写入、更新和删除;
  • A-MEM:记忆之间的动态关联和演化;
  • Zep:带有时间信息的知识图谱;
  • MIRIX:通过多个专用记忆模块管理不同信息。

APEX-MEM 与这些方法最重要的区别在于:

它把对话事件当作一等对象,并将事实变化完整保存在追加式事件图中,在查询阶段再执行时间解析和冲突消解。

4. APEX-MEM 的定位

方法主要记忆表示旧事实处理方式时间推理方式
普通 RAG文本片段全部保留依赖模型阅读文本
Mem0事实或关系ADD、UPDATE、DELETE以当前事实为主
A-MEM动态关联笔记更新与链接依赖记忆内容
Zep时间知识图谱部分保留时间演化图检索与文本检索
MIRIX多种专用记忆库状态合并多 Agent 路由
APEX-MEM实体—事件属性图追加式保存查询时使用时间图遍历和 SQL

三、方法总览

为了理解 APEX-MEM 的完整数据流,可以先看论文 Figure 1。

图1

图源:论文 Figure 1。
该图展示了对话或外部文档如何经过事件提取、实体解析和事实抽取写入属性图,以及查询 Agent 如何通过多个工具访问图数据库并回答问题。

APEX-MEM 可以分为两个阶段。

1. 记忆构建阶段

对话或文档
↓
按时间排序
↓
提取事件、实体和事实
↓
实体与属性消歧
↓
将事实关联到时间事件
↓
追加到属性图

2. 记忆查询阶段

用户问题
↓
识别实体和时间条件
↓
选择 EntityLookup、GraphSQL 或 Search
↓
检索事实、事件和原始证据
↓
解决事实冲突
↓
生成紧凑记忆摘要和最终答案

其中,底层属性图在论文实现中由 SQLite 表结构承载,包括:

  • sessions;
  • turns;
  • events;
  • entities;
  • properties;
  • facts;
  • evidence;
  • event_participants。

因此,APEX-MEM 虽然在概念上是属性图,但当前实现并不是专用图数据库,而是通过 SQLite 表和只读 SQL 模拟图查询。


四、核心模块详解

4.1 时间属性图

1. 设计动机

普通知识图谱通常使用三元组表示事实:

( subject , relation , object ) \left(\text{subject},\text{relation},\text{object}\right) (subject,relation,object)

例如:

Alice --favorite_restaurant--> Italian Garden

但这个表示没有说明:

  • Alice 从什么时候开始喜欢这家餐厅;
  • 这条事实现在是否仍然有效;
  • 事实来自哪一次对话;
  • 模型为什么相信这条事实;
  • 新事实出现后旧事实如何处理。

APEX-MEM 因此使用带属性的有向图。

2. 图的形式化定义

论文将 APEX-MEM 定义为:

G = ( V , E , Π , Λ ) G=(V,E,\Pi,\Lambda) G=(V,E,Π,Λ)

其中:

  • V V V 表示节点集合,包括实体、事件和事实等;
  • E ⊆ V × V E\subseteq V\times V EV×V 表示带类型和标签的有向边;
  • Π \Pi Π 为节点和边附加键值属性;
  • Λ \Lambda Λ 为每个节点和边指定本体类型。

对于每个输入文档 d i d_i di,系统会构建一个局部子图 g i g_i gi,然后逐步合并到全局图中:

G ( t + 1 ) ← M e r g e ( G ( t ) , g t ) G^{(t+1)}\leftarrow \mathrm{Merge}\left(G^{(t)},g_t\right) G(t+1)Merge(G(t),gt)

合并过程中不会简单地把所有节点重复插入,而是先执行实体和属性解析,判断新提及是否应该链接到已有实体。

3. 属性图相比普通三元组的优势

属性图可以为事实保存更多信息,例如:

主体:Alice
属性:favorite_restaurant
值:Italian Garden
数据类型:string
开始时间:2024-01-15
结束时间:未知
置信度:0.96
证据:Session 1,Turn 8

这些属性使系统能够进一步回答:

  • 当前值是什么?
  • 某个时间点的值是什么?
  • 事实何时发生变化?
  • 哪段原始对话支持该事实?

4.2 实体—事件混合本体

1. 为什么不能只围绕实体建图

如果记忆图只存储实体之间的关系,那么下面两句话可能被压缩成两个静态事实:

Alice 喜欢 Italian Garden。
Alice 喜欢 Sakura Sushi。

系统知道 Alice 与两家餐厅都有关系,却不知道:

  • 两件事发生的先后顺序;
  • 后一个偏好是否替代前一个偏好;
  • 变化发生在哪次对话;
  • 用户为什么改变偏好。

因此,APEX-MEM 同时建模实体和事件。

2. 实体表示

一个实体表示为:

e = ( n , τ , ρ , i d ) e=(n,\tau,\rho,\mathrm{id}) e=(n,τ,ρ,id)

其中:

  • n n n 表示实体名称;
  • τ \tau τ 表示实体类型;
  • ρ \rho ρ 表示它在对话中的角色;
  • i d \mathrm{id} id 表示可选的外部标识符。

论文定义了 35 种领域无关的实体类型,包括:

  • Person;
  • Organization;
  • Place;
  • Event;
  • Time;
  • Product;
  • Device;
  • Software;
  • Dataset;
  • Document;
  • Medication;
  • Disease;
  • Topic;
  • Task。

对话角色包括:

  • Speaker;
  • Listener;
  • Agent;
  • Mentioned。

3. 事实表示

一个事实表示为:

f = ( s , p , v , δ , [ t f r o m , t t o ] , c , E ) f=(s,p,v,\delta,[t_{\mathrm{from}},t_{\mathrm{to}}],c,\mathcal{E}) f=(s,p,v,δ,[tfrom,tto],c,E)

其中:

  • s s s 表示事实主体;
  • p p p 表示属性或关系;
  • v v v 表示属性值;
  • δ \delta δ 表示值的数据类型;
  • [ t f r o m , t t o ] [t_{\mathrm{from}},t_{\mathrm{to}}] [tfrom,tto] 表示事实有效时间;
  • c ∈ [ 0 , 1 ] c\in[0,1] c[0,1] 表示置信度;
  • E \mathcal{E} E 表示支持该事实的证据集合。

4. 事件表示

所有事实都会关联到一个对话事件:

ε = ( t y p e , T , L , P , F , E ε ) \varepsilon=(\mathrm{type},T,L,P,F,\mathcal{E}_{\varepsilon}) ε=(type,T,L,P,F,Eε)

其中:

  • t y p e \mathrm{type} type 表示事件类型;
  • T T T 表示事件时间;
  • L L L 表示地点;
  • P P P 表示参与实体;
  • F F F 表示事件包含的事实;
  • E ε \mathcal{E}_{\varepsilon} Eε 表示事件的原始文本证据。

通过把事实挂载到事件上,系统能够同时保留:

谁
在什么时候
参与了什么事件
产生了什么事实
事实由哪段文本支持

4.3 实体与属性解析

1. 设计动机

长期对话中,同一个实体可能有多种表述:

Sakura Sushi
那家寿司店
我常去的日本餐厅
上次说的餐厅

如果系统把这些表述全部创建成不同实体,图中就会出现大量重复节点,多跳查询也会断裂。

2. 实体解析流程

对于对话中的实体提及 m m m,系统首先通过向量索引检索已有候选实体:

C = { c 1 , c 2 , … , c k } C=\{c_1,c_2,\ldots,c_k\} C={c1,c2,,ck}

每个候选实体包含:

  • 实体 ID;
  • 文本表示;
  • 相似度分数。

然后,结构化 LLM 根据当前提及、上下文和候选实体作出三类决策:

choose_existing:链接到已有实体
propose_new:创建新实体
none:当前内容不需要形成实体

输出还包括:

  • 标准化名称;
  • 实体类型;
  • 别名;
  • 置信度;
  • 判断理由。

3. 属性解析

属性解析采用类似流程,将不同表述归一化为统一属性。

例如:

最喜欢的餐厅
常去的餐厅
favorite restaurant

可能统一为:

favorite_restaurant

属性值还会被识别为不同数据类型:

  • string;
  • integer;
  • float;
  • boolean;
  • date;
  • datetime;
  • enum;
  • URL;
  • list。

4. 工程意义

实体解析是图记忆系统最基础、也最容易出错的环节。

如果实体链接错误,那么后续即使 SQL 完全正确,也只能在错误的图结构上推理。

论文案例中就出现了这种失败:

问题:Bob 上个月去了几次巴黎的餐厅?

系统识别出了餐厅实体,但没有从“Eiffel Tower”等上下文线索推断餐厅位于巴黎,导致空间关系缺失,最终无法正确统计。


4.4 事实与事件抽取

1. 输入

系统将每个对话轮次表示为:

u = ( s , l , t e x t , t a n c h o r , c t x ) u=(s,l,\mathrm{text},t_{\mathrm{anchor}},\mathrm{ctx}) u=(s,l,text,tanchor,ctx)

其中:

  • s s s 是说话者;
  • l l l 是接收者;
  • t e x t \mathrm{text} text 是当前文本;
  • t a n c h o r t_{\mathrm{anchor}} tanchor 是当前对话时间;
  • c t x \mathrm{ctx} ctx 是最近对话上下文。

2. 处理流程

系统使用带少样本示例的 LLM,从当前对话中抽取:

  • 参与实体;
  • 事件类型;
  • 事件地点;
  • 事实;
  • 数据类型;
  • 时间表达;
  • 置信度;
  • 原始证据位置。

相对时间会根据锚点时间转换为 ISO 8601 时间。

例如:

我昨天报名了一个陶艺课。

如果当前对话发生在 2023 年 5 月 8 日,那么“昨天”可以归一化为:

2023-05-07

3. 输出示例

实体:用户
类型:PERSON

事件:报名陶艺课
事件时间:2023-05-07

事实:
- enrolled_activity = pottery class
- activity_benefit = therapy
- emotional_outlet = true

证据:
- Session 3
- Turn 12
- 原始文本片段

4. 为什么需要保留证据

结构化抽取可能出错,因此不能只保留最终三元组。

APEX-MEM 会将事实链接回原始对话证据,使检索 Agent 可以:

  • 检查事实是否被正确抽取;
  • 在冲突时比较原始表述;
  • 为回答提供可追溯依据;
  • 避免完全依赖图中某个简化字段。

4.5 追加式事实存储

1. 设计动机

很多记忆系统在发现新事实后立即更新旧事实:

UPDATE favorite_restaurant
SET value = 'Sakura Sushi'
WHERE user = 'Alice';

APEX-MEM 认为,这种写入时合并可能过早丢失信息。

新事实并不一定代表旧事实错误,它也可能表示:

  • 用户偏好发生了变化;
  • 事实只在某段时间有效;
  • 两条信息来自不同视角;
  • 新信息只是对旧信息的补充;
  • 当前还无法判断哪条更可信。

2. 追加式策略

APEX-MEM 不直接覆盖旧事实,而是保存两条时间记录:

事实 1:
Alice.favorite_restaurant = Italian Garden
from = 2024-01-15

事实 2:
Alice.favorite_restaurant = Sakura Sushi
from = 2024-03-20

查询当前偏好时,Agent 可以按照时间排序,选择最新有效事实。

查询历史偏好时,旧事实仍然存在。

3. 查询时冲突消解

APEX-MEM 将冲突处理从写入阶段推迟到查询阶段:

写入阶段:
保留事实及其时间、证据和置信度

查询阶段:
根据问题时间
+ 事实有效期
+ 事件顺序
+ 原始证据
决定使用哪条事实

这个设计可以概括为:

Write everything with provenance, resolve only when the question provides context.

4. 示例

用户历史:

2024-01-15:
我最喜欢 Italian Garden,那里的意面最好吃。

2024-03-20:
Italian Garden 上个月关门了,我现在每周都去 Sakura Sushi。

APEX-MEM 不删除第一条事实。

当问题是:

Alice 现在最喜欢哪家餐厅?

系统选择时间最新的 Sakura Sushi。

当问题是:

Italian Garden 关门前,Alice 最喜欢哪家餐厅?

系统仍然能够找到 Italian Garden。

当问题是:

Alice 的餐厅偏好是什么时候变化的?

系统可以比较两个事件的时间并回答变化发生在 2024 年 3 月前后。


4.6 多工具图检索 Agent

APEX-MEM 使用 ReAct 风格的问答 Agent。

在第 t t t 步,Agent 根据问题和历史生成推理轨迹与动作:

( r t , a t ) ∼ π θ ( ⋅ ∣ x , h t ) \left(r_t,a_t\right)\sim\pi_{\theta}(\cdot\mid x,h_t) (rt,at)πθ(x,ht)

其中:

  • x x x 表示用户问题;
  • h t h_t ht 表示当前工具交互历史;
  • r t r_t rt 表示推理过程;
  • a t a_t at 表示工具调用或最终回答。

Agent 可以选择四种工具。

1. SchemaViewer

设计动机

LLM 不一定知道数据库有哪些表、字段以及它们之间的关系。

如果直接生成 SQL,容易出现:

  • 使用不存在的字段;
  • 混淆事实时间与事件时间;
  • 连接错误的表;
  • 不知道应该先查实体还是查事件。

功能

SchemaViewer 返回:

  • 数据库结构;
  • 查询示例;
  • 工具使用说明;
  • 时间推理建议。

它相当于 Agent 的元级规划辅助工具。

2. EntityLookup

设计动机

很多问题首先需要把自然语言中的称呼链接到图中的标准实体。

流程

自然语言实体名称
↓
语义检索 + 关键词检索
↓
候选实体 ID
↓
返回实体最新事实、历史事实和时间锚点

EntityLookup 适合:

  • 查询人物属性;
  • 定位实体 ID;
  • 获取实体近期状态;
  • 为后续 GraphSQL 提供规范化标识。

3. GraphSQL

设计动机

语义检索擅长寻找相关内容,却不擅长精确计算和多跳关系推理。

GraphSQL 提供只读 SQLite 查询接口,只允许:

SELECT ...

或:

WITH ... SELECT ...

并禁止 UPDATE、DELETE 和 DDL 操作。

GraphSQL 适合:

  • 多表连接;
  • 多跳实体关系;
  • 时间排序;
  • 有效期过滤;
  • 时长计算;
  • 数量统计;
  • 聚合分析。

例如,问题:

Bob 的经理的职位是什么?

可以转化为:

Bob
↓ reports_to
Sarah Chen
↓ job_title
VP of Engineering

4. Search

设计动机

并不是所有问题都适合先生成精确 SQL。

开放式问题或表述模糊的问题更适合先进行语义检索,快速获得相关子图。

Search 返回的上下文包括:

T s e a r c h ( q ) = ( E q , P q , V q , T q ) T_{\mathrm{search}}(q)=(E_q,P_q,\mathcal{V}_q,\mathcal{T}_q) Tsearch(q)=(Eq,Pq,Vq,Tq)

其中:

  • E q E_q Eq 是候选实体;
  • P q P_q Pq 是候选属性;
  • V q \mathcal{V}_q Vq 是相关事件和证据;
  • T q \mathcal{T}_q Tq 是相关原始对话轮次。

5. 四种工具如何配合

SchemaViewer
→ 理解图结构和查询策略

EntityLookup
→ 定位标准实体并查看实体快照

Search
→ 快速检索相关子图和文本证据

GraphSQL
→ 执行精确的时间、多跳和聚合推理

这种组合避免了两种极端:

  • 只使用语义检索,缺少精确推理;
  • 只使用 SQL,需要大量调用探索图结构。

4.7 在线图构建

1. 设计动机

当历史文档超过 10 3 10^3 103 时,为所有内容完整构建图的成本可能过高,而且很多文档与用户问题无关。

2. 在线构建方法

给定文档集合 D D D 和问题 Q Q Q,系统先执行语义和关键词检索,只选择相关性超过阈值的文档:

D r e l = { d i ∈ D ∣ R e l e v a n c e ( d i ∣ Q ) > Θ r e l } D_{\mathrm{rel}}=\{d_i\in D\mid \mathrm{Relevance}(d_i\mid Q)>\Theta_{\mathrm{rel}}\} Drel={diDRelevance(diQ)>Θrel}

然后按照时间顺序,仅为 D r e l D_{\mathrm{rel}} Drel 构建局部 APEX-MEM 图。

论文在 LongMemEval 和 SealQA-Hard 中采用在线构建,并设置:

Θ r e l > 0.2 \Theta_{\mathrm{rel}}>0.2 Θrel>0.2

3. 在线构建的取舍

优点:

  • 避免为全部历史支付抽取成本;
  • 降低图规模;
  • 减少无关信息。

局限:

  • 如果预检索阶段漏掉关键文档,后续图推理无法恢复;
  • 图结构受当前问题影响,不再是完整全局记忆;
  • 不同问题可能重复构建相似局部图。

因此,在线 APEX-MEM 本质上是:

先通过传统检索缩小范围,再对相关内容进行结构化和时间推理。


五、实验设置

5.1 数据集

1. LOCOMO

LOCOMO 用于评估跨多次会话的长期对话记忆,问题分为:

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

其中 Adversarial 是不可回答问题,用于测试系统能否抵抗无关或误导性信息。

2. LongMemEval

LongMemEval 关注:

  • 超长输入;
  • 跨会话事实召回;
  • 时间推理;
  • 多会话知识整合;
  • 对上下文长度变化的泛化。

3. SealQA-Hard

SealQA-Hard 面向带有冲突和噪声的搜索增强问答。

每个问题包含 30 篇网页检索文档,其中只有 1 到 2 篇是金标准相关文档,并且位置不固定。

论文按照文档发布时间排序,将每篇文档视为一次 Agent 与世界的交互,用来测试追加式记忆面对冲突信息时的表现。

5.2 模型配置

APEX-MEM 的不同阶段使用不同模型:

  • 事实抽取:Claude Sonnet 4.5;
  • 实体与属性解析:Claude Haiku 4.5;
  • 问答 Agent:Claude 4.5 Haiku、Claude 4.5 Sonnet、Claude 3.5 Sonnet、GPT-5、GPT-4o 等。

之所以没有全部使用同一个模型,是为了在效果和成本之间平衡:

  • 事实抽取需要更强的结构化理解能力;
  • 实体解析任务相对简单,可以使用成本更低的模型;
  • 问答阶段则测试不同模型后端的泛化能力。

5.3 其他设置

  • ReAct 工具调用上限:40 次;
  • 推理温度:0;
  • LLM-as-a-Judge:报告 3 次评估均值;
  • 标准差小于 ± 1 \pm1 ±1
  • LOCOMO:为每组完整会话构建全量图;
  • LongMemEval、SealQA-Hard:使用在线图构建;
  • LongMemEval 检索基线:返回 Top-5 相关 Session。

六、实验结果与分析

6.1 记忆图构建质量

论文从 LOCOMO 和 LongMemEval 中随机选择 500 个对话轮次,使用 GPT-5 作为 Judge,评价:

  • Fact Extraction:抽取事实的准确性;
  • Schema Coverage:合理属性是否被完整覆盖;
  • Entity/Property Resolution:实体与属性是否被正确链接。

Table 2 的结果如下:

构建模型事实抽取Schema 覆盖实体/属性解析
GPT-4o94.2%75.7%98.1%
Claude Sonnet 4.597.3%91.1%98.2%
Claude Haiku 4.595.8%90.3%95.4%
Qwen3-14B95.4%88.9%92.5%

Claude Sonnet 4.5 在事实抽取和 Schema 覆盖上最好,因此论文使用它执行事实抽取。

Claude Haiku 4.5 的实体解析达到 95.4%,同时成本相对较低,因此用于实体和属性解析。

这里也说明,APEX-MEM 的最终效果并不只取决于图结构,还高度依赖前置抽取模型。图构建阶段一旦漏掉事实,后续检索 Agent 无法查询到不存在的节点和关系。

6.2 LOCOMO 主要结果

Table 1 中的关键结果如下:

方法Single-HopMulti-HopTemporalOpen-DomainAdversarialOverall
APEX-MEM + GPT-589.88%86.29%90.63%91.68%86.77%88.88%
APEX-MEM + Claude 4.5 Sonnet89.36%86.92%90.63%87.75%86.10%88.41%
APEX-MEM + GPT-4o88.47%85.46%83.49%86.46%84.98%86.35%
MIRIX85.11%83.70%65.62%88.39%N/A85.38%
Nemori84.90%75.10%77.60%51.00%N/A79.40%
Mem065.71%47.19%75.71%58.13%N/A68.44%
Zep61.70%41.35%76.60%49.31%N/A75.14%
Full Context + GPT-4o88.53%77.70%71.88%92.70%N/A87.52%

APEX-MEM 使用 GPT-5 时总体准确率为 88.88%,比此前表现较强的 MIRIX 高 3.50 个百分点。

其中最明显的是时间问题:

  • APEX-MEM + GPT-5:90.63%;
  • MIRIX:65.62%;
  • Mem0:75.71%;
  • Zep:76.60%。

这说明保留事实演化和时间证据,确实有助于回答“之前”“现在”“何时改变”等问题。

不过,这组结果需要谨慎解读。

APEX-MEM + GPT-4o 的总体结果为 86.35%,略低于 Full Context + GPT-4o 的 87.52%。

APEX-MEM 的主要优势体现在:

  • 时间问题从 71.88% 提升到 83.49%;
  • 多跳问题从 77.70% 提升到 85.46%;
  • 可以输出更聚焦、结构化的记忆结果。

但在开放域问题上,Full Context + GPT-4o 的 92.70% 高于 APEX-MEM + GPT-4o 的 86.46%。

因此,论文最高的 88.88% 不应全部归因于记忆架构,问答模型从 GPT-4o 更换为 GPT-5 也会影响最终结果。

6.3 LongMemEval

Table 4 的结果如下:

方法问答模型Overall
APEX-MEM OnlineClaude 4.5 Sonnet86.2%
APEX-MEM OnlineGPT-585.2%
APEX-MEM OnlineClaude 4.5 Haiku82.8%
APEX-MEM OnlineGPT-4o75.0%
Nemori未注明74.6%
Session Search Top-5Claude 4.5 Sonnet72.5%
Mem0未注明71.3%
Zep未注明71.2%
A-MEM未注明59.3%
Full ContextClaude 4.5 Sonnet62.2%

APEX-MEM Online + Claude 4.5 Sonnet 达到 86.2%,比:

  • Nemori 高 11.6 个百分点;
  • Session Search Top-5 高 13.7 个百分点;
  • Full Context + Claude 4.5 Sonnet 高 24 个百分点。

相比 LOCOMO,这组结果更能体现结构化记忆的价值,因为 APEX-MEM 与 Full Context 使用了相同的 Claude 4.5 Sonnet 问答模型。

这说明在超长、多会话环境中,先筛选相关文档、再构建时间属性图,能够比直接输入完整历史更好地抑制噪声。

6.4 工具消融实验

Table 3 比较了不同工具组合:

工具组合Single-HopMulti-HopTemporalOpen-DomainAdversarialOverall
SchemaViewer + EntityLookup80.85%76.64%72.92%76.34%77.80%77.19%
+ GraphSQL80.78%79.75%82.29%78.00%81.16%79.45%
+ Search85.46%84.74%79.17%89.18%87.22%87.00%

加入 GraphSQL 后:

  • 总体准确率从 77.19% 提升到 79.45%;
  • 多跳问题从 76.64% 提升到 79.75%;
  • 时间问题从 72.92% 提升到 82.29%。

这说明 SQL 的连接、排序和时间计算能力主要帮助结构化推理任务。

进一步加入 Search 后:

  • 总体准确率提升到 87.00%;
  • 开放域问题从 78.00% 提升到 89.18%;
  • 多跳问题提升到 84.74%;
  • 对抗问题提升到 87.22%。

不过,完整系统的时间准确率为 79.17%,反而低于 GraphSQL 组合的 82.29%。

这说明 Search 虽然提高了总体覆盖率,却可能引入更多文本噪声。对于精确时间问题,GraphSQL 有时比混合检索更稳定。

6.5 为什么不能只使用 GraphSQL

论文统计发现,只使用 GraphSQL 的系统需要 27282 次工具调用,而完整混合系统只需要 8260 次,前者约为后者的 3.3 倍。

原因是 GraphSQL Agent 需要反复完成:

查看 Schema
↓
寻找实体
↓
确认属性名称
↓
生成 SQL
↓
处理 SQL 错误
↓
重新查询

而 Search 可以先快速提供相关子图,EntityLookup 可以直接返回实体快照,再由 GraphSQL 完成必要的精确推理。

因此,不同工具的职责是互补的:

  • Search 负责提高召回;
  • EntityLookup 负责实体定位;
  • GraphSQL 负责精确推理;
  • SchemaViewer 负责降低查询错误。

6.6 SQL 执行与错误恢复

附录 Table 11 显示:

问答模型SQL 成功率
Claude Sonnet 4.597.6%
GPT-593.4%
Claude Haiku 4.595.4%
Claude Sonnet 4.5(GraphSQL Only)98.8%

Agent 能够从约 87% 的 SQL 失败中恢复,主要方式包括:

  • 45%:重新调用 SchemaViewer 检查表结构;
  • 28%:退回 EntityLookup 获取实体信息;
  • 14%:退回 Search 使用语义检索。

这说明多工具架构不仅是为了提高召回,也形成了工具级错误恢复机制。

6.7 SealQA-Hard

Table 5 的关键结果如下:

方法模型Accuracy
APEX-MEM OnlineGPT-540.1%
APEX-MEM OnlineClaude 4.5 Sonnet35.2%
普通搜索 AgentGPT-538.6%
普通搜索 AgentO334.6%
APEX-MEM OnlineGPT-4o19.0%
普通搜索 AgentDeepSeek-R115.4%
普通搜索 AgentGPT-4o15.0%

APEX-MEM + GPT-5 达到约 40.1%,比普通 GPT-5 搜索 Agent 的 38.6% 高约 1.5 个百分点,比 O3 高 5.5 个百分点。

虽然取得了最好结果,但 40.1% 本身仍然不高。

这说明面对大量互相冲突、只有少数文档真正相关的开放式搜索环境,追加式属性图仍然不能完全解决:

  • 错误事实抽取;
  • 隐式关系缺失;
  • 文档可信度判断;
  • 复杂冲突消解;
  • 长链条实体链接。

6.8 追加式存储的时间推理结果

附录 Table 12 给出了不同更新策略的时间问题结果:

系统是否追加式Temporal
APEX-MEM90.63%
Zep部分76.60%
Mem0否,事实合并75.71%
MIRIX否,状态合并65.62%

APEX-MEM 比其他方法高 14 到 25 个百分点。

这支持了“保留旧事实有利于时间推理”的判断。

但需要注意,这不是严格控制变量的内部消融实验。不同系统在:

  • 图结构;
  • 抽取模型;
  • 检索流程;
  • 问答模型;
  • 提示词;
  • 工具数量

等方面都不完全相同。

因此,更准确的表述是:

实验结果与追加式存储的设计动机一致,但尚不能证明全部提升都来自追加式更新本身。

6.9 成本分析

APEX-MEM 的成本包含两部分:

  1. 图构建成本:对话级的一次性成本;
  2. 查询成本:每次问题产生的检索和 Agent 推理成本。

论文指出,图构建摊销后只占整体成本的一部分,更主要的成本来自:

  • 记忆检索内容;
  • 多轮 Agent 推理;
  • 工具调用与返回格式;
  • 系统提示词。

附录 Table 10 给出的平均每次查询 token 分解为:

组成Token/Query占比
图构建摊销1355716.6%
系统提示词78549.6%
记忆检索2174526.6%
Agent 循环1617419.8%
工具格式开销2227427.3%
总计81604100%

工具格式和检索内容占比最高。

这说明 APEX-MEM 虽然减少了无关历史,却不是一个低成本的简单 RAG 系统。它将部分长上下文成本转化成了:

  • 图构建成本;
  • 多次工具调用;
  • SQL 生成成本;
  • Agent 规划成本。

在生产环境中,如果用户只偶尔查询一次,图构建成本可能难以摊销;如果同一份长期记忆会被频繁查询,结构化图的收益才更容易体现。


七、局限性与未来方向

1. 强依赖事实抽取质量

图数据库不会自动保证事实正确。

如果抽取模型:

  • 漏掉隐式关系;
  • 错误解析相对时间;
  • 混淆实体;
  • 错误判断属性类型;
  • 将推测当成事实

那么后续 GraphSQL 只会更精确地查询错误数据。

2. 强依赖 Agent 的工具使用能力

论文发现 GPT-4o 更容易在 SQLite 查询和工具选择上出错。

这意味着 APEX-MEM 的最终能力不仅取决于记忆表示,还依赖问答模型能否:

  • 理解 Schema;
  • 生成正确 SQL;
  • 判断应该使用哪个工具;
  • 从工具错误中恢复;
  • 知道何时停止检索。

因此,更换模型后,系统效果可能明显波动。

3. 工具调用次数较多

多数 Agent 需要大约 20 次工具调用才能接近性能上限。

这会带来:

  • 更高延迟;
  • 更多 token 消耗;
  • 更多失败点;
  • 更复杂的日志和监控;
  • 更高推理成本。

论文提出的后续方向包括学习工具路由策略和停止条件,将平均调用次数从 20–30 次降低到 10–15 次。

4. 当前实现使用 SQLite 模拟图查询

APEX-MEM 在概念上是属性图,但实验实现使用 SQLite。

优点是:

  • 部署简单;
  • SQL 工具成熟;
  • 便于实现只读安全限制;
  • 时间计算和聚合方便。

局限是:

  • 深层图遍历需要复杂 JOIN;
  • Schema 发现成本较高;
  • 大规模图查询效率未被充分验证;
  • 图数据库是否能减少工具调用仍需实验。

5. 在线构建依赖预检索召回率

LongMemEval 和 SealQA-Hard 并没有为所有文档构建完整图,而是先检索相关文档。

如果关键文档在预检索阶段没有进入 D r e l D_{\mathrm{rel}} Drel,后续再强的图推理也无法恢复。

因此,在线方案仍然继承了传统 RAG 的召回瓶颈。

6. 缺少多模态和生成任务验证

论文主要评估长期对话问答。

尚未覆盖:

  • 对话摘要;
  • 多模态长期记忆;
  • 代码 Agent;
  • 桌面操作 Agent;
  • 长期任务规划;
  • 主动个性化;
  • 根据记忆生成长篇内容。

论文也将事件摘要和多模态对话生成列为未来方向。

7. 代码暂未公开

论文当前版本没有提供公开代码仓库。

这使得以下细节较难独立复现:

  • 完整 SQLite Schema;
  • 抽取和解析提示词;
  • Search 混合检索权重;
  • 实体合并阈值;
  • LLM-as-a-Judge 提示词;
  • token 成本统计口径。

八、我的理解和启发

1. 不要在写入阶段过早决定“真相”

很多记忆系统在写入时就必须选择:

ADD
UPDATE
DELETE
NOOP

这种设计适合稳定事实,却不一定适合随时间变化的事实。

例如:

用户喜欢跑步
用户因为受伤暂停跑步
用户恢复后重新开始跑步

这些记录不是简单的互相否定,而是一个完整的状态演化过程。

APEX-MEM 给我的最大启发是:

写入阶段应该优先保存事实、时间和证据;是否覆盖、哪条有效,可以根据具体问题推迟到查询阶段判断。

2. 记忆需要区分“事实时间”和“写入时间”

实际 Agent 项目中至少应该保存:

created_at:记忆什么时候写入系统
event_time:事情什么时候发生
valid_from:事实从什么时候开始有效
valid_to:事实什么时候失效
source:事实来自哪段对话或文档

如果只有 created_at,系统无法正确处理用户回忆过去事件或补充历史信息的情况。

例如,用户今天说:

我去年在上海工作。

写入时间是今天,但事实时间是去年。这两个时间不能混为一谈。

3. 图结构最大的价值不是“关联更多”,而是支持计算

相比普通向量检索,图结构的优势不只在于找出相关实体,还在于能够执行:

  • 多跳连接;
  • 时间排序;
  • 时间区间过滤;
  • 数量统计;
  • 聚合计算;
  • 事实变化检测;
  • 证据回溯。

因此,如果自己的 Agent 只需要召回一句偏好,向量库可能已经足够。

只有当任务经常出现下面的问题时,属性图才更有价值:

什么时候发生?
发生之前是什么状态?
两个事实之间相隔多久?
某个人的上级的职位是什么?
过去一个月出现了多少次?

4. 检索工具应该按问题类型分工

可以参考 APEX-MEM,将记忆查询分成不同通道:

问题类型更适合的工具
查找某个实体的当前状态EntityLookup
开放式回忆、表述模糊Search
时间排序、数量统计SQL
多跳关系GraphSQL
不清楚图结构SchemaViewer

这比所有问题都执行同一种向量检索更加灵活。

5. 应保留原始证据层

结构化记忆并不意味着可以删除原始对话。

一个更可靠的架构应该包含:

原始对话层
↓
事件与事实层
↓
实体关系层
↓
查询时生成的记忆摘要

其中:

  • 原始对话用于审计和纠错;
  • 事件层保存时间演化;
  • 实体层支持跨会话链接;
  • 摘要层服务当前 Agent 决策。

6. 可以如何应用到自己的 Agent

如果暂时不实现完整属性图,可以先设计一张追加式事实表:

memory_facts(
    id,
    subject,
    property,
    value,
    value_type,
    event_time,
    valid_from,
    valid_to,
    confidence,
    source_session,
    source_turn,
    evidence_text
)

写入时不直接覆盖旧记录。

查询“当前状态”时:

SELECT *
FROM memory_facts
WHERE subject = ?
  AND property = ?
ORDER BY valid_from DESC
LIMIT 1;

查询历史变化时:

SELECT *
FROM memory_facts
WHERE subject = ?
  AND property = ?
ORDER BY valid_from ASC;

这已经能够实现 APEX-MEM 最核心的思想:

追加保存
+
时间排序
+
证据追踪
+
查询时解析

7. 与其他记忆论文的联系

方法主要关注点适合解决的问题
Mem0事实记忆生命周期当前事实如何写入、更新和删除
A-MEM动态链接记忆记忆如何关联和演化
Zep时间知识图谱事实的时间关系
MIRIX多种专用记忆不同记忆类型如何路由
MEM1滚动内部状态当前长程任务如何控制上下文
APEX-MEM追加式时间事件图冲突事实如何保留并在查询时解析

我认为,APEX-MEM 更适合作为长期持久记忆层,而 MEM1 更适合作为当前任务的工作记忆层。

两者可以组合成:

当前工具反馈
↓
MEM1 风格滚动工作状态
↓
需要长期信息时查询 APEX-MEM
↓
返回时间一致的紧凑记忆
↓
继续下一步决策

九、总结

APEX-MEM 提出了一套面向长期对话的半结构化记忆系统。

它的核心流程是:

非结构化对话
↓
抽取实体、事件、事实和时间
↓
执行实体与属性解析
↓
以追加方式写入属性图
↓
用户提出问题
↓
多工具 Agent 检索图和原始证据
↓
在查询时解决事实冲突

论文的三个核心贡献是:

  1. 使用实体—事件混合本体表示长期对话;
  2. 使用追加式存储保存事实的完整时间演化;
  3. 使用 SchemaViewer、EntityLookup、GraphSQL 和 Search 组成多工具检索 Agent。

实验中:

  • APEX-MEM + GPT-5 在 LOCOMO 上达到 88.88%;
  • APEX-MEM Online + Claude 4.5 Sonnet 在 LongMemEval 上达到 86.2%;
  • 时间问题准确率达到 90.63%;
  • 在 SealQA-Hard 上达到约 40.1%。

不过,APEX-MEM 的效果高度依赖:

  • 前置事实抽取质量;
  • 实体链接质量;
  • 问答模型的 SQL 和工具调用能力;
  • 多轮工具调用成本;
  • 在线预检索的召回率。

对实际 Agent 开发而言,这篇论文最重要的启发是:

长期记忆中的新旧事实不一定需要在写入时立即合并。对于会随时间变化的信息,更可靠的方式是保留完整事实演化、时间范围和原始证据,并在具体问题到来时再判断哪条事实有效。


参考资料

Logo

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

更多推荐