1. 背景与问题

1.1 为什么 LLM Agent 需要记忆系统?

LLM Agent 在执行复杂任务时,通常需要与用户或环境进行多轮交互。如果没有记忆机制,Agent 每次交互都会近似处于“失忆”状态,无法利用历史经验、用户偏好、任务进度和长期上下文。

一个典型的外部记忆系统通常包含三类操作:

操作作用典型形式
Write写入当前交互或任务信息保存对话片段、用户偏好、任务状态
Retrieve根据当前 query 找回相关信息向量检索、关键词检索、图检索
Update调整已有记忆修改重要性、更新摘要、删除过时信息

1.2 现有记忆系统的核心问题

论文认为,许多现有 LLM Agent 记忆系统存在两个共性问题。

问题具体表现后果
预定义操作开发者需要提前规定什么时候写入、检索、更新难以适配复杂动态任务
固定结构关系类型、记忆层级或更新规则通常是预设的新知识难以自然融入系统

这会带来两个直接后果:

  1. 泛化能力差:换一个任务环境,原有记忆规则可能就不再适用。
  2. 长期交互效果下降:随着记忆积累,检索噪声增加,组织结构变得混乱。

1.3 论文试图回答的问题

如何设计一个灵活、通用、能够长期自我调整的记忆系统,让 LLM Agent 在长期交互中持续保持上下文感知能力?

A-MEM 的答案是:让记忆系统具备 agentic 能力,即让记忆不仅能被存储和检索,还能自主建立连接、更新结构、演化语义。


2. 设计灵感:Zettelkasten

A-MEM 的设计受到 Zettelkasten(卡片盒笔记法) 启发。Zettelkasten 的核心不在于“把笔记存起来”,而在于让笔记之间不断建立连接,从而形成一个能够生长的知识网络。

Zettelkasten 原则含义A-MEM 中的对应机制
原子化每张卡片只记录一个知识点每条记忆是一个独立知识单元
链接卡片之间通过显式关系相互连接LLM 判断并生成记忆链接
演化新笔记会改变旧笔记的理解方式新记忆触发旧记忆更新
网络化知识不是线性排列,而是图结构记忆库逐渐形成动态知识图

A-MEM 将这一思想与向量检索、LLM 语义分析和动态更新机制结合,形成了一个面向 LLM Agent 的长期记忆系统。


3. 方法论:A-MEM 的核心模块

A-MEM 可以被理解为四个模块组成的循环系统:

原始交互
   ↓
[1] Note Construction
   把原始交互变成结构化记忆卡片
   ↓
[2] Link Generation
   为新记忆寻找并建立相关旧记忆链接
   ↓
[3] Memory Evolution
   用新记忆反向更新相关旧记忆
   ↓
[4] Retrieve
   查询时不仅返回相似记忆,还沿链接扩展邻居记忆

四个模块的输入输出如下:

模块输入输出作用
Note Construction原始交互内容、时间戳结构化记忆卡片把对话转成可检索、可链接的记忆单元
Link Generation新记忆、已有记忆库新记忆的链接集合发现新旧记忆之间的语义关系
Memory Evolution新记忆、相关旧记忆更新后的旧记忆让记忆网络随新信息自我调整
Retrieve用户 query相关记忆及其邻居支持更完整的上下文召回

3.1 Note Construction:构建富记忆卡片

3.1.1 数学定义

设记忆集合为 M = { m 1 , m 2 , … , m N } \mathcal{M} = \{m_1, m_2, \ldots, m_N\} M={m1,m2,,mN}。每条记忆 m i m_i mi 被定义为一个元组:

m i = { c i , t i , K i , G i , X i , e i , L i } m_i = \{c_i, t_i, K_i, G_i, X_i, e_i, L_i\} mi={ci,ti,Ki,Gi,Xi,ei,Li}

各字段含义如下:

符号含义示例
c i c_i ci原始交互内容,即 raw text“用户说:我喜欢摄影,尤其是风景照”
t i t_i ti时间戳“2023-11-17 10:54:03”
K i K_i KiLLM 生成的关键词列表["photography", "scenery", "hobby"]
G i G_i GiLLM 生成的标签列表["leisure", "personal_development"]
X i X_i XiLLM 生成的上下文描述“用户分享了自己新爱好的摄影,表达了愉悦”
e i e_i ei文本嵌入向量384 维或 768 维浮点数向量
L i L_i Li链接集合 { m 3 , m 7 , m 12 } \{m_3, m_7, m_{12}\} {m3,m7,m12}

