Zep: A Temporal Knowledge Graph Architecture for Agent Memory

论文阅读:Zep——面向 Agent Memory 的时序知识图谱架构

论文标题:Zep: A Temporal Knowledge Graph Architecture for Agent Memory
作者:Preston Rasmussen, Pavlo Paliychuk, Travis Beauvais, Jack Ryan, Daniel Chalef
作者机构:Zep AI
发表位置:arXiv 预印本
arXiv 编号:2501.13956
提交时间:2025 年 1 月 20 日
原文链接:https://arxiv.org/abs/2501.13956
PDF:https://arxiv.org/pdf/2501.13956
Graphiti:https://github.com/getzep/graphiti
主题:Agent Memory、Temporal Knowledge Graph、GraphRAG、Long-term Memory
核心问题:如何让 Agent 在持续增长、不断发生变化的长期交互数据中,以较低的上下文成本维护、更新并检索带有时间信息的长期记忆?


1. Introduction:为什么普通 RAG 不够用?

LLM Agent 的一个基本限制是上下文窗口。

即使模型支持很长的 Context,也不意味着 Agent 可以无限地把:

  • 历史对话;
  • 用户信息;
  • 企业业务数据;
  • 世界知识;
  • 不断产生的新事件;

全部塞进 Prompt。

传统 RAG 的典型工作方式是:

文档
  ↓
切块
  ↓
Embedding
  ↓
向量数据库
  ↓
根据 Query 检索相关文本
  ↓
放入 LLM Context

这种方法非常适合相对静态的知识库。

问题在于,Agent Memory 面对的数据不是静态文档,而是一个持续变化的世界。

例如用户可能先说:

我在 A 公司工作。

几个月之后又说:

我已经离开 A 公司,现在加入 B 公司了。

如果把两条信息都作为普通文本放进向量数据库,那么数据库只知道:

用户 —— 工作于 —— A 公司
用户 —— 工作于 —— B 公司

但真正需要表示的是:

用户 —— 工作于 —— A 公司
有效时间:过去某段时间

用户 —— 工作于 —— B 公司
有效时间:从某个时间点开始至今

也就是说,Memory 不仅需要回答:

“有哪些事实?”

还要回答:

“这个事实什么时候成立?”

以及:

“这个事实现在还成立吗?”

论文因此认为,面向长期运行的 Agent,需要一种能够表示动态关系和关系历史的 Memory。

Zep 给出的答案是:

Temporal Knowledge Graph(时序知识图谱)。

Zep 本身是一个 Agent Memory 服务,而其核心知识图谱引擎叫作 Graphiti

Graphiti 可以同时处理:

  • 非结构化对话数据;
  • 结构化业务数据;

并在知识发生变化时动态更新图,同时保留历史事实,而不是简单覆盖旧信息。


2. Knowledge Graph Construction:如何构建 Memory Graph?

Zep 的 Memory 是一个动态时序知识图谱。

论文将整个图划分为三个层次:

层级 原文名称 保存什么
第一层 Episode Subgraph 原始消息、文本、JSON
第二层 Semantic Entity Subgraph 实体以及实体之间的事实关系
第三层 Community Subgraph 高度关联实体形成的社区及其摘要

因此可以将其整体理解为:

原始 Episode
    ↓
实体 + Fact
    ↓
Entity Graph
    ↓
Community

其中 Episode 保留原始信息,Entity / Fact 提供结构化语义,Community 则进一步提供更高层次的概括。

论文将这种组织方式描述为:

Episodes → Facts → Entities → Communities

这与只保存文本 Chunk 的传统 RAG 有明显区别。


2.1 三层 Memory Graph

2.1.1 Episode Subgraph:保存原始经历

Episode 是 Graphiti 最底层的数据单位。

Episode 可以有三种类型:

  • Message;
  • Text;
  • JSON。

由于本文实验主要研究 Conversation Memory,因此论文重点讨论的是 Message。

一个 Message 大致包含:

speaker + message content + timestamp

例如:

Alice:
I started my new job two weeks ago.

Episode 的一个重要作用是:

保留原始数据。

Graphiti 并不会在将对话转换成实体和关系之后就丢掉原始消息。

因此可以把 Episode 层理解成一个 non-lossy data store,即无损的原始记忆层

Entity 和 Fact 都可以反向追溯到产生它们的 Episode。

这使得:

Fact
 ↓
找到来源 Episode
 ↓
得到原始对话

成为可能。

反过来,也可以从 Episode 找到其中提取出的实体和 Fact。

论文指出,这种双向索引未来可以用于 Citation、Quotation 等场景,不过这些能力并没有在本文实验中进一步评估。


2.2 为什么需要 Episode 和 Semantic Memory 两层?

论文将这种设计与人类记忆中的:

  • Episodic Memory(情景记忆)
  • Semantic Memory(语义记忆)

联系起来。

Episode 保存的是具体发生过的事情。

例如:

2025-01-10:
Alice 说她开始在 Google 工作。

Semantic Memory 则把其中的意义抽取出来:

Alice —— WORKS_FOR —— Google

因此:

Episode
=
具体发生过什么

Semantic Entity / Fact
=
这些经历意味着什么

这样既保留原始信息,又获得方便检索和推理的结构化表示。


3. Temporal Modeling:Zep 的关键——双时间模型

Graphiti 和普通 Knowledge Graph 的一个关键区别是时间。

每一条 Message 都包含一个 Reference Timestamp:

t_ref

也就是这条消息发生的时间。

这个时间很重要,因为自然语言经常出现:

