十月最后一周,我把 memory.py 整个注释掉了。
不是重构,也不是优化,是让它彻底不参与——代码还在仓库里,一行都不跑。
- from memory import remember, recall
+ # from memory import remember, recall # 先放放,理由见下
起因是我刷到 10 月 21 号挂上 arXiv 的一篇短文,MemoryTax,作者 Zedong Peng,cs.CL 和 cs.AI 双挂。标题里那个 tax,我第一眼以为是修辞,读完发现是字面意思:提前决定「什么该记住」这件事本身要花钱,而且经常花得不值。
我这两周干的就是这件事。
def remember(turn):
if looks_important(turn): # 关键词命中 + 长度阈值
store(turn)
# TODO: 重复的内容要不要合并
# TODO: 用户改主意了,旧的那条到底删不删
looks_important 我前后改了三版,第三版还加了一条「含疑问词就记住」。写完我自己都觉得荒唐——我在用今天的我,去猜三周后的我会问什么。
论文里有句话让我在椅子上坐了一会儿:智能体记忆存在一个上限,这个上限由写记忆的那个模型决定;读的时候换成更强的模型,也捞不回来弱模型写的时候漏掉的东西。
我那个负责写记忆的模型就是我自己。学了两个多月、连自己项目的数据流都还没摸顺的那个我。
它比我讲究的地方是,人家至少拿真系统去比:Mem0、Zep 这种预建记忆,对上「什么都不筛、原始历史全留着、让模型自己拿工具翻」。数据集是 LoCoMo 里的一段对话,419 轮,152 个问题。四种记忆方法配三种编码智能体,每种组合再分别跑三个模型。
最扎心的一条:Mem0 只有在配 GPT-4o-mini 的时候赢过完整上下文,而且光「建记忆」这一项的开销,就超过跑一次完整上下文的总成本。
我对这条的理解可能有点偏,先这么记着:预建记忆干的是替弱模型补课的活,可补课的老师也是那个弱模型,补出来的笔记,上限就在那儿。
Pi 在 Claude Opus 5.5 下拿了 99%,成本不到完整上下文的一半。我看见 99% 的第一反应是「这也太猛了吧」。
往下读才发现,这个数是由几部分凑出来的。Pi 的一部分领先来自只有智能体能读到的照片说明文字;在 88 个证据里不含照片的问题上,Pi 和完整上下文只差一个答案;它唯一答错的那题,还是参考答案本身标错了。
有人在讨论 Pi 这成绩算不算有水分。水不水分的跟我没关系——我的项目里没有照片,没有说明文字,所有「证据」就躺在对话记录里。那个 99% 我先打对折看,打完折剩下的结论还是同一句:别提前筛。
写到这儿我得停一下,我不太确定自己是不是又被一篇论文带着走了。
上周我还在给 looks_important 调阈值,觉得这套东西再养两周就能用;两天前看完那篇,立刻觉得它一文不值,注释掉的时候甚至有点痛快。这中间哪一步是我自己想通的,哪一步只是刚读完一篇写得挺有说服力的东西,我分不清楚。可能下周我又把 memory.py 放回去。
还有个让我心里没底的细节:这篇论文每个实验组合只跑了一次。我这种被「多跑几次取平均」吓大的人,看到这个应该警惕才对。但我还是信了,因为它跟我自己踩的坑对上了——没跑对照组这件事,我自己不也干了两个星期?
这算不算 confirmation bias?可能算。评论区蹲一个大佬,谁懂这个统计上的门道,帮我说一句。
现在我的做法很土:什么都不筛,原始历史全塞进去,让同桌自己去翻。今天的同桌是 Claude Code。
成本是真的肉疼。每多聊几轮,context 就多一截,到后面每一次请求都像在往里面倒钱。但比起我花两周写的那个模块,我倒觉得这个钱花得明白——至少我知道钱花在哪儿,而不是花在一个我自己都说不清楚为什么这么写的函数上。
这块知识对我来说还是很夹生。BM25 那条线我压根没试过,全量塞迟早会撞上 context 上限,撞上之后怎么办,我现在没答案。是不是那时候还得回头去建记忆,我也说不准,到时候再说。
还有个更基本的问题一直没搞明白:判断一段信息「以后有用」,到底需不需要先知道以后要问什么?如果不需要,我那个 looks_important 就还有救;如果需要,它从第一天起就是错的。
我倾向后者,但这是我今天看完论文之后的倾向,不作数。
明天打算先把完整上下文那版跑通,把每次请求的实际开销记下来,数字总比感觉可靠一点。跑完是多少,我再来写。