3.1.2 构建流程

第一步:LLM 生成结构化语义信息。

系统将原始内容 c i c_i ci 与时间戳 t i t_i ti 输入 LLM,并使用提示模板 P s 1 P_{s1} Ps1 生成关键词、标签和上下文描述。

提示模板的核心形式如下:

Generate a structured analysis of the following content by:
1. Identifying the most salient keywords (focus on nouns, verbs, and key concepts)
2. Extracting core themes and contextual elements
3. Creating relevant categorical tags

Format the response as a JSON object:
{
  "keywords": ["keyword1", "keyword2", ...],
  "context": "one sentence summarizing main topic, key arguments, audience",
  "tags": ["tag1", "tag2", ...]
}

第二步:构造富文本表示并编码。

系统将原始内容、关键词、标签和上下文描述拼接成一个更丰富的文本表示,再输入文本编码器,例如 Sentence-BERT,得到嵌入向量 e i e_i ei

e i = f enc ( concat ( c i , K i , G i , X i ) ) e_i = f_{\text{enc}}\left(\text{concat}(c_i, K_i, G_i, X_i)\right) ei=fenc(concat(ci,Ki,Gi,Xi))

3.1.3 设计思想

Note Construction 的重点不是简单保存原文,而是把原始交互转成一个“富记忆卡片”。它的设计思想包括:

设计原则说明
原子性每条记忆只记录一个相对独立的知识单元,便于后续链接和演化
多视角表示原文、关键词、标签、上下文描述共同构成多粒度语义表示
显式语义上下文描述以自然语言形式存在,更便于 LLM 理解和操作
可检索性嵌入向量使记忆能够参与相似性检索

3.2 Link Generation:生成记忆链接

3.2.1 核心思想

当新记忆 m n m_n mn 加入系统时,A-MEM 不会把它孤立存储,也不会机械地与所有旧记忆建立关系。系统会先通过向量检索筛选候选记忆,再交给 LLM 判断哪些候选记忆与新记忆之间存在有意义的连接。

整体流程可以概括为:

新记忆 m_n
   ↓
计算与已有记忆的语义相似度
   ↓
选出 Top-k 最近邻记忆
   ↓
LLM 判断是否建立链接
   ↓
更新新记忆的链接集合 L_n

3.2.2 语义相似性检索

对于新记忆 m n m_n mn,系统首先计算其嵌入向量 e n e_n en 与每个已有记忆 m j ∈ M m_j \in \mathcal{M} mjM 的嵌入向量 e j e_j ej 的余弦相似度:

s n , j = e n ⋅ e j ∥ e n ∥ ∥ e j ∥ s_{n,j} = \frac{e_n \cdot e_j}{\|e_n\|\|e_j\|} sn,j=en∥∥ejenej

其中:

符号含义
e n e_n en新记忆 m n m_n mn 的嵌入向量
e j e_j ej已有记忆 m j m_j mj 的嵌入向量
s n , j s_{n,j} sn,j新记忆与已有记忆之间的语义相似度
M \mathcal{M} M当前已有记忆集合

余弦相似度越高,说明两个记忆在语义空间中越接近。

3.2.4 LLM 判断并生成链接

得到候选集合 M n e a r n \mathcal{M}_{\mathrm{near}}^{n} Mnearn 后,系统将以下内容输入 LLM:

  1. 新记忆 m n m_n mn
  2. 候选最近邻记忆集合 M n e a r n \mathcal{M}_{\mathrm{near}}^{n} Mnearn
  3. 链接生成提示模板 P s 2 P_{s2} Ps2

抽象表示为:

L n ← L L M ( m n ∥ M n e a r n ∥ P s 2 ) L_n \leftarrow \mathrm{LLM}\left(m_n \parallel \mathcal{M}_{\mathrm{near}}^{n} \parallel P_{s2}\right) LnLLM(mnMnearnPs2)

其中 ∥ \parallel 表示拼接输入, L n L_n Ln 表示 LLM 为新记忆生成的链接集合。

3.2.5 为什么不能只用向量相似度?