next Thursday
two weeks ago
last summer
three months later

如果没有消息本身的时间,就无法把这些相对时间转换成真正的日期。


3.1 两条时间轴

Graphiti 使用了一个 Bi-temporal Model(双时间模型)

它维护两个不同的时间维度:

T  = 现实世界中的事件时间
T' = 数据进入 Zep 系统的事务时间

也就是说,要区分:

一件事情什么时候是真的?

以及:

系统什么时候知道这件事情?

这两个时间可能完全不同。

例如:

2025-01-01:
Alice 加入了 Company A

2025-03-01:
Alice 才告诉 Agent:
“我两个月前加入了 Company A。”

那么:

事实有效时间:
2025-01-01

Zep 获得这个事实的时间:
2025-03-01

两者不是同一个概念。


3.2 Fact 上的四个时间字段

Graphiti 为 Fact Edge 维护四类时间信息:

t'_created
t'_expired

t_valid
t_invalid

可以理解成:

时间 含义
t'_created 这条 Fact 什么时候被写入 Graphiti
t'_expired 这条 Fact 什么时候在数据库事务层被废止
t_valid 这条事实在现实世界什么时候开始成立
t_invalid 这条事实在现实世界什么时候不再成立

因此一条关系不是简单的:

Alice -- WORKS_FOR --> Google

而更接近:

Alice -- WORKS_FOR --> Google

valid_at: ...
invalid_at: ...

这使得 Graphiti 不只是记录“当前状态”,同时能够记录:

关系如何随时间演化。


4. Semantic Entities and Facts

Episode 进入系统之后,需要被转换成实体和关系。

整个过程可以概括为:

Episode
  ↓
Entity Extraction
  ↓
Entity Resolution
  ↓
Fact Extraction
  ↓
Fact Resolution
  ↓
Temporal Extraction
  ↓
Edge Invalidation
  ↓
写入 Knowledge Graph

这部分是 Graphiti 构建长期记忆的核心。


4.1 Entity Extraction:从消息中抽取实体

Graphiti 首先从当前 Message 中提取实体。

不过模型并不是只看当前消息。

论文中实际使用的是:

当前消息 + 前 n 条消息

其中:

n = 4

即提供前两个完整 Conversation Turn 作为上下文。

例如:

User:
I recently moved to Seattle.

Assistant:
How do you like it?

User:
The weather takes some getting used to.

如果只分析最后一句:

The weather takes some getting used to.

就很难知道这里讨论的是 Seattle。

因此 Entity Extraction 需要一定的局部 Conversation Context。


4.2 Speaker 本身也是 Entity

在 Message 类型的 Episode 中,Graphiti 会自动把 Speaker 提取为实体。

例如:

Alice:
I recently joined Google.

至少应该产生:

Alice
Google

论文附录中的 Prompt 明确规定:

Speaker / Actor 必须作为第一个 Entity 提取。

同时要求:

  • 提取重要实体、概念和 Actor;
  • 不要把 Relationship / Action 本身创建成 Node;
  • 不要把日期、时间和年份创建成 Node;
  • 尽可能使用完整明确的实体名称。

时间信息之后会被附加在 Edge 上。


4.3 Reflection:再次检查实体抽取

初次 Entity Extraction 后,Graphiti 还使用了一种受到 Reflexion 启发的 Reflection 过程。

目的包括:

  • 减少遗漏;
  • 降低 Hallucination;
  • 提高 Entity Extraction Coverage。

也就是说,实体抽取不是单次 LLM 输出后立即结束,而是会额外进行检查。

同时系统还会为 Entity 生成 Summary,用于后续:

  • Entity Resolution;
  • Retrieval。

5. Entity Resolution:判断两个名字是不是同一个实体

长期对话中,同一个实体很容易以不同名字出现。

例如:

Robert Downey Jr.
Robert
RDJ
Tony Stark actor

如果每次都创建一个新 Node,Knowledge Graph 会迅速出现大量重复实体。

因此 Graphiti 在 Entity Extraction 之后还要执行:

Entity Resolution(实体消歧 / 实体解析)。


5.1 先生成 Embedding

系统首先把 Entity Name 转换成:

1024-dimensional embedding

然后在已有 Entity Node 中执行 Cosine Similarity Search。

除此之外,还会对:

  • Entity Name;
  • Entity Summary;

进行 Full-text Search。

因此候选实体来自两条检索路径:

Embedding Similarity
+
Full-text Search

5.2 再让 LLM 判断是不是同一个 Entity

检索得到 Candidate Nodes 后,Graphiti 将:

New Entity
Existing Candidate Entities
Episode Context

一起交给 LLM。

LLM 判断:

is_duplicate = true / false

如果是重复实体,还需要返回已有实体的 UUID,并生成一个更加完整的 Entity Name 和 Summary。

所以整体不是:

Embedding 相似
→ 直接 Merge

而是:

Embedding + Full-text
       ↓
召回候选 Entity
       ↓
LLM Entity Resolution
       ↓
决定是否 Merge

Embedding 负责缩小搜索空间,LLM 负责最终的语义判断。


5.3 为什么不用 LLM 自己生成 Cypher?

完成 Entity Resolution 后,系统需要真正把数据写入图数据库。

Graphiti 使用的是:

预定义 Cypher Query。

而不是让 LLM 动态生成 Cypher。

论文给出的理由主要有两个:

  • 保证数据库 Schema 一致;
  • 减少 LLM Hallucination 导致错误 Query 的风险。

因此 LLM 的职责主要是:

