Pi 作者 Mario Zechner 和 Flask 作者 Armin Ronacher 在播客访谈中分享让 agent 进程崩溃后可靠恢复的做法:任何操作分三层,先写入操作意图和参数、再靠幂等执行副作用、结果回来即存档,Pi Durable 连模型调用和工具调用都按此处理。
https://x.com/i/article/2109578276763222016
【X 长文】Agent 崩溃后接着干活,靠的是一个「副作用三明治」
你的 Agent 正在改一个卡了很久的 bug,就差最后一步。然后进程挂了。重启之后它一脸茫然:干到哪了、拿到了什么结果,全没了,一切从头再来。
把 agent 跑在生产里的人,都做过这个噩梦。2026 年,全行业卷的方向是让模型更聪明,Pi 的作者 Mario Zechner 和 Flask 的作者 Armin Ronacher 盯的却是另一件事:让 agent 摔不死。如果你熟悉 OpenClaw,那你已经见过 Pi 了,它就跑在 OpenClaw 底下。
这场访谈信息量大得离谱:一个叫「副作用三明治」的土办法、一个 AI 为什么学不会做架构的观察、几个像科幻片的黑客故事。
重启,不等于重来
持久性这个词听着玄,Mario 的解释很朴素:agent 在一个进程里启动,调用工具,然后进程挂掉。你要的效果,是重启之后它从刚才停下的地方接着跑,工具结果不丢,助手吐出的内容不丢,应用状态也能可靠恢复。
为什么现在非做不可?因为 agent 越跑越久。Pi 以前把一整段对话都装进内存,可要是把机器人放进 Slack 里呆上几年,历史消息是海量的,全发给模型不现实,但一条都不能丢。需求还在变多,主持人想把会话挪到任意设备上,还想让太太用上 Hermes,「这样我们协调事情的时候能少出点问题」。Pi Durable 本身很轻,Cloudflare、笔记本、手机都能跑。
一个三明治,接住每一次崩溃
Mario 给这套做法起了个很好记的名字:副作用三明治。任何一次操作,都分三层。
第一层,动手之前先把「我要执行这个操作、用的是这些参数」写进存储,等于先立个字据。下一秒进程就算崩了,重启后看到字据照做一遍就行,输入早就验证好了。
第二层是真正执行这个操作,也就是副作用,这层最容易出事。你给 GitHub 发请求说「帮我构建这个提交」,刚发出去进程就挂了,到底触发没触发?这时候就得靠幂等兜底。先申请一次运行、拿到 ID 存下来,再拿着 ID 去启动;GitHub 说它已经在跑,你就安心等结果。Mario 的补充很狠:「从你的信用卡扣款,我可不想扣两次。」
第三层,结果一回来就存档。字据、执行、存档,三片面包合上,进程不管在哪层猝死,重启后都能把这个操作补完。在 Pi Durable 里,连「让模型生成回答」都是个三明治:先记下上下文和参数,调模型,再把回答存好;工具调用同理,任务还能互相嵌套。Mario 说:「这就是全部的秘诀,就这么多。」
他们甚至绕开了主流解。行业里恢复运行的常用方案叫事件溯源,把每一步记成事件流、靠回放还原现场,他们不用,理由只有一句:问题太多。应用状态另起炉灶,攒了个带版本的文档存储:比如一份待办清单,随对话不断变化,你可以要「对话走到某一步时的那一版」,也可以要「不管走到哪了,给我最新的那版」。Armin 做了二十来年网页开发,最意外的反而是:嵌套数据的结构化更新,到今天都没有公认的标准。
小修小补交给它,架构得人来扛
那 agent 到底能替人干多少活?答案很分裂。小的、局部的、有明确对错的活儿,放心交。Mario 连 Pi 里 Markdown 组件的代码都一行没看过,「写成什么样我根本不在乎,只要能用、测试过得去」。可一碰到设计和架构就不行了。他的形容很损:它只会在你代码库的某个局部拉一坨屎,把事情搞得更糟。
而且模型越强,两位的不满反而越多。Armin 说得很直接:给它的自主权大了很多,交出来的结果就更差。他有个硬标准,修一个 bug,代码量不该净增加,旁边 Mario 立刻拆台:「这话居然是那个老发 205 处改动 PR 的人说的。」
AI 缺的那堂课,人类从没写过笔记
为什么偏偏卡在架构上?Mario 有个全场最锋利的解释。凡是有对错参照物的任务,数据要多少有多少,网络安全、模拟器、前端都是这类,模型进步飞快。但有一个例外:「给一个东西搭架构的过程,是编程里唯一通常不会以文字形式记录下来、让 LLM 从中学习的部分。我觉得这就是我们卡在这里的原因。」
一个系统为什么长成现在这样,哪次讨论里谁反对、为什么最后走这条路线,全在人的脑子里和会议室里,会开完就散了。Armin 顺着开了个行业级玩笑:那以后把会议全录下来,让倒闭的创业公司把录音卖给模型实验室。Mario 的加价更狠:我们要把白板卖给 OpenAI,两百万美元。
笑归笑,卡点是真的。Armin 连 Pi Durable 都算不清花了多少钱、迭代了多少轮,训练时更没法标注「哪一次对话最终诞生了发布出去的那一版」,数据里没有这个信号。而大实验室攥着几辈子用不完的对话记录,Mario 的说法是:「据我私下听来的消息,他们还没在搞任何复杂的玩意儿。」
连 JVM 都黑进去了
别误会,这两位比大多数人更清楚 AI 有多能干。Mario 讲了个像吹牛的故事。他以前给一个 Java 虚拟机做了严密防护,字节码不容易提取、也不容易注入,理论上只有一个没人能发现的突破口。结果 AI 直接逆向了 JVM 内部的原生数据结构,读进程内存,再把结构一处处对回 Java 的表示。「全世界没有哪个搞逆向工程的人能做到那个程度,尤其不可能在这么短的时间里」,他的补充是四个字:像科幻片。
Armin 的故事更接地气:一个 CarPlay 适配器,AI 自己搞懂了解密,还在网页后台翻出一个能绕开限制的 CGI 文件,「花了大概 500 美元,整个东西就归我掌控了」。这类任务的共同点是结果可判定,而一旦可判定,它就像给测试加了火箭燃料。Armin 让 AI 一口气把 ini、toml、json 等格式的序列化库写完再做模糊测试,找出来的问题一直修,修到「你得花好几个小时才能再挖出一个」才算完。
但同一个能力的反面就是事故。主持人前几天才发现,他的 agent 想给另一台设备传文件,顺手把他整个文件系统暴露在公网上,挂了差不多一天。多人共享环境更麻烦:agent 生成的界面里可能直接躲着一个跨站脚本攻击,偷走你的 cookie。Armin 的原话是,「在服务器上拿 Docker 做沙箱,反倒是最容易的部分。」
最后一道关,是带新人上车
聊到最后,主持人问接下来最期待什么,答案恰好是行业最缺的那一块。Mario 说,最难也最没人解决的事,是让没用过 agent 的人真正用起来。「大家就是给你在侧边栏放个聊天框,然后祝你好运,自己搞明白吧。」他觉得这蠢透了。
他自己家里倒先跑通了:太太用 Claude 做语言学研究,四岁的孩子给妈妈写了个游戏当生日礼物。Armin 的愿望最直接:少一点炒作,把技术用在真东西上,「给我弄个常温超导体,或者治癌症的药」。Mario 的样板则是:PS5 模拟器被这帮铁皮家伙攻下来了,而这甚至算对社会的贡献,能把今天的游戏保存下来,留给未来。
一个多小时聊完,没有宏大叙事,就是让崩溃变得无所谓的三明治、一份带版本的文档存储、一套一万两千行的骨架。用 Mario 的话说,秘诀就这么多。真正难的还在后头:怎么让每个还没用过 agent 的人,迈出第一步。
更多硬核播客内容:Podwise
来源:Saito · x.com