论文

A-MEM:让 Agent 的记忆在经历中持续组织

从结构化笔记、动态链接与记忆演化出发,拆解 A-MEM 的完整机制,并与 RAG、Agentic RAG 和 MemGPT 对照,核对实验支持与仍待解决的问题。

如果一个 Agent 只把过去的对话切成片段、存进向量数据库,再按相似度取回,它确实拥有了“长期记录”,却未必拥有了更好的长期记忆。新经历可能只是继续堆在库里,旧经历也未必知道自己应该怎样被重新理解。

A-MEM: Agentic Memory for LLM Agents 讨论的是另一种方向:每次交互都先被加工成一张结构化笔记;新笔记加入后,系统会寻找相关旧笔记,建立链接,并让部分旧笔记吸收新的上下文。记忆库因此不只是增长,也会在持续交互中重新组织。

本文沿着论文的章节顺序阅读,但把重点放在一条可追踪的问题链上:一段交互怎样留下来?它怎样进入已有记忆网络?旧记忆怎样变化?回答当前问题时又怎样被取回?这些设计真正被实验支持到什么程度?

A-MEM 的写入、链接、演化与检索闭环
A-MEM 的写入、链接、演化与检索闭环

先把 A-MEM 放进记忆系统的地图

传统 RAG 通常把外部文档切块、索引,然后根据当前问题检索相关片段。它解决的重点是“当前回答需要哪些外部内容”。Agentic RAG 把自主性进一步放到检索过程:Agent 可以决定什么时候查、查什么、是否继续查、怎样改写查询,但知识库通常仍然相对静态。

MemGPT 关注的是另一层问题:上下文窗口有限时,哪些内容应该留在工作内存,哪些内容应该分页到外部存储,什么时候再召回。它更像上下文和长期存储之间的操作系统式管理。

A-MEM 的自主性主要发生在记忆库内部。它让 LLM 参与生成记忆的语义属性、判断记忆之间的联系,并根据新经历更新已有记忆的语境。可以用下面这组问题区分它们:

系统主要变化发生在哪里核心问题
普通 RAG查询与上下文拼装从相对静态的资料中找什么
Agentic RAG检索策略何时查、查什么、是否继续查
MemGPT上下文与外部存储之间有限上下文如何管理长期信息
A-MEM记忆的表示、关系和演化新经历如何重组已有记忆

这不是说 A-MEM 不使用 RAG 式检索。它的基础召回仍然是向量相似度并取前 kk 条;差异在于,检索之前的记忆写入和组织过程更加动态。

A-MEM、RAG 与 MemGPT 的主要机制边界
A-MEM、RAG 与 MemGPT 的主要机制边界

论文 Figure 2 是全文最完整的模块图。它把笔记构造、链接生成、记忆演化和检索放在同一条链路上,适合先看清“新笔记如何影响旧笔记”。图右侧还有一个值得记住的细节:视觉上,命中一条记录后会继续访问同一 box 中的相关记忆;但第 3.4 节正式写出的召回过程主要是 query embedding 与全库相似度排序,图中扩展行为还需要结合实现核对。

原论文 Figure 2:A-MEM 的完整架构。来源为所读 arXiv:2502.12110v11 第 3 页,裁取图像区域并保留内部内容。图中画出了同一 box 内相关记忆的访问意图,具体检索边界见第 3.4 节。点击图片可放大查看。[1]
原论文 Figure 2:A-MEM 的完整架构。来源为所读 arXiv:2502.12110v11 第 3 页,裁取图像区域并保留内部内容。图中画出了同一 box 内相关记忆的访问意图,具体检索边界见第 3.4 节。点击图片可放大查看。[1]

Method

1. 一次交互先变成一张记忆笔记

论文把一条记忆写成:

mi={ci,ti,Ki,Gi,Xi,ei,Li}m_i=\{c_i,t_i,K_i,G_i,X_i,e_i,L_i\}

它不是一段原始文本,而是一张带有多个字段的记忆卡片:

字段作用
cic_i原始交互内容
tit_i交互发生的时间
KiK_iLLM 生成的关键词
GiG_iLLM 生成的标签
XiX_iLLM 生成的上下文描述
eie_i用于相似度计算的向量
LiL_i与其他记忆的链接集合

论文通过提示模板让 LLM 根据原始内容和时间生成关键词、标签与上下文描述:

Ki,Gi,Xi←LLM(ci∥ti∥Ps1)K_i,G_i,X_i\leftarrow LLM(c_i\Vert t_i\Vert P_{s1})