理解内容
抽取 Entity / Fact
进行 Resolution
判断 Temporal 信息

而具体数据库操作仍然由固定程序逻辑完成。


6. Facts:关系本身也是 Memory

有了 Entity 后,Graphiti 从 Message 中继续提取 Entity 之间的 Fact。

例如:

Alice:
I started working at OpenAI last month.

可能得到:

Entity:
Alice
OpenAI

Fact:
Alice WORKS_FOR OpenAI

论文附录要求,每个 Fact:

  • 必须发生在两个不同 Entity 之间;
  • Relation Type 应为简洁的大写描述;
  • 同时保存更加详细的 Fact 文本;
  • 在必要时考虑 Relationship 的时间信息。

例如:

relation_type:
WORKS_FOR

fact:
Alice started working at OpenAI.

6.1 一个复杂 Fact 可以涉及多个实体

论文指出,同一个 Fact 可以被提取到不同 Entity Pair 之间。

这样可以近似表达复杂的 Multi-entity Fact。

作者将这种实现描述为一种对 Hyper-edge(超边) 的实现方式。

因此 Graphiti 的 Fact 并不仅限于最简单的:

A -- relation --> B

还能够通过多个关联 Edge 表达涉及多个实体的复杂事件。


7. Fact Resolution:关系也需要去重

和 Entity 一样,Fact 也可能重复出现。

例如用户多次说:

I work at OpenAI.

I currently work for OpenAI.

OpenAI is my employer.

这些句子的文字不同,但表达的是相同 Fact。

所以 Graphiti 也执行:

Edge Deduplication / Fact Resolution。


7.1 先限制到相同 Entity Pair

这里有一个很重要的工程设计。

系统并不会把新 Fact 与整个图中的所有 Fact 比较。

而是先限制:

只搜索连接相同 Entity Pair 的 Existing Edges。

例如新的 Fact 是:

Alice → OpenAI

那么只需要在:

Alice ↔ OpenAI

已有的 Edges 中进行搜索。

这样既可以防止:

语义相似但属于不同 Entity 的 Edge

被错误合并,也显著降低了搜索空间。

然后再由 LLM 判断:

New Edge 与 Existing Edge
是否表达相同的事实?

如果相同,就进行 Deduplication。


8. Temporal Extraction:从自然语言中抽取事实有效时间

Graphiti 接下来会从 Fact 中提取时间。

输入包括:

Previous Messages
Current Message
Reference Timestamp
Fact

例如:

Reference Timestamp:
2025-03-15

Message:
I started working at OpenAI two weeks ago.

系统应该根据 Reference Timestamp 将:

two weeks ago

解析成具体时间。

附录中的 Prompt 明确要求:

  • 相对时间根据 Reference Timestamp 计算;
  • 输出 ISO 8601;
  • 如果只有日期,没有具体时刻,则使用 00:00:00;
  • 如果只知道年份,则使用当年 1 月 1 日;
  • 如果事实使用现在时,可以使用 Reference Timestamp 作为 valid_at
  • 只有时间确实属于当前 Fact 时才应抽取;
  • 不应从相关事件中随意推断 Fact 的日期。

因此 Temporal Extraction 并不是单纯识别文本中有没有日期,而是判断:

这个时间是不是当前 Relationship 本身的有效时间?


9. Edge Invalidation:新记忆如何修改旧记忆?

这是 Graphiti 最关键的设计之一。

假设已有:

Alice -- WORKS_FOR --> Company A

后来用户说:

I left Company A and joined Company B.

传统知识图谱如果直接加入:

Alice -- WORKS_FOR --> Company B

就会变成:

Alice -- WORKS_FOR --> Company A
Alice -- WORKS_FOR --> Company B

从图本身无法知道哪个才是当前状态。

Graphiti 会检查:

New Edge
vs
Semantically Related Existing Edges

并使用 LLM 判断它们是否冲突。

如果存在时间上重叠的矛盾关系,旧 Edge 会被 Invalidate(失效)

例如:

Alice WORKS_FOR Company A
valid: 2023-01-01
invalid: 2025-01-01

Alice WORKS_FOR Company B
valid: 2025-01-01
invalid: null

Graphiti 并不会删除:

Alice 曾经在 Company A 工作

而只是明确:

这个事实已经不再成立。

这样就同时保留了:

  • Current State;
  • Historical State。

对于长期 Agent Memory,这比简单覆盖旧事实更重要,因为历史状态本身仍可能在未来被查询。


10. Community Subgraph:在 Entity Graph 上建立更高层语义

当 Episode 和 Semantic Entity Graph 建立之后,Graphiti 进一步建立:

Community Subgraph(社区子图)。

Community 是由一组紧密连接的 Entity 构成的 Cluster。

例如一个大型长期 Memory Graph 可能自然形成:

工作相关实体
家庭相关实体
旅游相关实体
研究相关实体
某个项目相关实体

Community Node 保存这个 Cluster 的高层 Summary。

于是:

Entity / Fact

解决局部细粒度知识,

而:

Community

负责表达更高层次的主题和结构。


10.1 为什么不用 GraphRAG 的 Leiden?

Graphiti 的 Community Detection 基于 GraphRAG 的思路,但算法上存在区别。

GraphRAG 使用:

Leiden Algorithm

Graphiti 使用:

Label Propagation

论文选择 Label Propagation 的主要原因是:

它更容易动态扩展。

Agent Memory 是持续更新的。

如果每增加一个 Entity 都重新对整个 Knowledge Graph 做完整 Community Detection,成本很高。

因此 Graphiti 使用增量更新。


