【多论文阅读笔记】下一阶段,Agent记忆关注什么能力?

之前做了一个 position,就是下一阶段 Agent 记忆系统应该考虑的核心目标,是保持 Agent 运行态的心流 。而【心流】就是:Agent运行中,已有信息能够接近无损接入的状态------即,像一个深入思考某事的人类一样,大脑在运行过程中,能够平滑、无损地调取已运算出的结果或已知知识,以帮助当前思考的人的注意力专注于思考 的目标上。

要想达到这种状态,就要满足:当信息在运行态【应被取用】时,能够接近无损 且无缝 地【放入】当前 context 里。

基于这个立场,我最近看了不少工作,光 9 月份 Arxiv 上带 Agent Memory 的工作就有大几十篇,但收获寥寥😂。与我的期望比较相似的 Benchmark 与测评工作,最终只留下了这三个:LoCoMo-Plus、TriggerBench 和 EvalMem。

LoCoMo-Plus: Beyond-Factual Cognitive Memory Evaluation Framework for LLM Agents

重点测的是什么?------认知记忆

LoCoMo是引用率很高的Benchmark了。

作为LoCoMo的后代,LoCoMo-Plus把测试的重点做了调整:

💓 待记忆信息上:一段对话里隐含的用户状态、目标、偏好、价值观、因果背景;

💓 待使用场景上:在未来逻辑相关但文字表面无关的场景中。

作者认为 前作LoCoMo测的是事实重现,作者认为这是Level-1 事实记忆 ,而当前LoCoMo-Plus测试的这些是 Level-2 认知记忆。

更进一步,其实要说清楚的是,虽然LoCoMo-Plus这个分级的逻辑我很认同,但跟认知心理学中,普遍被记忆系统借用的记忆概念并无关系。

被借用比较多的认知心理学原理是Tulving的三分类:

  • 情景记忆 :带着时间和地点回忆个人经历------「记得上周三在哪儿吃的饭」。主角是你自己,有具体时空坐标。

  • 语义记忆 :抽掉了时空的一般知识------「知道北京是中国的首都」。答得出来,但不「记得」是什么时候学的。

  • 程序记忆 :通过练习长在身上的技能------骑自行车、弹琴。会做,但往往说不出自己是怎么做的。

数据长什么样

先看 LoCoMo-Plus,再看前作 LoCoMo。

LoCoMo-Plus 的一例

与前作一样,测试场景,还是 模型来扮演一段对话中的一个角色(这里就是 B这个人),被测试的记忆系统负责给这个扮演B的人提供记忆。

1|cue:约束埋在中段某一场对话里------即后续要被用到的认知记忆

A:Since my cousin got diagnosed with Type 2 diabetes, I cut sugary drinks completely out of my diet.

B:That family scare clearly changed your habits.

说的是:表亲确诊糖尿病,他把含糖饮料彻底戒了。

2|trigger:需要使用该认知记忆的来回答的一句话

A(约五个月后):It's strange, I barely recognize the person who used to grab whatever sounded good without thinking about long-term consequences.

说的是:他回头看,几乎认不出从前那个想吃什么就吃什么的人。

3|模型拿到的任务描述(官方原文)

Your task: This is a memory-aware dialogue setting. You are continuing or reflecting on a prior conversation. Show that you are aware of the relevant memory or context from the evidence when you respond; your answer should naturally connect to or acknowledge that context.

这是一个「记忆感知」的对话场景,你在延续或回顾之前的一段对话;回应时要表现出你知道 evidence 里那段相关的记忆或上下文,并自然地接上或承认它。

4|判分(官方原文)

Judge whether the Model Prediction considers or is linked to the Evidence. If there is a clear connection, the answer is correct (score 1); if not, it is wrong (no score).

打分的是个模型,手上只有 cue 和被测模型回的那句(连 trigger 都不给它):有联系记 1 分,没有记 0 分。

LoCoMo 的一例(官方数据 conv-26,single-hop)

1|cue:这里就是明示信息

Melanie:Thanks, Caroline! The event was really thought-provoking. I'm starting to realize that self-care is really important. It's a journey for me, but when I look after myself, I'm able to better look after my family.

2|trigger:也是明文问实体相关信息

What did Melanie realize after the charity race?

3|模型拿到的任务描述(官方原文)

Answer the following question based on the conversation above.

4|判分(官方原文)

You are a Fact-Checking or Commonsense Judge. Your task is to compare the prediction with the reference answer using external knowledge where needed.

Labels: "correct": exact match or sound inference; "partial": minor inaccuracies or incomplete reasoning; "wrong": factually incorrect or contradicts commonsense.

打分的是个模型,手上有问题、参考答案、被测模型回的那句,外加一段相关证据:答得对上、或者能合理推出来记 correct,沾到边但没答全记 partial,答错或者跟常识顶上了记 wrong。

