Agent 调用高并发# MRAgent:记忆不是被取回,而是被重构

一句话定位:MRAgent 用 Cue-Tag-Content 图和 LLM 驱动的多步遍历,把长期记忆访问从一次性检索变成主动重构。

论文Memory is Reconstructed, Not Retrieved: Graph Memory for LLM Agents
代码Ji-shuo/MRAgent
发布时间:2026-06
适合读者:图记忆、Agent RAG、GBrain / Graphiti / Neo4j memory、长期对话记忆系统建设者。


1. 背景:为什么 top-k 检索不够

大多数 Agent memory 系统默认采用“retrieve then reason”。也就是先用 query 到记忆库里找 top-k,再把结果塞进 prompt,让模型回答。

这个流程简单、稳定、工程上好落地,但它隐含了一个强假设:真正有用的证据,在第一轮检索时就能被 query 直接命中。

长期记忆里,这个假设经常不成立。一个问题可能先需要找到某个事件,再从事件里发现时间线索,再用时间线索去找另一个人物的行为。第一跳证据和最终答案之间可能隔着多个中间 cue。静态 top-k 只能看到 query 和 memory unit 的表面相似度,无法根据中间发现调整搜索方向。

图记忆看起来能缓解这个问题,但很多图检索仍然是固定流程:先找种子节点,再扩展 N 跳邻居。它会带来两个副作用:一是相关证据如果不在固定邻域里,仍然找不到;二是无关邻居会大量涌入上下文,制造噪声。

MRAgent 的出发点就是反过来问:人类回忆复杂事件时,真的是一次性“取回”答案吗?更多时候,我们是在重构:先想起一个线索,再联想到一个时间、地点或人物,然后继续追。


2. 核心观点:主动重构

论文把记忆访问分成两类。

被动检索:检索策略只依赖原始 query。系统在开始时就决定取哪些记忆,之后不再改变。

主动重构:检索策略依赖 query 和已经找到的证据。第 t 步找什么,由前 t-1 步的发现共同决定。

形式上,普通检索像这样:

retrieved = passive_retrieve(query)
answer = llm(query, retrieved)

MRAgent 更像这样:

state = init(query)
while not enough_evidence(state):
    action = llm_select_next_traversal(query, state)
    candidates = graph_traverse(action, state)
    state = llm_route_and_prune(query, state, candidates)
answer = llm(query, state.evidence)

这不是简单多查几次,而是把“查记忆”纳入推理循环。每次查到的内容都可能改变下一步检索方向。


3. Cue-Tag-Content:为什么图里要有 Tag

MRAgent 的结构叫 Cue-Tag-Content。

Cue 是细粒度线索。它可以是实体、属性、动作、时间、地点或关键词。Cue 负责让 query 和图发生第一次接触。

Content 是具体记忆内容。它可以是一段 episode、一条稳定事实,或者一个 topic-level summary。

Tag 是中间层。它描述 cue 和 content 之间的关联方式,比如某个 cue 是以“时间锚点”“兴趣偏好”“活动参与”“人物关系”等方式连接到内容。Tag 的价值在于它足够轻,适合先被模型浏览和选择;又足够有语义,能指导模型决定是否打开完整内容。

如果没有 Tag,从 cue 到 content 会变成粗暴扩展。一个人名可能连接几百段历史,全部打开会爆 token;只按 embedding 排序又可能错过关键路径。Tag 相当于把图上的边变成可读路标,让 LLM 在读取正文之前先判断“这条路值不值得走”。


4. 多粒度记忆层

MRAgent 不只存一种 memory unit,而是把内容分成多层。

Episodic layer 存具体事件。它保留某次对话、某个时间点、某段经历,用于提供可追溯证据。

Semantic layer 存稳定知识。比如用户偏好、长期事实、个人属性。这层适合直接回答“用户喜欢什么”“某人有什么特征”。