10.2 新 Entity 如何加入 Community?

当新的 Entity Node 加入 Graph 时:

New Entity
   ↓
查看 Neighbor Nodes
   ↓
统计 Neighbor 所属 Community
   ↓
选择数量最多的 Community
   ↓
加入该 Community
   ↓
更新 Community Summary

这相当于执行一次局部 Label Propagation。

这样不需要每次重新计算整个 Graph。


10.3 代价:Community 会逐渐漂移

这种增量方法并不完美。

随着越来越多 Node 被增量加入:

动态更新得到的 Community

会逐渐偏离:

从头完整运行 Label Propagation

得到的 Community。

因此 Graphiti 仍然需要:

Periodic Community Refresh。

也就是偶尔重新进行完整 Community Detection。

论文将这个设计视为一种工程上的折中:

频繁全量更新
→ 更准确
→ 延迟和成本高

局部动态更新
→ 快
→ 长期会产生漂移

局部更新 + 周期性 Refresh
→ 在两者之间折中

10.4 Community Summary

Community Node 会保存其成员实体的高级 Summary。

这里使用与 GraphRAG 类似的:

Iterative Map-Reduce-style Summarization。

除此之外,还会根据 Community Summary 生成 Community Name。

Community Name 中包含:

  • Key Terms;
  • Relevant Subjects。

随后对 Community Name 进行 Embedding。

这样 Community 本身也可以参与向量检索。


11. Memory Retrieval:Memory 写进去之后怎么找出来?

知识图谱只是存储结构。

真正给 Agent 使用时,还需要回答:

给定当前 Query,到底应该从 Graph 中拿哪些信息放进 Context?

Zep 将 Retrieval Pipeline 分成三个阶段:

Query
  ↓
Search
  ↓
Reranker
  ↓
Constructor
  ↓
Context
  ↓
LLM

论文形式化表示为:

f(query) = Constructor(Reranker(Search(query)))

也就是:

Search → Rerank → Context Construction

12. Search:三种检索机制

Zep 同时使用三种 Search:

Search 作用
Cosine Similarity 找语义相似内容
BM25 Full-text Search 找词面相似内容
Breadth-first Search 找图结构上邻近的内容

作者希望三种检索分别捕获不同形式的“相关性”。


12.1 Cosine Similarity:语义相关

Embedding Search 用于寻找:

语义上类似

的 Entity、Fact 或 Community。

即使 Query 与 Memory 使用了不同词汇,只要语义接近,也有机会召回。


12.2 BM25:词面相关

BM25 Full-text Search 更关注:

关键词是否重合

Embedding Search 与 BM25 形成互补。

例如一些:

  • 人名;
  • 产品名;
  • 公司名;
  • 专有名词;

使用 Exact / Lexical Match 往往非常重要。


12.3 BFS:图结构相关

第三种 Search 是:

Breadth-First Search(广度优先搜索)。

它利用 Knowledge Graph 本身的结构。

基本思想是:

如果两个 Node / Edge 在图上距离很近,它们很可能处于相似的 Conversation Context 中。

因此可以先找到一个重要 Entity,再向其周围扩展 n-hop

例如:

Query
 ↓
找到 Alice
 ↓
BFS
 ↓
Alice 的工作
Alice 的同事
Alice 所在项目
Alice 最近相关事件

这是一种传统向量数据库没有的 Contextual Similarity。


12.4 最近 Episode 也可以成为 BFS Seed

论文特别提到,BFS 可以接受 Node 作为 Seed。

因此可以把:

Recent Episodes 中出现的 Entity

作为 BFS 起点。

这使 Retrieval 不仅依赖当前 Query,还能利用最近 Conversation State。

例如用户刚刚讨论:

Project Phoenix

下一句问:

Who was responsible for the deployment?

Query 本身未必出现 Project Phoenix。

但最近 Episode 可以把:

Project Phoenix

相关 Node 作为 BFS Seed,从而检索其附近关系。


12.5 三种 Search 的互补关系

作者总结三类相似性为:

BM25
→ Word Similarity

Cosine Similarity
→ Semantic Similarity

BFS
→ Contextual / Graph Similarity

三者共同用于 Candidate Generation。

这一阶段优先考虑的是:

Recall。

即尽量不要漏掉真正有用的信息。


13. Reranker:从高 Recall 变成高 Precision

Search 找到大量候选结果之后,再进入 Reranking。

Zep 支持多种 Reranker。

包括:

  • Reciprocal Rank Fusion(RRF);
  • Maximal Marginal Relevance(MMR);
  • Episode Mentions Reranker;
  • Node Distance Reranker;
  • Cross-encoder Reranker。

13.1 RRF 和 MMR

RRF 用于融合来自多个 Retriever 的排序结果。

例如:

BM25 Ranking
Embedding Ranking
BFS Ranking
       ↓
      RRF
       ↓
Unified Ranking

MMR 则进一步考虑:

Relevant
+
Diversity

避免 Top-K 中充满高度重复的内容。


13.2 Episode Mentions Reranker

这是一个利用 Graph 结构和 Conversation History 的 Reranker。

如果某个 Entity / Fact 在大量 Episode 中反复被提及,那么它的重要程度更高。

因此可以根据:

Mention Frequency

对结果重新排序。

简单来说:

长期对话中反复出现的 Memory
→ 更容易被检索回来

13.3 Node Distance Reranker

系统还可以指定一个 Centroid Node。

然后根据 Candidate 与这个 Node 的图距离重新排序:

离 Centroid 更近
→ Ranking 更高

