自我改进的软件记忆
AI 智能体环路
一个会遗忘的环路,只是一条更快的直线。真正有意思的地方不在于智能体能写软件,而在于每一轮都能让下一轮更省力。
核心论点
大多数智能体的运行方式,都是每一轮从零开始。模型读代码、形成假设、动手尝试、失败、再试,最后总算搞定。然后会话结束,前面这一整套推理全被扔掉。下一个智能体接手下一张工单时,又要为同样的调查再付一次代价。
解决思路不是换更大的模型,也不是把上下文窗口撑得更大,而是给这个环路一个地方存放学到的东西,再给下一个智能体提供一条便宜的查找路径。这样一来,一张完成的工单产出的就不只是一个提交,还有知识、后续任务,最终甚至会改变智能体本身的运作方式。
环路
人类写工单。智能体认领一张,然后跑完整个环路。
干活之前先搜记忆,干完之后再记下一条心得——正是这两步,让这套做法区别于在终端里直接跑一个智能体。中间其他的部分都是常规工程。它的价值在于:一轮的最后一步,会成为下一轮第一步的输入。
工单是共享状态
当多个智能体同时运行,跨多台机器、跑在不同模型上时,它们得知道哪些活已经有人在干。Git 回答不了这个问题。分支只能告诉你别人完成了什么,不能告诉你二十分钟前谁刚动手开始。
一套共享的工单系统能回答。认领状态是集中式的,更新即时生效,所以分配这件事,智能体直接读就行,不用去猜。这才让跨机器的并发变得可接受,而不是变成一个合并难题。
心得就是记忆
一条心得是一小段结构化记录:标题、触发条件、正文,以及它来自哪个项目和哪张工单。其中最重要的是触发条件。它用一句话描述这条知识在什么时候有用——注意,不是知识本身。
智能体并不会把所有心得都加载进来。它们加载的是一份触发条件索引,很轻量;只有当某个触发条件命中眼前的工作时,才去取回完整的正文。
加载触发条件索引。很小,每次都会加载。
把触发条件和手头的工作做匹配。
只有当这段学习很可能派上用场时,才把完整内容取出来。
目标不是囤积知识,而是积累知识的同时不让每次未来的提示词都变大。一个运行了一年的项目,应该能存下一年里辛苦积累的细节,又不用让每个智能体都为携带全部内容而付出代价。
衡量标准是「每个正确工单消耗的 token 数」
没有记忆时,一个循环是这样的:检查、假设、测试、失败、再检查、发现。有了记忆,循环可以变成:搜索、检索、继续。如果这种替换真的成立,它会在曲线上体现出来。
每个成功完成的工单所消耗的 token 数和实际耗时,是值得盯住的指标,同时还要看重试次数、检索频率,以及工单被重新打开的概率。工单的难度并不一样,所以原始曲线需要先做归一化才有意义。但预期的方向是明确的。
正确性是约束条件,不是可以交换的筹码
目标不是拿质量换速度。正确性是必须的。在正确的解决方案中,再尽量少用 token、少花时间。
这个思路只适用于能够真正判定正确性的项目——工单要么能跑通,要么跑不通。在一个连自己是否正确都判断不了的系统上做成本优化,只是换一种更便宜的方式犯错。
记忆放在哪里
有充分理由把工单和学习记录放在代码仓库里。文档放在它所描述的代码旁边时最准确,把记忆存进 Git 还能免费获得版本历史、就近访问和评审流程。Fluent 是我在旧金山「自我改进软件」聚会上了解到的一个项目,它就把学习记录存在 Git 里。它目前不把工单存在那里,不过作者对这个想法很感兴趣。
我正在测试另一种方案。把记忆放在代码仓库外面,每个智能体在任何机器上都能立刻看到,不用等分支或提交。智能体可以在信息还有用的时候,就知道某项工作已经开始,或者某个发现已经被记录下来。
外部记忆牺牲的是可审查性和版本历史,换来的是即时性。这只是一个假设,不是结论。这笔交易哪一方更划算,正是这个实验应该能够回答的问题。
记忆必须会衰减
只增不减的记忆会变成负担。经验会过时,互相矛盾,还会重复。今天靠人来审核,这没法规模化,积累到几千条就撑不住了。
自我调节的版本用检索本身作为信号。
记忆应该能够遗忘、合并和纠正自己。积累只是容易的那一半。
技能是过程记忆
每个 agent 在开始之前都会加载一套共享的操作技能。它和项目知识分开,回答的是另一个问题。学习库回答的是这个项目已经学到了什么?技能回答的是 agent 应该如何在系统内工作?
今天这套技能是由人维护的脚手架:加载索引,动手前先搜索,认领工单,记录发现,检查重复,提交,必要时通知其他 agent。真正有意思的一步是让 agent 来改它。到那时,系统学到的不再只是关于代码库的事实,而是在学它的 agent 应该怎么工作。
这必须是有度量的自我修改,而不是自由地自我编辑。技能变更和其他变更一样:要对照 token、时间和任务完成情况来评估,一旦让情况变糟就回滚。回滚路径才是敢于放开自主权的前提。
自我改进的五个层次
“自我改进”这个词被用得太随意了。值得把实际主张的东西分清楚。
Agent 完成任务并修改代码。这就是普通的软件开发,哪怕开发者是一个模型。
Agent 把自己发现的东西保留下来。下一个 agent 直接继承答案,不用再为同样的调查付一遍代价。
工单状态和记忆跨模型、跨机器共享。并行工作不再依赖某个 agent 去猜另一个在做什么。
使用信号显示出哪些经验和流程真正有用。记忆被排序、合并、清理,而不是只增不减。
智能体改变的是后续智能体运行时所使用的工作技能。这些改变要根据结果来衡量,决定保留还是回滚。
大多数被称为「自我改进软件」的东西都停留在第 1 级。第 1 级到第 2 级之间的差距,正是复利效应开始的地方;而第 4 级到第 5 级之间的差距,则是系统不再只是一堆编码智能体的分界线。
测试项目
一个理想的测试平台很难搭,它得大到重新发现成本很高,并行度足够让多个智能体同时跑,同时又足够确定,让正确与否可以判定。一台机器上同时跑三四个智能体,再加一个联合创始人的机器,横跨 Codex、Cursor、Claude,以及其它值得一试的工具。哪个模型跑哪张工单,故意不纳入架构设计。共享的工单、记忆、代码仓库和技能,才是连续性所在的那一层。
尚未解决的问题
-
一条学习的价值该如何评分?
-
未使用的学习应该以多快的速度衰减?
-
触发匹配应该保持文本匹配,还是改成语义匹配,或者两者兼用?
-
智能体之间的临时消息传递,实际帮助到底有多大?
-
工作技能中哪些部分应该允许智能体自行修改?
-
一次技能修改要跑多久才能下判断?
-
比较 token 开销时,工单难度该如何归一化?
-
哪些学习是项目专属的,哪些可以泛化?
这些与其说是实现上的空白,不如说是下一轮的实验课题。
一个可用的定义
自我改进软件是这样一种开发系统:一个循环的产出,能降低下一个循环的成本、提升速度、增加知识或优化运行流程,同时正确性始终是一条硬约束。