从以上实例其实可以清楚的看到 LoCoMo-Plus是如何检测"认知记忆"这一点的。

数据集构建步骤

构造走六步(§4、Figure 3):

  1. 生成 cue 对话 :LLM 写两行短对话,把状态 / 目标 / 偏好 / 约束 / 价值观自然地藏进去,不点明。prompt 明文要求 A 的那行必须含一个「独特、便于回忆」的记忆锚点(原文:MEMORABLE and RECALLABLE,distinctive detail),B 只需一句自然反应收尾。
  2. 人工筛「值得记」:只留持久或约束行为的、不能靠局部上下文推出来的、记住了对助手有帮助的。
  3. 生成 trigger query :要求正确答案依赖 cue、与 cue 表面相似度低、单看多解;同时给一个时间间隔 t。prompt 明文要求每条 cue 配五个 trigger、各自代表不同的认知角度、要「制造冲突或对比 」(create some conflict or contrast)、避免复用 cue 里的名词动词------并直接写明目标:人能凭记忆想起,按相似度检索的模型捞不到。
  4. 语义过滤:用 BM25 与 MPNet 相似度剔掉「cue 被重复 / 被改写 / 能从 query 单独恢复」的配对,防靠表面重叠抄近路。
  5. 人工再验:确认做出有用的回答必须真的回忆并应用那条约束。
  6. 插进 LoCoMo 轨迹:按 t 把 cue 插在中段、trigger 放在后面,中间隔若干轮无关内容和时间。

为了避免trigger和cue之间的关系过于意识流,或者不太实际,作者对 trigger 和 cue 之间的关系做了一个约束------必须属于以下四类之一。

  • causal:早先的原因或条件影响后来的事件;
  • state:身体或情绪状态影响之后的行为;
  • goal:长期意图或计划影响当下的选择;
  • value:信念或价值观塑造之后的反应。

这层切分,确实枚举到了一些个人助理Agent所面对的常见场景,不过也有点小问题:

causal这一分类的歧义:它在这里的指的是「先前发生的事对后来有影响」,不是规律性、公理性的「因果」。定义原文的用词是 earlier 和 influence,跟 GPT 里的 causal mask、分布式系统里的 causal order 是同一模式:只借「因先于果」的时间方向,不保证真的具备因果性。

简评

方向很好,有个小缺陷。

一般我们做记忆系统的测评会有两类测评,一类是关于 【用没用上】的,一类是关于【是不是瞎用】的。LoCoMo-Plus不考虑瞎用的情况,也就是忽略了两种典型错误:其一、幻觉,即没有的事模型也胡诌一番,;其二、认知错配,即当前应该使用 A记忆,但记忆系统让模型认为应该使用B记忆。后者是在当前,大部分Agent系统已经广泛的建立了记忆系统后更值得观察的一项。

TriggerBench: Investigating Prospective Memory for LLMs

重点测的是什么?------前瞻记忆

TriggerBench也借用了认知心理学中的一路关于记忆的定义:

Meacham & Leiman(1982)定义了【前瞻记忆】这个特定类型 ,它有两个要件

其一、记得要做什么 ;

其二、记得在该做的那一刻自己发得动 (时机,这条才是前瞻独有的)

两个简单的例子:

作为一个【个人助理 Agent】,

🌟 每天中午 都要记得提醒用户吃 ABC 三种药;

🌟 用户下车时 要提醒他别忘了拿之前放进后备箱的行李。

简单说,就是Reminder 这类记忆需求。

数据长什么样

1|cue-线索句 :用户第一次去上大提琴课,打车过去;琴太大塞不进后座,他和司机把琴放进了后备箱。