假设 Agent 过去经历了这样一段交互:

用户想为 Web 应用设计一个同时支持内存和磁盘的缓存系统。

它留下的记忆笔记可能包含:

关键词:cache、memory storage、disk storage、web application
标签:缓存、系统设计、存储架构、Web 开发
上下文:这是一个分层缓存问题,需要在访问速度、容量和持久性之间做权衡。

关键词回答“这条记忆提到了什么”,标签回答“它属于哪些类别”,上下文描述则试图回答“这段经历在更完整的语义上意味着什么”。A-MEM 的后续链接判断和记忆演化,都可以利用这层由 LLM 生成的语义表示。

随后系统把原始内容、关键词、标签和上下文描述拼接起来,再交给文本编码器:

ei=fenc[concat(ci,Ki,Gi,Xi)]e_i=f_{enc}[concat(c_i,K_i,G_i,X_i)]

因此检索向量不只来自原始对话,也来自模型对这段对话的再解释。原文只提到“LRU 淘汰策略”,结构化属性可能补充出缓存容量、访问频率和内存管理等语义,使相关问题更容易命中这条记忆。

这里有一个需要留意的代价:关键词、标签和上下文描述都是模型生成的派生信息。它们可能帮助泛化,也可能把错误推断带进向量、链接和后续检索。A-MEM 的记忆增强能力同时也是它的误记忆风险来源。

2. 先用向量找候选,再让 LLM 判断是否值得连边

新笔记 mnm_n 加入后,系统不会让 LLM 和全部历史记忆逐一比较,而是先计算向量相似度:

sn,j=en⋅ej∥en∥∥ej∥s_{n,j}=\frac{e_n\cdot e_j}{\lVert e_n\rVert\lVert e_j\rVert}

随后取相似度最高的 kk 条旧记忆作为候选集合:

Mnearn={mj∣rank(sn,j)≤k}M_{near}^n=\{m_j\mid rank(s_{n,j})\leq k\}

这一步只回答“哪些旧记忆可能相关”。候选并不等于最终关系。A-MEM 再把新记忆、候选记忆和链接提示模板交给 LLM,让它判断哪些关系具有语义意义:

Li←LLM(mn∥Mnearn∥Ps2)L_i\leftarrow LLM(m_n\Vert M_{near}^n\Vert P_{s2})

例如,“LRU 是一种缓存淘汰策略”和“如何设计内存与磁盘组成的分层缓存”共享缓存主题,但两者是否应该形成强关系,交给 LLM 根据上下文判断。这样就形成了两阶段筛选:

Embedding:快速找出可能相关的候选
LLM:判断候选之间是否存在值得保留的语义关系

这也是 Zettelkasten 思想在 A-MEM 中的落点:记忆不是只能放进一个预先定义的文件夹,一条笔记可以同时连接到缓存、性能优化和存储架构等多个局部知识簇。

但链接生成受候选集合限制。如果真正相关的旧记忆没有进入前 kk 条候选,LLM 没有机会发现它。图结构的灵活性因此建立在 embedding 召回质量之上。论文 Figure 2 还展示了命中一条记忆后访问同一 box 中其他链接记忆的意图;第 3.4 节的正式公式仍主要描述全库向量排序,没有写出完整的图扩展算法。因此这里先把它记为一个实现边界,不能把示意图直接当成已经明确规定、已经验证的检索行为。

3. 新记忆加入时,旧记忆也可能改变

链接建立后,A-MEM 会处理候选旧记忆。论文用下面的形式表示一次演化:

mj∗←LLM(mn∥(Mnearn∖mj)∥mj∥Ps3)m_j^*\leftarrow LLM(m_n\Vert(M_{near}^n\setminus m_j)\Vert m_j\Vert P_{s3})

它把新记忆、当前旧记忆、其他候选记忆和演化提示交给 LLM,生成更新后的 mj∗m_j^*,再用它替换原来的 mjm_j。论文重点提到会更新旧记忆的上下文、关键词和标签。

例如旧记忆原来只是:

LRU 根据最近访问时间淘汰缓存项。

新经历加入后,它的上下文可能变成:

LRU 可以作为分层缓存中的淘汰策略之一,需要与内存、磁盘的容量和访问延迟一起考虑。

这里新增的仍然是新记忆 mnm_n。被改写的 mj∗m_j^* 不是额外增加的一条记录,而是旧记忆 mjm_j 的更新版本:

旧记忆库 → 加入 mn → 找到相关 mj → mj 变成 mj* → 保留 mn

这回答了一个容易混淆的问题:A-MEM 并不是找到旧记忆后就把新经历合并进去、从此不再创建新记录。按论文的描述,每次新交互先形成自己的 mnm_n,然后影响相关旧记忆。

这种设计有一个明显优势:系统可以保留原始经历,同时让它在新关系中获得更丰富的解释。但它也留下了几个工程问题。论文正文没有明确说明旧记忆更新后是否重新计算 embedding;如果关键词、标签和上下文变了而向量不变,文本表示与检索表示就会出现不同步。正文也没有给出去重、删除、版本失效或冲突事实仲裁机制。

例如:

m1:用户住在纽约
mn:用户已经搬到西雅图

理想的长期记忆系统需要知道前者是历史状态,后者是当前状态。A-MEM 的公式能表达“相关旧记忆被更新”,却没有明确规定 superseded、有效时间区间或当前版本优先级。因此,旧记录仍可能在检索时被召回。时间戳可能帮助模型判断,但论文第 3.4 节的检索公式并没有把时间或失效状态纳入相似度计算。

4. 当前问题到来时,召回仍由向量相似度决定

当 Agent 需要回答当前问题 qq 时,系统先用同一个文本编码器得到查询向量:

eq=fenc(q)e_q=f_{enc}(q)

再和所有记忆向量计算余弦相似度:

sq,i=eq⋅ei∥eq∥∥ei∥s_{q,i}=\frac{e_q\cdot e_i}{\lVert e_q\rVert\lVert e_i\rVert}

最后取相似度最高的 kk 条记忆,作为当前回答的历史上下文:

Mretrievedq={mi∣rank(sq,i)≤k, mi∈M}M_{\mathrm{retrieved}}^q=\{m_i\mid rank(s_{q,i})\leq k,\ m_i\in M\}

因此 A-MEM 的基础召回并没有脱离 RAG 的基本范式:查询向量、相似度、前 kk 条召回、上下文拼装。A-MEM 的主要差异发生在召回之前:记忆已经经过结构化、链接和演化。

这也让前面的冲突问题变得更具体。如果检索公式只看向量相似度,那么被废弃的旧记录仍可能因为语义相似而进入前 kk 条结果。时间戳可以作为字段交给生成模型,但从第 3.4 节的公式本身,不能推出已经实现可靠的时间过滤或事实版本管理。

阅读中的关键追问:动态组织是否等于可靠记忆?

读完第 3.1 至 3.4 节,很容易得到一种“闭环已经完成”的印象:交互产生笔记,笔记找到邻居,旧笔记被演化,查询再把记忆召回。但这个闭环只说明数据在流动,还没有说明系统拥有完整的事实有效期。共读时真正卡住我们的是两条不同的链路:新经历什么时候只是新增一条记录,什么时候会改写旧记录;旧记录被改写之后,检索又如何知道哪一版事实现在有效。

❗ 共读中的主问题:系统会“组织”,但它会“作废”吗?

新增与覆盖: 论文的操作顺序支持“先新增 mnm_n,再把相关旧记忆变成 mj∗m_j^*”。它没有明确规定,多少个相近交互会被去重、合并成同一条记忆。 演化与失效: mj∗m_j^* 会替换原记录,但正文没有给出 superseded、有效时间区间、回滚或冲突仲裁规则。组织得更丰富,不自动等于知道哪条事实仍然为真。

A-MEM 的演化闭环与事实有效期缺口
A-MEM 的演化闭环与事实有效期缺口

第一个问题:新记忆何时增加,何时只改写旧记忆?

论文给出的顺序其实同时包含了两类动作。每次交互先构造新的 mnm_n;mnm_n 通过向量筛选和 LLM 判断找到相关邻居;随后这些邻居中的 mjm_j 才可能被改写为 mj∗m_j^*。所以“增加”和“更新”不是二选一:新经历留下一条新记录,同时可能改变若干条旧记录。

它的边界落在更前面的环节:一次长对话如何切成“一次交互”,两个几乎重复的经历是否仍然各建一条笔记,以及“值得建立关联”是否能代替“这是同一条事实”的判断。正文只给出了候选与链接的生成方式,没有给出去重判定或记忆粒度公式。这里可以推断系统可能产生多条相近笔记,但仅凭正文还不能断言实际实现一定会重复存储。

第二个问题:演化后的旧笔记替换了原记录,留下什么版本语义?