纯向量相似度只能捕捉表层语义接近关系,但很多重要关系并不一定体现在向量距离上。

关系类型示例纯向量检索的问题LLM 的作用
因果关系“忘记带伞”与“被雨淋湿”语义不一定足够接近可以识别因果链
时序关系“申请学校”与“收到 offer”词面相似度可能较低可以判断事件先后
互补关系“Python 语法”与“NumPy 教程”可能只是中等相似可以识别学习路径关系
概念层级“pandas”与“数据分析”粒度不同可以识别上下位概念

因此,A-MEM 使用“向量检索 + LLM 判断”的两阶段机制:向量检索负责效率,LLM 负责语义深度。

3.2.6 设计优势

  • 高效性:先检索候选集合,再调用 LLM 分析,避免全库比较。
  • 语义深度:LLM 能识别因果、时序、互补、层级等复杂关系。
  • 自主性:链接不是人工预设的,而是从记忆内容中动态生成。
  • 网络化组织:新记忆不断加入后,记忆库会逐渐形成非线性的知识网络。

3.3 Memory Evolution:记忆演化

3.3.1 核心思想

Memory Evolution 是 A-MEM 最具特色的部分。传统记忆系统通常把旧记忆视为静态对象:写入之后最多只调整权重,很少改变其语义结构。A-MEM 则认为:

新记忆的加入,可能会改变系统对旧记忆的理解。

因此,新记忆不仅会被存储,也会触发相关旧记忆的更新。

3.3.2 演化对象

记忆演化主要作用于与新记忆 m n m_n mn 相关的候选邻域:

M n e a r n \mathcal{M}_{\mathrm{near}}^{n} Mnearn

这些记忆已经在 Link Generation 阶段被筛选出来,因此它们最有可能受到新记忆影响。

3.3.3 演化内容

记忆演化主要包括三类更新。

3.3.3.1 更新已有记忆属性

系统可以根据新记忆提供的信息,更新旧记忆的关键词、标签、上下文描述和链接集合。

字段更新方式
K i K_i Ki添加、删除或替换关键词,使其更准确反映当前语义
G i G_i Gi调整标签,使分类更合理
X i X_i Xi改写上下文描述,使记忆解释更完整
L i L_i Li增加、删除或强化相关链接

例如,旧记忆只记录“用户喜欢咖啡”,新记忆记录“用户喝咖啡后容易失眠”。系统可以更新旧记忆的上下文,使其包含“咖啡偏好可能受到睡眠影响”的信息。

3.3.3.2 调整记忆之间的连接

LLM 可以判断新记忆是否需要改变已有连接结构。

操作含义示例
strengthen强化已有连接新记忆进一步支持旧记忆中的偏好或事实
merge合并高度相似或重复的记忆两条记忆都描述同一摄影偏好
prune剪除过时或错误连接旧连接不再符合新信息
update_neighbor更新邻域记忆的标签或上下文新记忆补充了旧记忆背景
3.3.3.3 提炼高阶模式

随着大量记忆不断加入,系统可能从局部记忆中逐渐发现更高层次的模式,例如:

  • 用户长期偏好的变化;
  • 某些主题之间的隐含联系;
  • 行为习惯的周期性;
  • 知识点之间的层级结构;
  • 项目决策背后的长期脉络。

这类信息不一定存在于单条记忆中,而是从多条记忆的连接和更新中逐渐涌现。

3.3.4 LLM 驱动的演化过程

论文通过提示模板 P s 3 P_{s3} Ps3 指导 LLM 判断是否需要更新邻域记忆。抽象表示为:

M n e a r n ← L L M ( m n ∥ M n e a r n ∥ P s 3 ) \mathcal{M}_{\mathrm{near}}^{n} \leftarrow \mathrm{LLM}\left(m_n \parallel \mathcal{M}_{\mathrm{near}}^{n} \parallel P_{s3}\right) MnearnLLM(mnMnearnPs3)

LLM 可能输出如下结构:

{
  "should_evolve": true,
  "actions": ["strengthen", "update_neighbor"],
  "suggested_connections": ["m_7", "m_12"],
  "tags_to_update": ["data_science", "python"],
  "new_context_neighborhood": ["Updated context for m_7", "..."],
  "new_tags_neighborhood": [["tag1", "tag2"], ["..."]]
}

