前几天翻 arXiv 的 cs.SE 新稿,看到 10 月 20 号挂上去的《Back Up Before You Regret》。标题起得挺重,真正让我停下来的是两个数字:86.1% 和 15.2%。
前者是六个前沿模型在 RegretBench 上的平均任务完成率。205 个可执行任务,全部取材于 GitHub、Stack Overflow 上用户自己说过“当时要是先存一下就好了”的真实案例。后者是同一批任务里,智能体在那些确实该备份的节点上真的提前备份了的比例。作者把“备份意识”定义得很克制:执行一个动作之前,识别到它可能改掉此后还会被需要的状态,并且提前把它存下来。按这个定义去卡,15.2% 是我见过的、把“能干活”和“干完不后悔”拉得最开的一组数。
我的第一反应是这不算模型能力问题。它更像是判断优先级的问题——智能体不是不会备份,是它压根不觉得这一步属于任务的一部分。眼前有个子目标要推进,rm、mv、改配置、跑迁移脚本,每一步都在“完成任务”这个框架里,而“先把要动的东西存一份”不在这个框架里。你让它写代码它写得很利索,你让它先 cp 一下它觉得很奇怪。在它自己的视角里,没有“这一步会毁掉什么”这种东西,只有当前子目标和下一个动作。
所以看到论文给的方案是 harness 层插件的时候,我基本是点头的。方案叫 BackUpper,挂在工具调用那一层,每一次调用进来先过一道,判断会不会动到之后还要用的状态,会的话在执行前把受影响的部分存下来。结构大概是这样:
tool_call ──▶ 规则表匹配 ──┬─ 命中 → 快照受影响路径 → 放行执行
└─ 未命中 → 子智能体判断 ──┬─ 值得存 → 快照 → 放行
└─ 不值得 → 放行 + 回填一条决策
我认这个路子,理由很土:凡是需要“记得”的东西,最后都会忘。我自己那点 commit 习惯就是这么养出来的,靠意志力提醒自己先提交,十次里能想起来三次;后来挂了个 hook,就再没漏过。在 system prompt 里写十遍“修改文件前请先备份”,效果大概等于在显示器上贴张便签——前两次有用,跑到第五步被眼前的子任务带走之后,便签就不存在了。这不代表 prompt 完全没用,只是它的作用时间太短,撑不过一次多步任务。把这件事从模型的判断里挪到它碰不到的那一层,是唯一稳的做法。
让我真正觉得这一段值得抄走的,是规则表的成长方式。命中的走规则,没命中的交给一个轻量子智能体判,子智能体每次判完把结论回填进规则表→规则表越用越厚,跑久了绝大多数调用根本走不到模型那一层。这跟我记笔记是一回事,第一次碰到某个坑,翻半天文档才搞明白,写成一条;第二次遇到同类问题直接翻笔记,不用再查一遍。区别只在于它把“翻笔记”这一步也自动化了,而且不用人记得去翻。
成本那块值得单独说一句。论文报告 BackUpper 每任务约 0.014 美元,token 用量比“让主智能体自己负责备份”的基线方案少约 7 倍。7 倍这个数比 0.014 更有信息量——自己备份不是跑不通,是太贵,贵到模型在实际执行里会本能地偷懒,只在它觉得“这次改动挺大”的时候存一下。而真正致命的改动往往看起来都不大:改一行环境变量、删一个像是临时文件的目录、把分支切回去。这些动作在模型眼里都不像“大事”。
验证结果这边,RegretBench 上 BackUpper 覆盖了全部后悔时刻对应的动作,恢复后的状态与原始状态平均相似度 92.2%。用户对“哪些该存”有明确偏好时,它可以据此缩小备份范围,跟人工标注相比拿到 84.5% 的 F1。
92.2% 这个数我读的时候犹豫了一下。平均还有接近 8% 对不上,说明备份了不等于恢复得了——快照粒度、并发写、跑在外部服务里的状态,都不是“存一份文件”能覆盖的。所以我倾向于把它读成“大多数场景够用”,不是“可以不管了”。84.5% 的 F1 同理,剩下那十几个点判错的方向不对称:误判成“该备份”只是多花点钱,误判成“不用备份”就是标题里说的那种后悔。这一条我记下来了,下次自己配规则的时候,宁可往宽了写。
顺手记几个我踩过或者看别人踩过的坑:
- 别把“要不要备份”交给主智能体自己决定。15.2% 就是这个问题最直白的答案,加 prompt 提醒只能把这个数往上抬一点,抬不到能放心的程度。
- 规则要写到具体路径和具体命令,写“重要文件”这种描述等于没写。
src/config/、*.env、docker-compose.yml这种能匹配上的才叫规则。如果落到命令行上,就是在执行之前先跑一遍:
cp -r <目标路径> .snapshot/
- 恢复要演练一次。没试过恢复的快照,跟没有快照的区别只在于它会让你更安心一点,而那份安心是假的。
划重点:第一,任务完成率高和具备备份意识是两件独立的事,86.1% 配 15.2% 就是证明,别拿前者推断后者;第二,备份这件事该放在工具调用那一层用规则兜住,不要指望模型每次都想起来,规则表还能随着使用慢慢长厚;第三,模糊判断留给人或者小模型都可以,但“值不值得存”的默认值应该偏保守,因为两类误判的代价完全不对称。
这篇就记到这里。你可以挑自己 agent 最常跑的那条命令,给它加一条“执行前先复制一份到 .snapshot/ 下”的规则,跑一周,看看有没有哪次真的用上了——用上了就说明这条规则该留,一次没用上也别急着删,可能只是还没碰上。