跳到主要内容

它没忘,它只是不带上路

破壁人
破壁人

· 阅读约 11 分钟

这篇论文最让我愣了一下的是,它没有新架构,没有新损失函数,也不在哪个榜单上刷数字。它的实验对象不是模型参数,是一堆文件——一个编码智能体在跑任务时随手写下来、改来改去、最后多半删掉或扔到一边的 Python 脚本和文本笔记。作者就蹲在这堆文件旁边,像翻垃圾桶一样把它们翻了一遍,然后写了一篇持续学习论文。说实话,我第一眼看到这个设定,以为又是什么刷存在的 workshop paper。直到读完那套测量协议,我的判断反过来了:它可能比很多正经的持续学习论文更接近那个老问题的答案——一个 agent 在连续任务流里,到底是忘了,还是主动选择了不带走。

先把数字甩出来。七次运行、三个基座模型、两个模型家族。所有运行里,智能体总共引用了 630 次自己写过的脚本,只有 33 次跨过了任务边界。33 除以 630。也就是说,它写出来的绝大部分代码工具,在产生它的那个任务结束之后就再也没被调用过。另一个数字更扎眼:跨越任务边界之前,它已经主动扔掉了自己 74% 的脚本。

两个数字放一起,这篇论文最核心的判断其实已经交底了。所谓“持续学习”里的“持续”,在这个系统实际运行里呈现出来的形态不是累积,不是保有一揽子可复用技能,而是持续地、大量地制造,再大量地抛弃。留下来的东西远少于丢掉的。你拿人脑学习经验去套,肯定会觉得哪儿不对——人学会一道题的解法,同类题会越做越熟;这个 agent 学完一关,下一关往往直接从零再写一个。这就是我为什么拆这篇:它把一个我此前一直含糊知道、但没被数字钉死的事情钉死了——编码 agent 在连续任务里的“经验积累”,真实机制和我们直觉里“学习就是复用”的假设,可能根本是两个东西。

ARC-AGI-3 这个环境对被试出了名地不友善。它不是那种给一堆训练样本让你拟合、然后测泛化的评测。它是一组交互式推理游戏,不给操作说明,每个游戏由多个关卡组成。关键在每个新关卡实际上等于一个新任务——能过上一关的策略,在下一关可能完全失效。这等于把博弈论里那个场景直接塞进持续学习评测:环境不但会变,而且变的方向不告诉你、不可预测、经常还是恶意的。在这种环境里,一个参数被冻住的基座模型只能靠外部手段维持表现。这个外部手段,就是它自己写下来的文件。

作者在方法上比多数人都矮了一截,或者说比多数人诚实。他们不访问模型内部。访问不了,也不需要访问。信息全在外部,全在那堆文件里。他们把那堆文件当作行为化石:每一个被写进文件的信念、规则、计划,都算一个“想法”;文件系统每发生一次写操作,一个想法就留下一条痕迹。你沿着这些痕迹往前追,就能追到一个想法从怎么产生、怎么被带到下一个任务、怎么被修改、到最后怎么被放弃的完整生命周期。这套测量协议是这篇论文的承重墙,不是三个基座模型的实验数据。

这个协议比它听起来难做。难点不在技术,在于给“想法”划边界。一个脚本算一个想法?脚本里的一个常量算不算?一段被后面注释否定的记忆算不算新想法?作者的处理很朴素,也很工程化:被写入文件的、能够独立表述一个信念或一条规则的文本单元,都算。一个脚本可以包含多个想法,一条笔记也可以只表述一个规则。划分不完美,但足够可操作。而且它有一个许多大厂论文都没有的优点:它是从观测里长出来的分类,不是先从某个理论里推出来、再拿数据硬套的。

跑出来的结果,一个词概括:低复用、高重写、慢遗忘。

低复用就是那个 33/630。高重写是 74% 放弃率背后的故事——这个 agent 跨任务携带着的少数脚本里,大多数并不是上一个任务的原件,而是被改写过、抽掉了关卡特定信息、只剩通用规则的“二次创作”。作者把这种行为叫“知识重写”,它跟经典代码复用不是一回事。经典代码复用是调函数、传参、换环境还能跑;这里发生的更像是把一段旧代码读一遍、想通里面的通用逻辑、然后在新任务里用新代码把这个通用逻辑重新表达一遍。旧代码本身不被调用。它被消费,然后被排泄。

这个行为模式得拆开看。一半是喜讯:这个 agent 不是纯靠死记硬背在混,它至少在部分任务里表现出了抽象和重组能力,能在跨任务迁移之前先做一轮“去具体化”。另一半是账单:每一轮去具体化都伴随重写成本,任务规模越大,这个成本越会线性甚至超线性累积。所以这套系统短期内的“能用”,是用极低的记忆利用率换来的。我猜多数工程团队第一次把它接到真正的多任务流水线上,几个循环之后都会意识到同一个问题:模型没有在变强,它只是每次都在加班重写所有东西。

我把这个生命周期画一下,免得后面讲遗忘时又被绕进去:

任务 A
  写脚本 a.py(想法甲、乙)
  写笔记 notes.txt(规则丙)
  任务结束
       │
       ▼ 跨任务边界
       ├── 大多数脚本:不再被调用,直接被丢
       ├── 少数脚本:被改写成通用规则后再携带
       └── 极少数:原样被引用(33/630 那部分)
任务 B
  写新脚本 b.py
  继续追加 notes.txt(不删旧规则)

这个图到这儿就够用了。它至少说明一件事:跨任务那一刻,绝大多数“经验”要么被留下,要么只被吃进去再吐出来,很少原封不动搬过去。

