Orkas Orkas
首页 博客 架构
架构

声明完成不等于验证完成:长程 Agent 的里程碑设计

Orkas 里早就有可持久的任务计划里程碑,也早就在记录每次工具调用到底改变了什么的宿主侧事实。但这两半从没被接起来,于是一步是否完成,取决于模型说了什么。这篇讲 BEACON 怎么定位它的里程碑检测器、真要做该分哪三层,以及一条论文里没有的判据。

这是长程 Agent 设计手记系列的第二篇,起因是我们精读了 BEACON(浙江大学,arXiv:2605.06078)。

第一篇的结论是:循环检测抓不到停滞,因为重复是输入侧的信号,而进展得看输出侧。但那个结论要能成立,前提是有个东西可以拿来量进展。这一篇讲的就是那个东西。

一句话版本 完成与否由检查说了算,不是由 Agent 自己说了算 Orkas 在把一个里程碑判为完成之前会先验证,没解决的会明确列出来,而不是悄悄往下走。
下载 Orkas — 免费

先把问题问对

问题不是「怎么让 Agent 知道自己完成了一步」,而是「怎么让系统知道它真的完成了一步,而不是它说自己完成了」。

就差这么一层,可信度完全是两回事。

我们其实已经有两半,只是没接上

翻自家实现的时候,这点让我们有点意外。

第一半。里程碑这个东西产品里早就有了。有个工具在维护一份可持久的任务计划:一个长任务被拆成哪几步、每步是什么状态,待办、进行中、已完成、受阻。它的设计意图就是给长任务提供稳定的进度锚点。但每一步是怎么变成「已完成」的?模型自己声明的。

第二半。每次工具调用结束,宿主侧都会记下一批确定性事实:文件的内容哈希有没有真的变、命令的退出码是多少、有没有超时。这批数据记在宿主侧,从不进模型上下文,所以模型伪造不了。

缺口就在这儿。一边是「我完成了」,一边是「某个文件的哈希从 A 变成了 B」,这两条线索从来没被摆到一起过。

缺的不是数据结构,也不是观测数据,就是中间那座桥。

论文里最有用的一点,不是那个公式

BEACON 最出名的是双尺度 advantage,但真正值得拿走的是它怎么定位检测器 Φ。

Φ 不需要训练模型,也不需要人工标注,只读环境反馈里能观测到的状态变化。ALFWorld 里检测物体状态跃迁(成功拿起、加热完成),WebShop 里检测页面跳转,ScienceWorld 直接消费环境本来就给的子目标信号。

零额外模型、零额外采样开销。对比另外两条路:过程奖励模型要昂贵标注、还有被刷分的风险;蒙特卡洛估值则要在每个决策点多跑几次 rollout。省下的就是这块成本。

而做 Agent 产品的人有个论文场景里没有的便宜条件:工具调用本来就是结构化的,成功失败有明确返回。论文得费劲从环境里抠信号,我们的信号是现成的。

真要做,分三层

第一层:把确定性证据聚成一条流。不做任何语义判断,只机械记录不可逆的可验证变化。文件内容哈希变了、命令退出码为零、外部接口调用返回成功、数据落库成功。这些现在就有,只是散在各处,从没被拢成「已达成事实」这么一条东西。

第二层:把两半接上。性价比最高的一步。模型声明某步完成时不再无条件采信,而是去查这段时间里有没有第一层的证据。有证据就标成已验证完成,没有就标成已声明完成。这不阻止模型声明任何东西,只是把有据和无据分开。

第三层:按能力类型分别定义 Φ。作者自己也承认 Φ 需要领域知识、难以泛化,所以别指望一套通用检测器。写代码类看测试退出码,数据分析类看产出文件有没有生成,发消息类看接口返回。这层得一个能力一个能力慢慢铺。

我们自己加的一条判据:看不可逆,别看重要

这条论文里没有。

BEACON 的里程碑之所以管用,本质是它标记了回不去的状态跃迁,拿到钥匙之后世界就变了。所以判据应该是这个动作有没有产生不可逆的外部副作用,而不是这一步重不重要

不可逆:写文件、提交代码、发消息、调付费接口、数据落库。可逆:读文件、搜索、抓网页、思考。

这么定有两个好处。一是机械可判,动作类型直接决定归属,不需要任何语义理解,也就不会有「模型觉得这步很重要」这种主观东西混进来。二是它跟恢复点本来就是一回事:只有从不可逆的地方往后恢复才有意义,可逆的动作重做一遍就完了。

论文里有两个数,一个能壮胆,一个得当心

壮胆的那个是降级实验。随机丢掉一半里程碑,成绩还有 82.8,比 72.8 的基线高 10 个点。降级是平滑的,不是悬崖。对想落地的人来说这才是关键:你不用等 Φ 设计得完美无缺才敢上,覆盖一半就已经有得赚。

当心的那个是切分对照。

切分方式成绩相比基线 (72.8)
随机切 5 段74.2+1.4
真实里程碑91.4+17.2

第一篇也引过这组数,但放在这里含义更直接。如果你的里程碑是拍脑袋定的,那它约等于随机切分,白做。里程碑值钱,值钱在它跟任务的真实结构对上了。

哪些地方得打折

论文自己在附录里把「自动里程碑发现」列成了待解决问题。三个 benchmark 的里程碑全是靠规则拿到的:模式匹配环境响应、页面跳转、或者环境直接给信号。而浏览器操作、代码库改造、深度研究这类真正开放的场景,压根没有这种现成的可验证跃迁。

所以那套东西更像是在结构化环境里被验证过的范式,不是能整个搬走的方案。Agent 产品能落地,靠的是工具调用这个结构化边界,不是靠论文给了现成答案。

另一个坑是粒度。太稀就等于什么都没做,太密则段级信号变成噪声。对应到产品就是任务拆解的粒度,而这里反倒有个论文场景没有的便利:计划里的每一步本来就是给用户看的,粒度可以用「用户能不能看懂这一步」来锚,不用纯靠算法调参。

如果只做一件事

做第二层。

成本低,因为第一层的数据本来就在,第二层只是把它跟模型的声明对上。可独立验证,因为「已验证」和「已声明」的比例本身就是个值得盯的指标。而且它是后面所有事的前提:没有「已验证里程碑」这个概念,第一篇的停滞检测、下一篇的压缩边界,都无从谈起。

它还有个很舒服的性质:上线不改变任何行为。模型该怎么声明还怎么声明,只是多了个标记。等数据攒够了,再决定要不要对「声明了但没证据」的那些做拦截。

下一篇聊上下文压缩:为什么按 token 阈值切跟「什么该忘」基本没关系,以及对本篇最自然的那个延伸的一处纠正——很多人会顺手认为,里程碑一旦验证通过,它前面的东西就能整段折叠掉。