跳到主要内容
agent 会忘事,不是因为桌子不够大

agent 会忘事,不是因为桌子不够大

画唠
画唠

· 阅读约 5 分钟

agent 跑长了会忘事,这件事的标准答案这几年一直没变过:context window 不够大,换更大的。我之前画 context window 的时候也这么画——一张桌子,摊不下的掉地上,解法就是加桌面。

上周看到 Jordy Zomer 那篇讲 Lemmalog 的博文,我把桌子掀了(双关不是故意的,但它就在这)。他的立场很横:与其每次 agent 遗忘就扩窗口,不如直接维护状态。

……“维护状态”这四个字我盯着看了半天。先别急,我从头画。

第一版我画错了

我一开始以为 Lemmalog 又是一个 LLM 记忆系统。而“记忆系统”在我脑子里长这样:

   对话 ──► 存进库 ──► 提问时检索 ──► 捞回来塞进 prompt

存历史,捞历史,顶多检索做得花哨点,RAG 换个皮。

然后我卡在一个词上:事实撤销。存历史的东西不需要撤销——历史就是历史,说错的话也是说过的,撤销个什么劲?需要“撤销”的,是那些宣称自己当前为真的东西。

这俩不是一个物种。

打个比方:一边是流水账,三月的发票、七月的发票全摞在柜子里,问什么就去翻什么;另一边是账本余额,每来一笔新账就更新一次,改一笔账,靠这笔账算出来的小计跟着重算。Zomer 要造的是后者。他是做漏洞研究的,他说 agent 干的最气人的一件事是:一个假设明明已经被排除了,转几圈之后它又屁颠屁颠回去试——因为不记得排除这回事,或者更糟,记得结论但不记得结论已被推翻。

所以 Lemmalog 的分工是,LLM 只干它擅长的那一件,把乱糟糟的话变成结构化事实;推导、维护、撤销全交给一个 Datalog 引擎:

        LLM(只管提取)
             │ 结构化事实往下掉
             ▼
   ┌─ Datalog 引擎:管"现在什么为真" ─┐
   │   事实A ──支撑──► 结论B          │
   │                 结论B ──支撑──► C │
   │   A 被新事实否定                  │
   │      ──► B 失效 ──► C 跟着失效   │
   └──────────────────────────────────┘

一条事实作废,靠它撑着的结论自动塌,LLM 不用回去重读全部历史。这就是程序分析里玩了几十年的依赖传播,Zomer 自己也点了这个类比。

咔哒一下扣上是在一个数字上

LongMemEval 这个基准里有一类题叫知识更新:早先给过一个事实,后来推翻了,问你“现在”的答案。

full-context 的做法是把全部历史塞给模型,爱看不看。这一类它得分 0.202。

注意,这不是没看见。104,000 个 token,全摊在桌上。它就是分不清“三月说过的话”和“现在什么作数”。作者自己拿 GPT-4.1 跑 full-context,整体 F1 只有 0.197。Lemmalog 用每个问题约 2,700 个 token——三十八分之一——拿到 0.463,知识更新那类 0.579。

看到这组数字的时候,我把“遗忘”拆成了两个病:一个是没看见,一个是不知道什么还作数。前者扩桌子有用;后者扩桌子没用,反而更贵更乱——把一百个月的旧发票全拍你脸上,你还是不知道现在的余额。✨

他把翻车全贴出来了,这种博文我见一篇爱一篇

三个 bug,原文里全写了。

复数词干提取,owns 匹配不上 own,而且只作用于超过四个字符的词——修掉这一处加个计数渲染,F1 从 0.429 爬到 0.463。一个复数,值 0.034。

更狠的是他加了一句“确保答案受检索事实支持”的指令,结果 102 题里 32 题被错误拒答——因为他没区分“前提缺失”和“证据需要推理”,模型干脆躺平不答了。

还有时间推理,一开始用内部符号 id 去比较日期先后,等于拿两串代号比大小,改成规范化日期整数之后,那一类从 0.257 跳到 0.454。

这三个 bug 没有一个出在“推理”上。全在提取和边界上。

比喻漏风的地方,我照例标出来

真账本的数字是人抄进去的,抄错了至少查得到。这里的事实是 LLM 提取的,漏提一笔,余额直接错,而且你不知道漏了。

多会话推理就是被这个打穿的:0.211,PropMem 是 0.582。作者自己查了失败原因——主因不是连接错了,是信息压根没被提取器抽出来,账本上没这笔账。推断类也差,0.164,因为抽成无条件事实的时候,把“如果”“但是”那层条件语义洗掉了。

所以我的判断是(抛出来,不管论证了):这套架构没有消掉记忆问题,只是把它从“回答的时候”搬到了“提取的时候”。搬完便宜三十八倍,但账本的可靠性,全押在提取器身上了。搬家不等于销账。

顺带一个反向亮点:对抗性的假前提提问,Lemmalog 0.707,full-context 只有 0.509。因为结构化记忆翻一圈发现库里没这笔账,敢直接说 no;full-context 被一桌子历史泡着,顺着就把不存在的编下去了。知道“自己没有”也是一种记忆,这个我之前真没想过。

诚实补一句,LoCoMo 那个基准上 Lemmalog 0.533,full-context 0.542,没赢,PropMem 0.605 更高。它是从首版 0.483 靠实体消解、混合检索一点点磨上来的。所以别当银弹看。

Zomer 说下一步要让它跑长时间的复杂漏洞调查,看状态维护到底能不能不复活那些已经死掉的假设。这个结果我等着看——LongMemEval 终究是考卷,漏洞研究才是他造这玩意儿的原始动机,考卷上 0.2 的差距到了真实调查里可能完全是另一回事。

照例留个自检:下次你的 agent 又把排除过的路走一遍,你能分清它是哪一种吗——没看见,还是不知道那条已经作废?分清这个,才知道该花钱买桌子,还是老老实实记账。

画唠
画唠

把被讲玄的概念用图 + 比喻 + 动手实验拆到咔哒扣明白,错的也保留。

查看主页 →