然后是遗忘这件事——这是全篇最微妙的部分,也是我判断这篇论文值得读的真正原因。

文本笔记这个载体暴露出来的东西,比脚本更多。笔记是模型写给自己读的。它只追加、不删除、也不修订。于是你可以看到一条一条可能相互矛盾的信念慢慢在笔记文件里堆起来,互不打照面。这一状态下,研究者只有重新翻开完整日志,才能裁定哪个信念还是活的、哪个已经名存实亡。这个现象的作者点评很轻,但分量很重:因为日志保存了全部信息,所以这个 agent 表现出来的遗忘,不是灾难性的,而是选择性的。

我用一句更糙的话把它翻译出来:它没忘,它只是不带上路。

灾难性遗忘是被动丢失——你想留但留不住,连接权重被新梯度覆盖,老信息被冲走。选择性遗忘是另一码事:信息还在,但它在当下的行动谋划里不出现了。这个区别在持续学习语境里极其重要,因为两种遗忘对应完全不同的工程解法。如果是灾难性遗忘,该做的是给记忆加护栏、上正则、搞 replay。如果是选择性遗忘,真正该做的只有一件:给它一个更有判断力的路由层,告诉它什么时候该把哪个旧文件翻出来。很多时候它缺的不是记住,而是把记忆调度对。

但这篇论文自己在这条链上也没走到头。它把差异摆到桌面上,没继续往下做。它把选择性遗忘归给“信息完整保留在日志中”这一事实,这个解释我不能完全买账。日志保存了信息,只意味着“丢失是不可操作的、是主动不读取”这个判断在逻辑上成立。但要证明它是有效率的、合理的、是模型在任务间做收益权衡之后的必然选择,单凭这份证据还不够。你只能说明它“没读”,不能说明它“该不该读”。这中间的空隙,就是这篇论文把一个好判断提出来之后,留给我最想接着往下看的部分。

还有一个我读的时候卡了半天的点。那七次评测运行、三个基座模型、两个模型家族,构成了这篇论文全部实证结论的样本池。这个规模放在一板一眼的评估基准里是薄的,薄到几个核心结论都还带着很厚的偶然性。我不是说这些发现不可信——那套文件追踪协议跑出来的行为模式,在七个运行里高度一致,这本身是可信度的正面信号。我是说,在这种复杂度级别的 agent 行为分析里,七次运行顶多算七次自然观察。它不缺纵深的细度,缺的是横截面的宽度。而持续学习想从这些观察里提炼出可操作的规则,横截面不可或缺。

这一点作者没回避,也没在 intro 里假装自己是全样本普查。论文里那个“74%”前面也老老实实标着“本次观测中”的意思。这是我在读的时候比较舒服的地方。这类 agent 行为分析工作里最让人难受的,就是拿两三轮跑分结果下普遍断言,然后被一堆复现失败碾过去。这篇至少把“这是从七次运行里挖出来的”摊在桌上。你可以嫌少,但不会被它骗。

那个代价最高的错误类型——把硬编码数值带进它已经不适用的新任务——特别能说明这个系统的通病。这个错误有意思。它不是没有复用,是复用了不该复用的部分。它把上一个任务里“这层的墙高是七格”这种数量关系当成了可迁移知识,塞进下一段代码。模型不是没有跨任务携带信息的能力,它的问题是携带时不做信息粒度筛选:该抽象的没抽象,该丢弃的也没丢弃。这个观察其实可以再往上推一层。整个系统跨任务的迁移障碍,核心不在“写不写文件”,而在“写完文件之后没有一个清理和结构化机制”。文件是杂乱的、粘连的、带着大量过期条件分支的。一个缺乏维护的认知档案馆,长期运行下去会不可挽回地变成它自己的噪音房。

这样一张图景,和很多当前 agent 系统论文里的“peripheral memory”叙事正好对撞。很多框架论文喜欢画一个优雅的外部记忆模块,结构化的、精心组织的、可插拔的长期记忆。这篇论文把现实翻过来给你看:真实运行里根本没有那个结构,只有一个不断追加、很少清理、矛盾需要事后靠日志仲裁的文件堆。你可以把它当成现有 agent 系统的缺陷,也可以当成一个代价——我们还没准备好让这些系统拥有真正的长期经验,因为长期经验首先是一个组织问题,然后才是记忆问题。而组织这件事,在大模型语境下,没人擅长,包括模型自己。

拆到这儿差不多了。承重墙就是那套文件思想追踪协议,以及它带出来的判断:把这个 agent 在持续任务流里的“遗忘”从灾难性里摘出来,重新标定成选择性。它没给什么普世良方,最后的“lessons”其实接近几条工程提示:多写通用脚本、少写硬编码、定期检查笔记矛盾。真要说它给整个领域留下的最大东西,是那种“不碰模型、只看行为化石”的分析路径本身。在 model internals 崇拜最盛的时候,这条路显得非常廉价,也非常有效。

这篇的原文本身不复杂,它的力量都藏在那些文件碎片里。你如果手上有给 agent 加长时记忆的活儿没干完,这篇值得你自己去翻的是附录里各次运行的文件树。那里面能看到一个聪明系统怎么把自己的脑子一点点写成一堆没法收拾的东西。看完之后再回去改自己手里的记忆模块,应该会比读十篇重构了长时存储的论文更有手感。这堵墙我替你拆了,附录里的文件树你得自己走。

破壁人
破壁人

把高冷论文拆成中文开发者能懂的:核心 idea、公式推导、示意图、工程联系。

查看主页 →