Topic abstraction layer 存更高层主题。它把多个 episode 归到一个 topic 下,让检索可以先定位主题,再下钻到具体事件。

这三层解决了一个常见矛盾:长期记忆既要能找细节,又不能每次都从细节海洋里捞。抽象层负责缩小范围,语义层负责稳定事实,episode 层负责证据。


5. 读路径:LLM 如何控制图遍历

MRAgent 的读路径有三个关键动作。

第一是 action selection。模型根据 query、已有证据和当前活跃节点,选择下一步应该执行的遍历动作。例如从 cue 到 tag、从 cue+tag 到 content,或从 content 反向激活新的 cue/tag。

第二是 controlled traversal。图系统按照模型选的动作扩展候选节点。这里不是无脑 N-hop,而是受 action 控制的局部扩展。

第三是 routing and pruning。模型看候选节点后,选择真正有用的内容,把无关分支剪掉,并更新当前 reconstructed context。

这套机制让检索具备两个能力:发现新 cue,以及停止错误分支。长期记忆系统最怕的不是找不到东西,而是找来一堆“看起来相关但会干扰判断”的东西。MRAgent 用 Tag 和 routing 把噪声控制在探索过程中。


6. 实验结果

论文主要在 LoCoMo 和 LongMemEval 上评测。

LoCoMo 用来测长对话记忆,包括 single-hop、multi-hop、temporal 和 open-domain 问题。LongMemEval 更贴近用户-助手多 session 历史,每个问题对应很长的聊天记录。

结果大意是:

  • 在 LoCoMo 上,MRAgent 用 Gemini backbone 时,把 overall LLM-Judge 分数从 68.31 提升到 84.21,相对提升约 23.3%。
  • 用 Claude backbone 时,也有约 12.4% 的提升。
  • 在 LongMemEval 上,相对最强 baseline 提升约 32%。
  • token 消耗和运行时间也下降,因为系统不是把固定邻居都塞进去,而是在图上做选择性重构。

论文的 ablation 也说明,只有 Cue-Content 直接索引不够;加入 Tag 后更好;再加入多步 reasoning,效果继续提升。这说明贡献不只是“多做了一个图”,而是图结构和推理式遍历共同发挥作用。


7. 和 GBrain、Graphiti 的关系

GBrain 的优势是 Markdown 真相源、typed links、混合检索和图遍历。Graphiti 的优势是 temporal knowledge graph,能表达事实如何随时间变化。

MRAgent 给这类系统补了一个读路径启发:图不应该只是检索后的增强层,而应该成为推理过程中的可交互搜索空间。

如果把 MRAgent 的思想迁移到 GBrain,可以想象 gbrain think 不只是一次 search + synthesis,而是多轮:

  1. 从问题抽 cue。
  2. 读取候选 typed links / backlinks / timeline tags。
  3. 让模型选择下一跳关系。
  4. 根据中间证据生成新的 cue。
  5. 直到证据足够,再合成答案。

这样,图记忆就从“扩展召回”变成“可控探索”。


8. 局限

MRAgent 依赖 LLM 做记忆元素抽取、tag 生成和遍历决策。写入质量会影响图质量,tag 如果抽得太粗或太随意,读路径会漂。

它的评测主要集中在长对话记忆 benchmark。对于真实 Agent 轨迹,比如 coding、web、工具调用、环境状态变迁,还需要更多验证。

此外,多轮 LLM 路由虽然比粗暴扩展更省 token,但会引入控制流复杂度。生产系统需要设置最大步数、候选上限和超时策略,否则极端查询可能拖慢响应。


9. 一句话判断

MRAgent 的真正价值不是提出“又一种图记忆”,而是把长期记忆的读路径从静态检索改成主动重构。对任何做 Agent memory 的系统来说,这都是一个重要提醒:记忆能力不只取决于存了什么,还取决于 Agent 能不能沿着线索一步步把该想起来的东西想起来。

Logo

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

更多推荐