3.3.5 设计意义

Memory Evolution 使 A-MEM 不再是静态知识库,而是一个持续自我完善的动态系统。

价值说明
动态适应系统能根据新经验调整旧记忆
长期一致性旧记忆可以被持续修正,减少过时信息
上下文增强新信息可以为旧记忆补充背景
结构优化记忆网络会随时间变得更有组织
高阶模式涌现多条记忆之间逐渐形成抽象模式

3.4 Retrieve:图扩展式检索

3.4.1 核心思想

A-MEM 的检索并不是简单找出与 query 最相似的几条记忆,而是先召回相似记忆,再沿着这些记忆的链接集合 L i L_i Li 扩展邻居记忆。

这使检索结果不只包含“语义相近”的内容,还能包含“结构相关”的内容。

3.4.2 检索流程

第一步:编码用户查询。

给定用户查询 q,系统首先使用编码器 f_enc 将其转换为查询向量 e_q:

e_q = f_enc(q)

其中:

符号含义
q用户查询
f_enc嵌入编码函数
e_q用户查询 q 对应的嵌入向量

第二步:召回 Top-k 相似记忆。

系统计算查询向量 e_q 与每条记忆 m_i 的嵌入向量 e_i 之间的语义相似度:

s_q,i = cos(e_q, e_i) = (e_q · e_i) / (‖e_q‖₂ ‖e_i‖₂)

然后根据相似度 s_q,i 对所有记忆进行降序排序,并选取相似度最高的 Top-k 条记忆作为初始检索结果:

M_retrieved = { m_i ∈ M | rank↓(s_q,i) ≤ k }

其中:

符号含义
e_q用户查询 q 的嵌入向量
e_i记忆 m_i 的嵌入向量
s_q,i查询 q 与记忆 m_i 之间的语义相似度
M当前记忆集合
M_retrieved通过语义相似度召回的 Top-k 记忆集合
rank↓(s_q,i)按相似度从高到低排序后,s_q,i 对应的排名

也可以等价地写成:

I_retrieved = TopK_i(s_q,i, k)

M_retrieved = { m_i | i ∈ I_retrieved }

其中,I_retrieved 表示相似度最高的 k 条记忆的索引集合。


第三步:沿链接扩展邻居记忆。

对于每个被检索到的记忆 m_i,系统进一步读取其链接集合 L_i,并将其中的邻居记忆加入上下文。随后,系统会对召回记忆和邻居记忆进行去重,得到最终提供给 Agent 的上下文记忆集合 C_q。

可以抽象为:

C_q = M_retrieved ∪ ( ⋃_{m_i ∈ M_retrieved} L_i )

其中:

符号含义
L_i记忆 m_i 的链接邻居集合
C_q最终提供给 Agent 的上下文记忆集合
集合并集操作
对多个集合求并集

因此,完整检索流程可以理解为:系统先根据用户查询进行语义向量检索,召回 Top-k 条最相关记忆;然后再沿着这些记忆之间的链接关系扩展邻居记忆,补充相关上下文;最后通过去重得到最终上下文集合 C_q。

3.4.3 为什么图扩展检索更强?

假设用户问:“Python 数据分析怎么做?”

系统可能先召回一条关于 pandas 的记忆。如果这条记忆链接了 NumPyMatplotlib 和“数据清洗经验”,那么这些邻居记忆也会被一起加入上下文。

因此,A-MEM 实现的是:

一次语义召回
   ↓
沿链接扩展
   ↓
多点上下文整合

这尤其适合多跳推理、长期偏好理解和复杂项目上下文恢复。


4. 实验设计与结果分析

4.1 数据集

论文主要使用两个长对话数据集。

4.1.1 LoCoMo
属性数值
平均对话长度约 9,000 tokens
最多会话数35 个
总 QA 对7,512
问题类型单跳、多跳、时序推理、开放域、对抗性

LoCoMo 的对抗性问题专门用于测试模型是否会在无法回答时产生幻觉。

4.1.2 DialSim
属性数值
来源《老友记》《生活大爆炸》《办公室》
时间跨度约 5 年剧集时间线
总 tokens约 350,000
每集问题数超过 1,000

DialSim 的特点是多方对话和复杂人物关系,因此更考验记忆系统对关系结构的建模能力。

