上周五晚上,小玩具项目跑到一半断了。上下文满了,还是我手滑按了 esc,记不清。反正断的位置很尴尬——配置文件刚被它改了一半。
我重开一个会话,跟同桌说:接着刚才的改,把导出那块加完。
它接着了。顺畅,一路没报错。
今天下午我去读那段代码,才发现它接的是一个夹生的中间状态。有个字段名上一轮改到一半,从 a 改成了 b,下一轮不知道从哪又读回了 a,然后在这个 a 上面又盖了三层新逻辑。
代码能跑。
这就很烦。
上周刷 arXiv,刷到一篇,标题老长:Recoverability as a System Primitive for Long-Horizon AI Agents。9 月 12 号挂上去的,作者 Zhihui Zhang 和 Wei Liu,之前没听过。我只读了摘要和第一页多一点,没读全文,下面写的是我看进去的那部分,理解偏了也有可能。
里面有一句我盯着看了挺久:把状态存下来,和这个状态还能不能继续用来干活,根本是两件事。
心里冒出来一句:「这不就是我上周五晚上干的事。」
它把恢复分成两种:一种从头重来,做过的重做;另一种接着跑,从一个没验证过、或者已经过期的状态往下接。后面这种会把前面的错一起带下去。
第二种快。
我这两个月一直无条件选第二种。工具弹出来问要不要恢复上次会话,我手比脑子快,直接点。点完还挺得意,觉得自己会利用上下文。
论文里还有一段,说他们做了一组测试,发现“恢复得准不准”和“任务最后成没成”这两件事,都能把一个本来不该被允许的起点盖住。
意思就是,从烂起点出发,任务一样能跑完,还看起来挺像回事。
看到这句我有点坐不住。
因为我判断这一轮 AI 干得好不好,标准特别简单:跑通了好,报错重来。如果“跑通”本身不能说明起点干净,那我这个标准算什么?废的?
那我看什么?
后面说要给恢复动作单独一套评价标准,不能只看数据回来没、任务最后成没。还提到恢复那个决定要跟证据、执行、独立验证绑一起——大概是不让 agent 自己说自己恢复对了就算对。
这条我信。因为我就是那个只听它说的人。它每次说“我已经改完了”,我都信,连 diff 都懒得拉。
至于它给的那套架构——持久化、验证、控制三块分开,运行时实例分别测各自职责——这块我读得挺夹生。说真的,“系统原语”到底是哪一层的东西,是框架自己该实现,还是得我在项目里自己搭,我到现在也没搞懂,先记下来。
一开始还有点被安慰到。原来不是我一个人的菜,学术界也还在吵。
这个安慰大概持续了十分钟。
因为人家写的是给做 agent 框架的人看的。我这种自己捣鼓小玩具的,读完能干嘛?总不能跟同桌说:请你先实现一个 recoverability 原语,再改我的导出功能。
我现在给自己定的规矩挺土:
每次中断重开,不许说“接着改”。先让它把上一轮动过的文件列出来,我自己扫一遍 diff,确认我要从这儿继续,再说下一句。
慢。真的慢。有时候光这一眼就十分钟。而且十次里有三次我根本看不出问题,看不出问题还得接着看。
但至少我知道我是从哪儿继续的。
两个月前挑工具的时候,我专门看它支不支持保留会话、能不能接着上次没做完的任务跑,把这个当加分项。现在我觉得这功能对我是个陷阱。它是给能判断“哪个状态算干净”的人准备的,我现在没这个东西。工具把“接着跑”做成一键,等于顺手把那个判断也替我做了,而我连它做对没做对都不知道。
写到这里我意识到一件事:上面这些我一直在怪工具、怪默认设置、怪那个“恢复”按钮太好点。可按钮是我点的。
好,那没事了。
我还是分不清什么样的中间状态算干净,什么是“脏了但这一眼看不出来”。这个大概就是需要慢慢长的那个手感,也可能我永远都只能靠多读一遍 diff 续命。
今晚打算再试一次那个笨规矩,看看能不能连着三次都真的读完