论文明确写道,演化后的 mj∗m_j^* 会替换记忆集合中的原记录;更新重点包括上下文、关键词和标签。若此处真的只保存演化后的版本,原始来源、旧上下文和旧标签就不再直接可见。若要审计“这条笔记为什么变化”,还需要正文没有展开的来源链或版本历史。

更具体地说,演化后的状态至少涉及三个待确认量:

状态为什么重要正文给出的边界
事实有效期“住在纽约”和“搬到西雅图”可能同时进入上下文有字段 tit_i,没有事实级有效区间
检索向量如果文本属性改变而 eje_j 不重算,检索表示会落后于笔记内容记忆演化公式没有明确是否重新编码 mj∗m_j^*
来源与版本覆盖后难以追溯旧说法、更新时间与修改原因未给出版本号、失效标记或删除规则

这些都不等于已经证明系统出现了故障。它们说明:论文能支持“旧记忆的语义属性会变化”,还不足以支持“系统已经可靠处理互相冲突的长期事实”。

第三个问题:时间戳能帮助回答,但没有闭合检索规则

时间并非完全没有留下。第 3.1 节让 LLM 同时读取原始内容和 tit_i,生成上下文、关键词与标签;最终回答时,模型也可能看到记忆中的时间。但要注意两个检索边界:

  • 记忆向量写成 ei=fenc[concat(ci,Ki,Gi,Xi)]e_i=f_{enc}[concat(c_i,K_i,G_i,X_i)],其中没有显式加入 tit_i;
  • 第 3.4 节按 sq,is_{q,i} 的大小取前 kk 条,没有时效衰减、当前版本优先或失效过滤项。

因此,旧记录和新记录可以因为同样贴近问题而同时被召回。随后由提示词和生成模型决定是否使用时间戳,是生成阶段的事实消歧,不是检索阶段已经完成的版本筛选。这个区别解释了为什么“字段里有时间”仍不足以保证“上下文里不会出现明显过时的旧事实”。

第四个问题:实验能说明什么,不能替这些语义收尾

消融实验确实支持 Link Generation 是重要基础,并显示在它之上加入 Memory Evolution 还能继续提高分数。不过实验没有单独比较“不加链接、只摘要”或“关系抽取加静态记忆”等替代机制,因而很难把提升精确归因给本文所说的语义演化。LoCoMo 的时间题也主要检验基于历史对话的时间回答,不等同于专门的压力测试:写入互相矛盾的事实,再检查前 kk 条结果是否过滤旧版本。

✏️ 这里区分“机制缺口”与“实现缺陷”

“论文没有把规则写完整”是正文证据边界;“代码一定没有实现”则是另一个需要检查实现和运行实验的结论。本文停在第一层:这些问题值得提出,但不能冒充已经复现的 bug。

实验到底证明了什么

作者在 LoCoMo 和 DialSim 两个长期对话数据集上评估 A-MEM,并和 LoCoMo、ReadAgent、MemoryBank、MemGPT 比较。LoCoMo 包含单跳、多跳、时间、开放域和对抗问题;这使它能够分别观察事实定位、跨会话组合、时间理解和不可回答识别。

先看 GPT-4o-mini 在 LoCoMo 上的两个代表性类别,避免把类别与指标抄错:

GPT-4o-mini / LoCoMoLoCoMoMemGPTA-MEM
Multi-Hop F1F_125.0226.6527.02
Temporal F1F_118.4125.5245.85

Temporal 的差距很醒目;Multi-Hop 上,A-MEM 相比 MemGPT 只高 0.37 个点。因此,主表中的这一行足以支持“同配置下略有领先”,还不足以把“至少两倍”的说法推广到所有基础模型和这项指标。Qwen2.5 1.5B 的例子也需要按类别读:A-MEM 的 Multi-Hop F1F_1 从 MemGPT 的 10.44 提高到 18.23,而不是两者的平均 F1F_1 发生这个变化。

这些结果与 A-MEM 的机制目标相符:链接和更丰富的上下文描述可能帮助系统把不同会话中的信息连起来。不过主结果首先证明的是“完整 A-MEM 系统在这组数据集上表现更好”,不能单独证明提升一定来自 Memory Evolution,也不能证明它已经解决了冲突事实。

消融表进一步区分了两个模块。GPT-4o-mini 上,两个模块都去掉时 Multi-Hop F1F_1 为 9.65;保留 Link Generation、去掉 Memory Evolution 后为 21.35;完整 A-MEM 为 27.02。Temporal F1F_1 则从 24.55 提高到 31.24,再提高到 45.85。这说明链接是重要基础,演化在链接之上又增加了收益;但实验没有测试“去掉链接、只保留演化”的配置,因此不能完全分离 Memory Evolution 的独立贡献。