这样可以让 Retrieval 聚焦在 Knowledge Graph 的某个局部区域。


13.4 Cross-encoder

最复杂的方式是 Cross-encoder。

模型直接联合考虑:

Query + Candidate

并产生 Relevance Score。

这种方式通常具有较强的语义判断能力,但论文也指出:

计算成本最高。

因此 Graphiti 的 Retrieval 并不是固定的单一 Search Pipeline,而是一个可以按需求组合不同 Search 和 Reranking 策略的系统。


14. Constructor:把 Graph 重新变成 LLM 能读的 Context

完成 Search 和 Reranking 后,Graph 结构本身还不能直接作为普通 Chat Model 的 Prompt。

因此最后还有:

Constructor。

Constructor 将筛选出的:

  • Fact Edge;
  • Entity Node;
  • Community Node;

转换成文本。

Fact 包括:

Fact
Valid Date
Invalid Date

Entity 包括:

Entity Name
Entity Summary

Community 则主要提供:

Community Summary

最终生成类似:

FACTS

Alice works at OpenAI
(Date range: 2025-01-01 - present)

...

ENTITIES

Alice:
...

OpenAI:
...

这样的 Context,再提供给 LLM。

因此完整 Memory Pipeline 是:

Conversation
    ↓
Episode
    ↓
Entity / Fact Extraction
    ↓
Entity / Fact Resolution
    ↓
Temporal Processing
    ↓
Knowledge Graph
    ↓
Search
    ↓
Rerank
    ↓
Context Constructor
    ↓
LLM Response

15. Experiments

论文使用两个 Agent Memory Benchmark:

  1. Deep Memory Retrieval(DMR)
  2. LongMemEval

作者特别强调,Zep 是 Production System,因此除了 Accuracy,也关注:

  • Latency;
  • Context Size;
  • Scalability。

16. 模型配置

实验中的模型配置如下。

Embedding 和 Reranking

使用:

BGE-M3

完成 Embedding 和 Reranking。

Knowledge Graph Construction

使用:

gpt-4o-mini-2024-07-18

完成 Graph Construction。

也就是说,前面介绍的:

  • Entity Extraction;
  • Entity Resolution;
  • Fact Extraction;
  • Temporal Extraction;

等 LLM-based Graph Construction 操作主要使用 GPT-4o-mini。

最终回答生成

使用:

gpt-4o-mini-2024-07-18
gpt-4o-2024-11-20

为了与 MemGPT 原始 DMR 结果进行直接比较,还额外使用:

gpt-4-turbo-2024-04-09

17. Deep Memory Retrieval(DMR)

DMR 来自 MemGPT 的评测设置。

数据包含:

500 个 Multi-session Conversation

每个 Conversation:

5 个 Chat Session

每个 Session:

最多 12 条 Message

因此一个 Conversation 最多大约:

60 条 Message

每个 Conversation 对应一个 Memory Question / Answer Pair。


17.1 DMR 实验结果

论文 Table 1 的结果如下:

Memory Method Model Score
Recursive Summarization GPT-4-Turbo 35.3%
Conversation Summaries GPT-4-Turbo 78.6%
MemGPT GPT-4-Turbo 93.4%
Full-conversation GPT-4-Turbo 94.4%
Zep GPT-4-Turbo 94.8%
Conversation Summaries GPT-4o-mini 88.0%
Full-conversation GPT-4o-mini 98.0%
Zep GPT-4o-mini 98.2%

其中 MemGPT 和 Recursive Summarization 的 GPT-4-Turbo 数据直接引用自 MemGPT 论文。

Zep:

GPT-4-Turbo:
94.8%

GPT-4o-mini:
98.2%

均略微超过 Full-conversation。


17.2 DMR 使用 LLM Judge

DMR 中,作者使用 LLM Judge:

Agent Response
+
Golden Answer
       ↓
    LLM Judge
       ↓
Correct / Incorrect

因此这里报告的 Accuracy 并不是完全由 Exact Match 计算出来的,而包含 LLM-based Evaluation。


17.3 作者自己认为 DMR 不够有挑战性

论文没有把 94.8% 对 93.4% 的提升无限放大。

相反,作者专门讨论了 DMR 本身的问题。

最明显的一点是:

一个 Conversation 只有大约 60 条 Message

这些内容完全能够放进现代 LLM 的 Context Window。

实际结果也验证了这一点:

Full-context + GPT-4o-mini
=
98.0%

而:

Zep + GPT-4o-mini
=
98.2%

差距只有 0.2 个百分点。

因此 DMR 很难真正测试:

当长期 Memory 远远超过 Context Window 或模型有效 Context 能力时,Memory System 是否仍然有效?


17.4 DMR 的其他问题

作者还指出:

DMR 基本都是:

Single-turn Fact Retrieval

缺少复杂 Memory Understanding。

部分 Question 还带有较强的模糊描述,例如:

favorite drink to relax with
weird hobby

但 Conversation 中并不一定明确使用这些标签。

更重要的是,作者认为 DMR 与现实 Enterprise Agent 所面临的:

  • 长时间跨度;
  • 多 Session;
  • Knowledge Update;
  • Temporal Reasoning;

差距较大。

因此论文把更主要的实验关注放到了 LongMemEval。


18. LongMemEval

LongMemEval 提供显著更长的 Conversation。

论文使用的是:

LongMemEval_s

平均 Context 长度约:

115,000 Tokens

虽然 115K Token 仍然能够放入部分 Frontier Model 的 Context Window,但已经足够构成有意义的 Full-context Baseline。