2|中间隔开,最后一句才是 trigger :中间若干轮与琴无关的话,比如司机跟他聊入门课上老师一般会讲什么、问他学琴多久了、吐槽今天路上堵车,甚至聊到天气和晚饭吃什么------这些闲聊和「琴在后备箱」这件事毫无关系,纯粹是为了把约束和触发句在时间和话题上都拉开距离。最后一句才是 trigger:I've arrived now, and I'm getting ready to step out of the taxi.------用户到目的地了,正要下车。这句话本身完全不提琴、不提后备箱,表面上看跟前面的约束没有任何关联,但恰恰是「下车」这个动作,让「琴还在后备箱里」这件事变得相关了:如果模型还记得约束,就应该在这一刻主动提醒用户拿琴;如果它只靠当前这句话的字面意思作答,就根本不会想到琴的事。这就是前瞻记忆和普通事实记忆最本质的区别------事实记忆是「有人问,你答得出来」,前瞻记忆是「没人问,你自己得想起来该出手」。axi.`

3|模型拿到的任务描述(官方原文节选,Table 12 的 BLENDED system prompt)

You are a helpful conversational assistant. Respond naturally to the user's message.

...

Pay attention to things or rules the user mentioned earlier that could become relevant now. For example, an object left somewhere they might forget, a time commitment that is approaching that the user might forget, a requirement or rule that is about to be violated, or an unfinished task that the user might forget resuming after sudden interruptions. If the current situation calls for it, mention it in your reply --- a heads-up remind or intervention is better than letting the user forget. Do not repeat the same reminder if you have already brought it up.

任务说明:用户早前提过、现在可能变得相关的事要留意,该出手就提醒一句,提醒过就别重复。

4|判分:模型该做的动作 :主动提醒他把琴从后备箱里拿出来------Gold Intent 原文 Remind the user to take the cello out of the trunk when exiting the taxi.。模型回复里没有这个就算错。另外Benchmark设计了几个对比组。看下面构建数据的逻辑。

怎么构建数据

作者把前瞻记忆的待测类型分成了5个类:🌟 State-Tracking(东西放在哪儿、什么状态被改了);

🌟 Temporal Grounding(定时提醒);

🌟 Logical Adherence(作者瞎整的大词,就是前面用户要求在做完A 后 就要做 B,后续在对话中显示A 确实做完了,要求 Agent 想起来做 B);

🌟 Attention Recovery(被打断后接着做);

🌟 Safe Coding(专业写代码场景里的安全漏洞)。

具体步骤是:

1|手工产生meta题。 作者手工写了 82 道题,每道确定四个要件👇

① 约束------琴被放进了后备箱

② 到期的trigger------用户到地方要下车了

③ 该做的动作------提醒他拿琴

④ 判分要认的答案------琴、后备箱

这时还没有对话,只有骨架。再让 LLM 照这 82 道的样子扩量,人工再改和删,搞到 488 道。

2|把骨架展些成一段长对话。 要做到的是:

※ 约束在前面的对话里被自然说出来;

※ 中间插十几轮跟它无关的闲聊(司机聊老师上课会讲什么)

※ 触发句放在最后。铺完平均 16.4 轮、约 2,500 个 token。

3|从同一段对话改出两种对照测试版本。

※ 一种是增加其他方向的混淆 :触发句后面再塞一个问别的事情的问题 (比如,要下车了,应该触发题型拿行李了,问Agent要不要顺路给老师买束花),触发句本身一字不改,测的是被别的事岔开时还记不记得。

※ 另一种是用户自己想起来了 :中间加一句让风险提前消失(用户自己说"司机刚提醒我拿琴了"),这时模型应该该不出手,一提醒了反而算错。

4|三个质检

① 能不能答 :把无关闲聊全删掉,只留约束和触发两句,让 GPT-4.1 去答,这都答不出来说明题目写坏了(有歧义),人工再改,修不好整条删。------不过我好奇,干嘛不填充前就直接自动查;

②是不是有记忆才能答的问题 :只把触发那一句给LLM ,看 LLM 能不能直接答对,如果能就删掉。

③ Trigger句和线索句尽量不要出现相同的词汇。

5|【对话中塞入更长的上下文】+【明文询问线索句】 这两个操作形成新样本,作为对比组

1-4步生成的题目都在 2,500 个 token 左右;

为了排除Agent没有能力找到线索和Agent想不起来用线索,作者做了这样一种对比样本,针对同一道题,在对话上下文中多塞4Wtoken, 并在Trigger句的位置,直接换成问线索句的答案,比如 那个琴上车放后备箱的例子里,问 "我把琴放哪儿了"

6|判分。

① Agent 回答 Trigger 句里是否包含要求的回忆内容(比如琴和后备箱)

② 增加混淆组:也是跟① 一样的判别标准

③ 用户自己想起来组: 回答到了①的答案反而算错 ,因为不需要提醒了。

④ 长对话对比组: 跟①一样

简评

其一、作者设计的对比组还挺多的,尽力 cover 了各种可能的逻辑漏洞,这很好;

其二、作者在这里设计的【前瞻记忆】测试场景,比较接近 Know-How 需要的模式------目标跟踪,状态保持。比如"被打断后接着做"这类场景,一个特化的设计是很容易跟住这类情况的------这也是当前很多记忆系统停留在的境地。但如果是广泛know-how 上的"目标跟踪,状态保持"的结构呢?很容易做得结构很重,耗时很久。不做状态保持的设计,在事后启动检索,最大的问题就是不知道应该启动检索。不知道应该搜索什么。

EvalMem: An Operation-Level Diagnostic Framework for Long-Term Memory Systems

一句话总结

作者把记忆系统的失败分成三种:

🌟 编码:把信息写进记忆库

🌟 检索:按问题把相关记录取回来

🌟 生成:用取回的证据作答

经过在多个 Benchmark 和记忆系统上的测试,作者认为检索是当前被测的记忆系统主要的问题。

💡 这里有几个小问题:

💗 编码环节本身就影响检索查得率:比如我自己的记忆系统会加很多 tag,为的就是同时保证保真存储和便于查得,但作者做了一个基于【事实记忆】层面的取舍------主要检查 写没写进去,写进去的是否清楚正确。

💗 检索这一步看似是一个环节,但工业设计上往往是 2-3 步。

我自己的记忆系统,是把检索拆成3 步:

需求预测 ➡️ 记忆检索 ➡️ 记忆推荐(过滤和选优),作者这里关注的是结果层,即------我不管你用什么方法,反正记忆数据在库里,你找到没有,找到了是不是排在前面(排在 top-6 以外一样算失败)。

好处是问题很纯净,坏处就是没有对常见的记忆分析检索(比如我的需求预测)能力进行评价,也忽略了不少系统其实都考虑了检索后过滤这点,有点过度放大系统缺陷。

当然,这是作者做的取舍,增加环节也要考虑被测的大部分系统能不能支持,结果解读是否公平等。我认为作者的取舍是有道理的,这里是要提醒读结果的时候要注意这点。

作者关注的问题类型

  • 编码的问题:该记的事实没进库,或者进了库也不能用------没写进去、写成一个模糊的值(比如只剩一个代词)、值写错,还有把不该有的假事实也写进去了。
  • 检索的问题:事实明明在库里,系统自己取不回来------压根没取到、取到了但排得太靠后、取到了但被无关内容稀释,以及在没证据的题上取回一条看着相关、其实误导的记录。
  • 生成的问题:完整证据已经摆在眼前,模型还是答错------该拒答却硬答、无视证据靠自己的知识答、读了证据但推理错。

测评结果

测试 setup

作者在 3 个 benchmark 上跑了 7 个记忆系统:

benchmark :

LoCoMo(1986 题)、LongMemEval-S(500 题)、作者自建的动态版 DynaMem-Bench(962 题,后面说这个Bench是如何设计的)

7 个记忆系统 :TiMem、O-Mem、EverMemOS、MemOS、MemBox、MemoryOS、GAM;

记忆系统配套的LLM:gpt-4o-mini,gpt-4.1 和 Qwen3-30B

结果表

作者测的 locomo 的结果是这样的。

👆 很难相信现在还有人能做出这种丑图来(就是我🥵,因为作者把失败类型写成了缩写,直接写图上比较好理解,我就这么丑这写上了......)

上表中每一栏的最右一列就是这个环节的总失败占比。另外,这个失败占比是事后才做的一道检查,结果是有偏的。 即,即便过程中有瑕疵,但 locomo 的检查过了,那也是不算占比的。

简评

  1. 问题的分类可以面向记忆系统设计的整体理念,而不是现有的部分系统形态。诚然,要完成 eval 工作确实要在各个系统之间闪转腾挪,但终究,做这个工作的一部分贡献就是研究的 position,到底什么是值得继续做的。这点对我来说是个遗憾------作者做的工作不少,差这么一点点启发性。
  2. 数据占比是从占失败比例出发的,这点不利于作为后续记忆系统测评工作的指导(我是认为做 Eval 工作的论文应该有这个初衷);
  3. 小瑕疵:被测的七个系统里没有最有名的那几个。 Mem0、MemGPT(Letta)、Zep、A-Mem 都不在名单里
相关推荐
ms72wx1 小时前
Docker 命令学习笔记:从入门到进阶的实战指南
笔记·学习·docker
NoteDeep 深度笔记3 小时前
排期看不出冲突?把任务表切成甘特图
笔记·个人开发·甘特图·笔记应用·深度笔记·云笔记
霍霍的袁4 小时前
【C++11】左值右值引用与移动语义详细笔记(左值右值、右值引用、移动构造、移动赋值、引用折叠、万能转发)
c++·笔记·学习·visual studio
MandalaO_O4 小时前
SpringMVC 异常处理 & 拦截器
笔记
天树星智源4 小时前
相机轨迹为什么对不上:问题不在控制模块,而在两段噪声不是同一份
论文阅读·机器人·大模型
李永奉5 小时前
杰理可视化SDK开发-音频录制功能使用教程
笔记·单片机·嵌入式硬件·mcu·物联网·音视频
ysu_03145 小时前
【C++ 进阶之路】(二)从内联函数到类与对象:深挖内存对齐、this 指针与三大默认成员函数
开发语言·数据结构·c++·笔记·面向对象·this
叼烟扛炮5 小时前
Linux 学习笔记(三十二):线程控制——创建、等待与分离
linux·运维·服务器·笔记·学习·1024程序员节
Nuanyt5 小时前
LeetCode Hot 100 · 双指针 3 题 Java
java·笔记·算法·leetcode·双指针