4.2 基线方法

模型核心机制局限性
LoCoMo每次 query 尝试使用完整历史上下文长度受限,难以扩展
ReadAgent分块、摘要、按需查找摘要可能丢失细节
MemoryBank基于遗忘曲线更新记忆强度规则固定,缺少自主语义演化
MemGPT借鉴操作系统主存/外存管理思想仍依赖预定义内存管理策略

4.3 LoCoMo 平均结果

方法平均 F1平均 BLEU-1
LoCoMo2.553.13
MemGPT1.181.07
A-MEM3.453.37

从原稿整理的数据看,A-MEM 在平均 F1 和 BLEU-1 上均优于对比方法。

4.4 不同任务类型下的表现

任务类型指标LoCoMoMemGPTA-MEM
多跳推理F115.8115.7923.43
多跳推理BLEU-17.6113.2536.67
时序推理F18.164.598.38
开放域F140.4241.4042.32
对抗性F163.2839.1645.64

结果说明:

  • A-MEM 在多跳推理上优势明显,因为链接网络天然支持跨记忆整合。
  • 时序推理和开放域问题上,A-MEM 也有一定提升。
  • 对抗性任务需要谨慎解读:如果问题本来无法从记忆回答,模型“不回答”可能更诚实,但传统 F1 指标未必奖励这种行为。

4.5 消融实验

配置多跳 F1多跳 BLEU-1开放域 F1说明
w/o LG & ME9.657.097.77去掉链接生成和记忆演化,只保留基础检索
w/o ME21.3515.1310.13保留链接生成,去掉记忆演化
Full A-MEM27.0220.0912.14完整系统

结论:

  1. Link Generation 是性能提升的基础。
  2. Memory Evolution 在链接生成基础上进一步提高效果。
  3. 两个模块互补,缺一不可。

4.6 检索数量 k k k 的影响

实验发现, k k k 从 10 增加到 50 时,性能通常先提升,随后趋于平稳甚至略有下降。

k k k 过小 k k k 过大
可能漏掉关键上下文引入噪声,干扰推理
多跳信息不足占用上下文窗口
回答片面检索结果冗余

经验上,多跳任务可能需要更大的 k k k,单跳任务则较小的 k k k 即可。

4.7 扩展性分析

记忆数量A-MEM 内存占用A-MEM 检索时间MemoryBank 检索时间ReadAgent 检索时间
1,0001.46 MB0.31 μs0.24 μs43.62 μs
10,00014.65 MB0.38 μs0.26 μs484.45 μs
100,000146.48 MB1.40 μs0.78 μs6,682.22 μs
1,000,0001,464.84 MB3.70 μs1.91 μs120,069.68 μs

主要结论:

  • 内存占用随记忆数量近似线性增长。
  • A-MEM 检索时间增长较慢,具备较好的扩展性。
  • ReadAgent 在大规模记忆下检索时间显著增加。
  • MemoryBank 更快,但表达能力弱于 A-MEM。

4.8 成本分析

原稿整理的成本信息如下:

指标A-MEM
每次记忆操作 token 消耗约 1,200 tokens
对比方法 token 消耗约 16,900 tokens
单次商用 API 成本小于 $0.0003
本地 Llama 3.2 1B 单 GPU 耗时约 1.1 秒

这说明 A-MEM 在效果、成本和响应效率之间取得了较好的平衡。

4.9 可视化分析

论文使用 T-SNE 将记忆嵌入降维到二维空间,对比完整 A-MEM 与去掉链接/演化机制的 Base Memory。

方法可视化现象解释
Base Memory记忆点较分散,缺少明显聚类组织结构较弱
A-MEM出现更清晰的簇结构链接和演化帮助记忆形成语义组织

这说明 A-MEM 不仅提高了指标,也让记忆库内部结构更清晰。


5. 与现有方法的对比

5.1 A-MEM vs. 传统 RAG

传统 RAG 通常是无状态检索:每个 query 独立检索,检索结果之间没有显式关系。A-MEM 则通过记忆链接实现图扩展式检索。

维度传统 RAGA-MEM
知识库状态静态动态演化
检索方式相似度召回相似度召回 + 链接扩展
记忆关系通常隐式显式链接
更新机制多为人工或批处理新记忆触发自动演化