LongMemEval 包含六类问题:

Question Type 含义
single-session-user 单 Session 中关于用户的信息
single-session-assistant 单 Session 中关于 Assistant 输出的信息
single-session-preference 用户偏好
multi-session 跨 Session 信息整合
knowledge-update 信息发生更新
temporal-reasoning 时间推理

其中后几种尤其接近 Zep 设计所针对的问题。


19. LongMemEval 的评测方式

LongMemEval 的回答评价同样使用 LLM Judge。

论文使用:

GPT-4o

配合 LongMemEval 原论文针对不同 Question Type 提供的 Evaluation Prompt。

作者指出,这套评测方式在 LongMemEval 工作中表现出与人工评价较高的相关性。

实验时间为:

2024 年 12 月 - 2025 年 1 月

Zep Service 部署在:

AWS us-west-2

测试客户端则位于 Boston 的普通 Consumer Laptop。

因此 Zep 的 Latency 结果实际上还包含网络访问远程服务产生的额外延迟,而 Full-context Baseline 不包含这部分网络延迟。


20. 为什么 LongMemEval 没有 MemGPT 结果?

作者原本希望直接比较:

Zep vs MemGPT

但 MemGPT 当时的 Framework 不支持直接导入已经存在的 Message History。

作者尝试把 Conversation Message 加入 MemGPT 的 Archival History 作为 workaround,但没有成功得到可用的 Question Response。

因此:

LongMemEval 中实际上没有 MemGPT 的有效实验结果。

最终主要比较的是:

Zep
vs
Full-context

这一点在理解论文 LongMemEval 的结果时很重要。


21. LongMemEval 总体结果

论文 Table 2 如下:

Memory Model Score Latency Latency IQR Avg Context Tokens
Full-context GPT-4o-mini 55.4% 31.3 s 8.76 s 115k
Zep GPT-4o-mini 63.8% 3.20 s 1.31 s 1.6k
Full-context GPT-4o 60.2% 28.9 s 6.01 s 115k
Zep GPT-4o 71.2% 2.58 s 0.684 s 1.6k

这里呈现出了 Zep 相比 DMR 更明显的优势。

GPT-4o-mini:

55.4%
→
63.8%

GPT-4o:

60.2%
→
71.2%

论文将其分别描述为:

15.2% relative improvement
18.5% relative improvement

22. Context 从 115K 降到约 1.6K Tokens

除了 Accuracy,另一个非常明显的差异是 Context Size。

Full-context:

115k Tokens

Zep:

约 1.6k Tokens

因此 Zep 并不是让最终 LLM 阅读整个 Conversation。

而是:

115K Conversation History
        ↓
Graph Memory
        ↓
Search + Reranking
        ↓
只取真正相关 Entity / Fact
        ↓
约 1.6K Token Context
        ↓
LLM

这解释了论文中的 Latency 差距。

GPT-4o:

Full-context:
28.9 s

Zep:
2.58 s

GPT-4o-mini:

Full-context:
31.3 s

Zep:
3.20 s

作者总结为:

Response Latency 大约降低 90%。


23. 按问题类型拆分结果

论文进一步给出了各 Question Type 的结果。

Question Type Model Full-context Zep Relative Delta
single-session-preference GPT-4o-mini 30.0% 53.3% +77.7%
single-session-assistant GPT-4o-mini 81.8% 75.0% -9.06%
temporal-reasoning GPT-4o-mini 36.5% 54.1% +48.2%
multi-session GPT-4o-mini 40.6% 47.4% +16.7%
knowledge-update GPT-4o-mini 76.9% 74.4% -3.36%
single-session-user GPT-4o-mini 81.4% 92.9% +14.1%
single-session-preference GPT-4o 20.0% 56.7% +184%
single-session-assistant GPT-4o 94.6% 80.4% -17.7%
temporal-reasoning GPT-4o 45.1% 62.4% +38.4%
multi-session GPT-4o 44.3% 57.9% +30.7%
knowledge-update GPT-4o 78.2% 83.3% +6.52%
single-session-user GPT-4o 81.4% 92.9% +14.1%

几个结果尤其值得关注。


23.1 Temporal Reasoning

GPT-4o:

45.1%
→
62.4%

GPT-4o-mini:

36.5%
→
54.1%

这是和 Graphiti 的 Temporal Design 最直接相关的一类任务。

因为 Graphiti 并非单纯保存:

Entity + Fact

而是显式维护:

Fact
+
valid_at
+
invalid_at

并处理 Fact Invalidation,因此长期时间关系已经在 Memory Construction 阶段被结构化。


23.2 Multi-session

GPT-4o:

44.3%
→
57.9%

GPT-4o-mini:

40.6%
→
47.4%

这一类问题要求从多个 Session 中整合信息。

这正是长期 Agent Memory 与普通单轮 RAG 的主要差异之一。


23.3 Knowledge Update

GPT-4o:

78.2%
→
83.3%

但 GPT-4o-mini:

76.9%
→
74.4%

反而稍有下降。

论文据此提出,更弱的模型可能还不能充分理解 Zep 提供的 Temporal Data,而更强的模型能够更好地利用这些结构化时间信息。


24. 并不是所有类型都变好

Zep 最明显的失败案例是:

single-session-assistant

GPT-4o:

Full-context: 94.6%
Zep:         80.4%

下降:

17.7%

GPT-4o-mini:

81.8%
→
75.0%

下降约:

9.06%

因此论文并没有声称 Graph Memory 对所有问题类型都优于 Full-context。

作者明确表示:

这一类别仍然需要进一步 Research 和 Engineering Work。


25. Zep 的核心设计可以如何概括?

把前面所有模块合起来,Zep 并不是简单做:

Conversation
↓
Embedding
↓
Vector DB

而是把长期 Memory 拆成:

                   ┌──────────────┐
                   │ Raw Episodes │
                   └──────┬───────┘
                          ↓
                 Entity Extraction
                          ↓
                  Entity Resolution
                          ↓
                   Fact Extraction
                          ↓
                   Fact Resolution
                          ↓
               Temporal Extraction
                          ↓
                  Edge Invalidation
                          ↓
              ┌────────────────────┐
              │ Semantic Entity KG │
              └──────────┬─────────┘
                         ↓
                Community Detection
                         ↓
                Community Summary

Query 到来后:

Query
  ↓
BM25 + Embedding + BFS
  ↓
Candidate Memory
  ↓
RRF / MMR / Graph Reranker / Cross-encoder
  ↓
Relevant Facts + Entities + Communities
  ↓
Context Constructor
  ↓
Compact Context
  ↓
LLM

因此真正重要的不是单独某一种 Retrieval Algorithm,而是:

把持续变化的 Conversation 转换成一个能够保留原始 Episode、结构化 Fact、Fact 有效时间和历史状态的动态 Knowledge Graph。


26. Graphiti 与普通 GraphRAG 的主要区别

论文在多个地方借鉴了 GraphRAG,但其目标并不完全相同。

传统 GraphRAG 更多处理:

已有文档集合
↓
构建图
↓
利用 Graph Structure 改善 Retrieval

Zep / Graphiti 更关注:

不断到来的 Conversation / Business Data
↓
持续更新 Knowledge Graph
↓
处理重复 Entity
↓
处理重复 Fact
↓
处理 Fact 冲突
↓
维护 Fact Validity
↓
保存 Historical State

因此核心问题从:

“如何从一个 Knowledge Graph 中检索?”

进一步变成:

“如何让这个 Knowledge Graph 本身随着现实世界持续演化?”

这也是论文把 Temporal 放在标题中的原因。


27. 论文中的实现细节总结

整个 Graph Construction Pipeline 中,LLM 承担了大量语义判断工作。

步骤 主要机制
Entity Extraction LLM
Reflection LLM
Candidate Entity Retrieval Embedding + Full-text Search
Entity Resolution LLM
Fact Extraction LLM
Candidate Edge Retrieval Hybrid Search
Fact Resolution LLM
Temporal Extraction LLM
Contradiction / Invalidation 判断 LLM
写入数据库 Predefined Cypher
Community Detection Label Propagation
Community Summary LLM Summarization
Memory Search BM25 + Cosine + BFS
Reranking RRF / MMR / Graph-based / Cross-encoder
Context Construction Programmatic Formatting

因此 Graphiti 既不是:

纯 Knowledge Graph Algorithm

也不是:

让 LLM 自己维护一段 Memory Text

而是一个组合系统:

LLM Semantic Extraction
+
Embedding Retrieval
+
Full-text Retrieval
+
Graph Algorithm
+
Graph Database
+
Temporal Data Model
+
Reranking

28. 一个需要注意的实验描述细节

论文 Section 4 的通用实验描述中写道,会检索:

20 个最相关的 Edge 和 Entity Node

但在 Section 4.2 的 DMR 具体描述中,又写道:

retrieve the top 10 most relevant nodes and edges

因此原文在通用实验设置与 DMR 子章节的 Top-K 描述上存在差异。

能够明确确认的是:

  • Section 4 通用描述:Top-20;
  • DMR 子章节:Top-10。

论文没有进一步解释这两个数字之间的关系。


29. 论文明确指出的局限性

论文虽然没有单独设置 Limitations Section,但正文和 Conclusion 中给出了多项限制。

29.1 DMR Benchmark 太简单

DMR:

  • Conversation 太短;
  • Full-context 本身已经接近满分;
  • 主要测试 Single-turn Fact Retrieval;
  • 部分问题描述模糊;
  • 很难代表现实 Enterprise Agent Memory。

因此它已经不足以有效区分现代 Memory System。


29.2 LongMemEval 中没有成功得到 MemGPT 对照

作者尝试运行 MemGPT,但没有成功。

因此 LongMemEval 的核心实验实际上是:

Zep vs Full-context

而不是:

Zep vs MemGPT

29.3 部分 Question Type 性能下降

尤其:

single-session-assistant

Zep 显著低于 Full-context。

说明压缩成结构化 Graph Memory 并不会在所有信息类型上都优于保留完整原文。


29.4 Graphiti 的全部 Retrieval 能力没有完整评估

论文明确指出,实验只测试了 Graphiti Search Functionality 的一个子集。

例如 Episode 与 Semantic Artifact 之间的双向追溯能力,并没有在本文实验中直接验证。


29.5 当前 Benchmark 无法评估结构化业务数据

Zep 的设计目标之一是同时融合:

Conversation History
+
Structured Business Data

但作者指出,现有 Benchmark 没有真正评价这种能力。

所以本文实验主要验证的是:

Conversation Memory。

并没有完整覆盖 Zep 所声称的整个 Enterprise Memory 使用场景。


29.6 Community 的动态更新会产生漂移

Graphiti 使用增量 Label Propagation 降低实时更新成本。

但随着时间增长:

Incrementally Updated Community

会逐渐偏离完整重新计算得到的 Community。

因此仍然需要:

Periodic Community Refresh

30. 论文提出的未来方向