作者还报告 A-MEM 每次记忆操作约使用 1,200–2,500 tokens,而 LoCoMo 和 MemGPT 约为 16,900 tokens,并据此估算成本较低。这个比较需要保留口径问题:主表把 A-MEM 的 token length 记为 2,520,正文又写约 1,200 tokens per memory operation,附录则给出 1,200–2,500 的区间;正文没有给出按笔记构造、链接、演化和回答拆开的调用次数与 token 明细。因此,“每次操作”与“回答一个问题”是否完全同口径,无法只凭这些数字复原。向量检索本身便宜,并不自动证明完整记忆生命周期的端到端成本已经被充分比较。

随着 kk 从 10 增加到 50,性能并非在每个类别都走同一条曲线。Multi-Hop 的 F1F_1 从 19.91 上升,在 40 左右达到高位后略降;Temporal 从 10 开始已经在 43.60 左右,到 40 附近达到峰值;Single-Hop 在 50 时仍继续上升;Adversarial 则在 40 附近见顶,随后回落。这说明 A-MEM 仍然面临上下文检索的基本权衡:取回太少会漏掉多跳推理所需的信息,取回太多又可能把噪声放进上下文,而最合适的 kk 与任务类别有关。

原论文 Figure 3:GPT-4o-mini 下检索参数 <span class=kk 对不同任务类别的影响。来源为所读 arXiv:2502.12110v11 第 8 页,裁取原图并保留图表与类别标签。点击图片可放大查看。[1]” />

论文的规模实验显示,存储量随记忆数量线性增长,底层向量检索时间随规模增加较小。这个结果主要支持检索层的空间和时间表现,不能直接覆盖 LLM 写入、链接、演化、索引维护和真实部署通信的开销。t-SNE 图显示 A-MEM 的嵌入分布看起来更有聚类结构,但这属于辅助可视化,不能单独证明聚类语义正确或链接关系真实有效。

读完之后,怎样评价 A-MEM

A-MEM 最值得记住的不是“它也用了向量检索”,而是它把记忆生命周期扩展成了四个动作:

交互
  ↓
结构化笔记
  ↓
候选筛选与语义链接
  ↓
相关旧记忆演化
  ↓
当前问题的相似度召回

它把记忆从静态记录提升成了会被新经历重新组织的结构。这个思路对长期 Agent 很有吸引力,因为真正有价值的历史经验往往不只是“发生过什么”,还包括它后来与哪些问题联系起来。

论文更充分地展示了“动态组织在给定任务上带来收益”,而“长期运行时怎样保持记忆可信”仍是开放问题。这里的判断可以分成三层:

  • 论文直接支持: 完整 A-MEM 在报告的数据与配置下优于所列基线;消融显示 Link Generation 与 Memory Evolution 共同参与形成这一结果。
  • 合理推断: 结构化描述和链接有利于跨会话组合;被替换的旧记录与非结构化的新记录,可能给时间与冲突事实的召回带来压力。
  • 尚未证明: 正文没有说明演化后的 embedding 是否重算、事实如何失效、重复经历如何合并、图链接如何扩展;也没有单独证明这套演化优于简单摘要或关系抽取。多次 LLM 调用随规模的长期成本,同样不能由向量检索时间代替。

因此,A-MEM 可以被看作一种有启发性的动态记忆组织机制。它比普通 RAG 更关注存储内容怎样变化,比 MemGPT 更关注记忆内部怎样形成关系;而它距离一个完整、可靠的长期个人记忆系统,还需要补上版本管理、冲突处理、向量同步和长期稳定性评估。最有价值的阅读结论,正是把“组织能力”和“事实治理能力”分开评价。

✏️ 材料与证据边界

本文依据 Zotero 文献库中的 A-MEM: Agentic Memory for LLM Agents,阅读版本为 arXiv:2502.12110v11,2025-10-08。机制解释和实验数字来自论文正文;“旧记忆失效、embedding 同步、图扩展、调用成本统计口径”等部分是根据正文公式识别出的未充分说明处,不能当作论文已经实现或验证的功能。本文没有复现实验,也没有检查论文附带代码的具体实现。

参考

  1. Wujiang Xu et al. A-MEM: Agentic Memory for LLM Agents. arXiv:2502.12110v11, 2025-10-08.