5.2 A-MEM vs. Agentic RAG

Agentic RAG 通常让模型在检索阶段更主动,例如决定是否检索、检索什么、如何反思检索结果。A-MEM 的 agentic 则主要体现在记忆存储和演化阶段。

方法Agentic 发生的位置
Agentic RAG检索和回答阶段
A-MEM记忆构建、链接生成、记忆演化阶段

5.3 A-MEM vs. 知识图谱

知识图谱通常依赖预定义 schema,例如实体类型和关系类型。A-MEM 的关系结构更加开放,由 LLM 根据上下文动态生成。

维度知识图谱A-MEM
Schema通常预定义弱 schema 或无固定 schema
更新方式结构化规则更新LLM 语义判断更新
灵活性较低较高
可解释性较强依赖 LLM 输出质量

6. 局限性

A-MEM 仍然存在一些限制。

局限性说明可能改进
依赖底层 LLM 能力弱模型可能生成低质量标签、上下文或链接引入验证器、投票机制或更强提示模板
目前主要处理文本图像、音频、视频等信息尚未充分覆盖扩展到多模态记忆
演化可能误删或误改mergeprune 判断失误可能丢失细节增加版本控制、审计日志和回滚机制
缺少理论最优性保证系统主要是启发式设计建立更明确的优化目标与评估指标
可解释性仍有限LLM 决策过程可能不透明要求输出链接理由和演化理由

7. 应用场景与改进方向

7.1 为什么这个方向重要?

LLM 的上下文窗口虽然在不断变长,但超长上下文并不能完全替代外部记忆。真正的长期智能需要的不只是“能塞进更多文本”,而是能够对历史信息进行组织、压缩、链接和更新。

A-MEM 的意义在于,它把记忆系统从“被动数据库”推进到“可演化知识网络”。

7.2 适合使用 A-MEM 的场景

场景为什么适合
长期陪伴类应用需要持续理解用户偏好、习惯和历史状态
教育导师需要记住学习进度、错误模式和知识掌握情况
软件开发 Agent需要跟踪需求、代码变更、Bug、架构决策
科研助手需要组织论文、实验记录、假设和结论
个人知识管理可自动生成笔记链接并重构知识结构
企业知识库适合对跨文档、跨项目知识进行长期组织

7.3 潜在改进方向

方向说明
引入遗忘机制对低价值、过时或重复记忆进行衰减和归档
多级记忆层次区分工作记忆、短期记忆、长期记忆和元记忆
版本控制所有演化操作保留修改历史,支持回滚
链接置信度给每条链接分配强度或置信度
跨 Agent 记忆共享多个 Agent 之间共享部分记忆,形成协作知识网络
可解释演化每次更新都输出原因,便于审计和调试

8. 上手使用

原稿中提到作者提供了两个相关代码仓库:

  1. Benchmark 评估代码:https://github.com/WujiangXu/AgenticMemory
  2. 生产环境库:https://github.com/WujiangXu/A-mem-sys

典型使用方式如下:

from a_mem import AgenticMemory

memory = AgenticMemory(
    llm_backend="gpt-4o-mini",
    encoder="sentence-transformers/all-MiniLM-L6-v2"
)

memory.add(interaction_text, timestamp)
context = memory.retrieve(query, k=20)

实际使用时,建议重点调试以下参数:

参数影响
k k k每次检索返回的记忆数量
编码器模型决定语义召回质量
LLM 模型决定标签、链接和演化质量
提示模板决定记忆结构化和演化风格
剪枝策略决定长期记忆库的噪声水平

9. 总结

A-MEM 的核心贡献可以概括为一句话:

它把 LLM Agent 的记忆系统从“静态存储器”变成了“动态生长的知识网络”。

更具体地说:

维度评价
创新性将 Zettelkasten 思想、向量检索和 LLM 自主决策结合
工程性关注成本、扩展性和部署可行性
实用性适合长期交互、多跳推理和复杂上下文管理
局限性依赖 LLM 质量,演化过程需要审计机制
启发意义为长期记忆型 Agent 提供了一种可落地范式

A-MEM 最值得关注的地方,不只是它在实验指标上的提升,而是它提供了一种新的设计范式:

记忆不是被动保存的历史记录,
而是可以被链接、被更新、被重组、被演化的知识结构。

更多推荐