作者在 Conclusion 中提出了多个后续方向。


30.1 为 Graph Construction 训练专用模型

目前大量步骤依赖通用 LLM,例如:

  • Entity Extraction;
  • Edge Extraction;
  • Resolution。

作者指出,已有研究表明 Fine-tuned Model 可以提高 Knowledge Graph Extraction 的:

  • Accuracy;
  • Cost Efficiency;
  • Latency。

因此未来可以针对 Graphiti 的 Prompt 和任务训练专门模型。


30.2 引入 Domain-specific Ontology

目前很多 LLM-generated Knowledge Graph,包括 Graphiti,都没有强制使用正式 Ontology。

作者认为:

Domain-specific Ontology(领域本体)

可能是值得进一步探索的方向。

例如在医疗领域,可以提前规定:

Patient
Disease
Medication
Doctor
Treatment

以及允许的 Relation Type。

这样可能增强 Knowledge Graph 的结构一致性。


30.3 更好的 Agent Memory Benchmark

作者认为现有 Memory Benchmark 数量有限,而且大量任务仍停留在:

Needle-in-a-haystack Fact Retrieval

未来需要更接近真实业务的评测,例如:

  • Customer Experience;
  • Cross-session Reasoning;
  • Dynamic Knowledge Update;
  • Conversation + Structured Business Data;
  • Long-term User Modeling。

30.4 与其他 GraphRAG 方法进一步结合

Graphiti 已经借鉴:

  • GraphRAG;
  • AriGraph;
  • Hierarchical RAG;

但作者认为还可以继续将其他 GraphRAG Retrieval Strategy 集成进 Zep。

例如论文专门提到,Graphiti 的 Community Key Search 与 LightRAG 的 High-level Key Retrieval 存在相似之处,将这些方法进一步结合是一个潜在方向。


30.5 更系统地评测 Cost、Latency 和 Scalability

作者认为 Memory / RAG 研究通常过于关注 Accuracy,而对 Production System 中同样关键的:

Latency
Cost
Scalability

讨论不足。

本文加入了 Retrieval Latency Benchmark,但作者认为未来还需要更加系统的 Production-level Evaluation。


31. 总结

Zep 的核心思路并不是简单地:

“使用 Knowledge Graph 做 Agent Memory。”

真正的重点在于:

使用一个能够持续更新并显式维护时间有效性的 Knowledge Graph 作为 Agent 的长期 Memory。

Graphiti 将 Memory 分成三层:

Episode
↓
Entity / Fact
↓
Community

Episode 保存原始经历,保证信息不因结构化抽取而完全丢失;

Entity 和 Fact 将 Conversation 转换成结构化 Semantic Memory;

Community 在更高层总结强关联实体。

而 Temporal Modeling 又进一步为 Fact 增加:

valid_at
invalid_at
created_at
expired_at

使系统不仅知道:

什么是真的

还能够知道:

什么时候是真的
什么时候不再是真的
系统什么时候知道这件事

当新信息与旧事实发生冲突时,Graphiti 不简单删除过去,而是通过 Edge Invalidation 维护事实的历史有效区间。

Retrieval 阶段则组合:

BM25
+
Embedding Search
+
Graph BFS
+
Reranking

最后只把少量相关 Fact、Entity 和时间信息重新构造成 LLM Context。

实验上,DMR 中 Zep 的提升较小,而且作者自己认为该 Benchmark 已经过于简单:

GPT-4o-mini:

Full-context  98.0%
Zep           98.2%

更明显的结果来自 LongMemEval。

在平均约 115K Token 的长期 Conversation 中:

GPT-4o:

Full-context:
60.2%
28.9 s
115k context tokens

Zep:
71.2%
2.58 s
1.6k context tokens

因此 Zep 展示出的主要优势并不只是“把更多历史保存下来”,而是:

把长期历史
→ 转换成动态、结构化、带时间有效性的 Memory
→ 检索真正相关的少量信息
→ 再交给 LLM

与此同时,论文也显示这种 Graph Memory 并非无条件优于 Full-context:例如 single-session-assistant 类问题中性能明显下降;LongMemEval 也没有成功获得 MemGPT 的可比实验结果。

因此这篇工作的核心落点可以概括为:

将传统偏静态的 GraphRAG 扩展为面向长期 Agent 的动态 Temporal Knowledge Graph Memory,并通过实体解析、事实去重、时间抽取、关系失效和多路图检索,使 Memory 能够随着持续交互不断演化。


参考

  1. Preston Rasmussen, Pavlo Paliychuk, Travis Beauvais, Jack Ryan, Daniel Chalef. Zep: A Temporal Knowledge Graph Architecture for Agent Memory. arXiv:2501.13956, 2025.
    https://arxiv.org/abs/2501.13956

  2. Zep. Graphiti: Temporal Knowledge Graphs for Agentic Applications.
    https://github.com/getzep/graphiti

  3. Charles Packer et al. MemGPT: Towards LLMs as Operating Systems. 2024.

  4. Darren Edge et al. From Local to Global: A Graph RAG Approach to Query-Focused Summarization. 2024.

  5. Di Wu et al. LongMemEval: Benchmarking Chat Assistants on Long-Term Interactive Memory. 2024.

  6. Petr Anokhin et al. AriGraph: Learning Knowledge Graph World Models with Episodic Memory for LLM Agents. 2024.

  7. Zirui Guo et al. LightRAG: Simple and Fast Retrieval-Augmented Generation. 2024.

posted @ 2026-09-15 16:15  YourF4u1t  阅读(25)  评论(0)    收藏  举报