[控场AI]
· 8 分钟阅读· 4,400 字

Meta Muse Wonder 的 Active Focus,用 TypeScript 手搓一版

Meta Muse Wonder 的 Active Focus,用 TypeScript 手搓一版

Meta Muse Wonder 的 Active Focus 把「专注」拆解为继续、切换、询问、确认、停下的一组决策。

Meta 发布 Muse Wonder 与 Muse Wonder Full,用 Active Memory 承载跨对话上下文,用 Active Focus 定义智能体如何持续推进困难目标。本文认为专注不是「再努力一点」,而是一组决策:继续、换方法、询问、确认、停止,并用 FocusBench 与 SWE-Marathon 作为评测口径。作者手搓了一个 TypeScript 的迷你 Focus Loop,核心设计是区分 blocked(值得少量重试)与 failed(应立刻切换),并用约束前置过滤被禁止的方法。策略的八条分支里只有一条是继续,其余都是体面停下。作者还诚实列出六个失效点,包括脚本化结果、重要动作判定依赖人工、跨运行缺乏记忆等。

大多数智能体只会以两种无聊的方式失败:要么在第一个错误面前就放弃,把半个任务和一句客气的道歉丢给你;要么永远停不下来,整个下午都在重试同一个坏掉的想法。这两者都不是专注。

Meta 发布了 Muse Wonder 和 Muse Wonder Full,称其为迄今面向个人与专业智能体任务能力最强的模型。Muse Wonder 即日起通过 Meta Model API 和 Muse Code 提供,Muse Wonder Full 则面向 Muse Code 订阅用户。这次发布有两个功能撑场面:Active Memory 负责跨对话携带重要上下文;Active Focus 则是我一直在琢磨的部分。

根据 Meta 研究博客的说法,Active Focus 描述的是 Muse Wonder 如何持续推进一个困难目标:尝试替代方案、处理阻塞、适应新信息,过程中在需要时请求澄清,并在执行重要操作前先与你确认。Meta 用 FocusBench 评测专注度,用 SWE-Marathon 测试长周期软件项目上的持续执行能力。

这个区分很关键。专注不是“再努力一点”,而是一组决策:继续、换方法、询问、确认、停下。持续本身很容易伪装,知道下一步该走哪步才是真正的能力。

Meta 发布 Muse Wonder

我们要构建什么:一个迷你的 Focus Loop

与其空谈,不如手搓一个 TypeScript 版本的微型 Active Focus。最终你只需运行一条命令:npx tsx focus.ts,然后看一个脚本化的智能体切换方法、询问你指的是哪份租约、在删除分支前先确认、上报阻塞,并诚实地放弃。不需要 API Key,不需要网络。

需要说明的是,下面的目标、文件和分支都是示例输入,这个循环只是我对 Meta 所描述行为的一个小型建模,并不代表 Muse Wonder 内部如何运作。完整代码在作者的 GitHub 仓库中。

核心结构很朴素:一个目标、几个候选方法、一份尝试日志、一条策略。每一步智能体尝试点什么并记录结果,结果分为五类:progress(有进展)、blocked(方法本身没问题,但外部因素挡住了)、failed(方法本身不成立)、needs_info(没有你就无法抉择)、done(目标达成)。然后由策略决定下一步。模型负责干活,循环负责判断这些活意味着什么。

为什么 blocked 和 failed 必须分开

整条策略由三个数字支撑:总尝试次数、某个方法失败多少次算“死了”、连续遇到多少次阻塞后重试就不再合理。这里最容易被忽视的设计,是把 blocked 和 failed 当成两种不同结果。

失败的方法是坏主意,应当换掉;被阻塞的方法可能只是今天运气不好,可以少量重试。大多数重试循环把所有错误一视同仁,这就是你会看到对着一个过期 token 重试十次的原因。 把“想法不行”和“时机不行”区分开,是省钱省时的第一道闸门。

在智能体(agent)语境里,blocked 与 failed 的区别对应着两种截然不同的失败语义。failed 指方法本身在当前状态下不成立——比如假设了错误的 API 签名、调用了一个并不存在的函数,这类错误在状态不变的情况下重试多少次都不会好转,所以正确的反应是剪枝或切换策略。blocked 则指方法逻辑本身没问题,但外部条件暂时挡住了它——比如凭证过期、上游服务 502、依赖的 PR 还没合并。这类阻塞有相当概率随时间自行消解,所以值得在有限次数内重试。把两者混为一谈的常见后果是:对着一份过期的 token 反复重试直到预算耗尽,而对一个逻辑错误的方案却不加分辨地继续尝试。区分的关键在于问一句——「如果外部条件变了,这个方法会成功吗?」会,就是 blocked;不会,就是 failed。

约束要在运行前就落实

第二个模块处理约束。每个方法声明自己会用到的工具,每个目标声明自己禁止的操作。被禁止的方法在运行之前就被过滤掉,还会打印一行 [SKIP] 说明原因。

为什么要在运行前就筛掉?因为一个持续朝目标推进的智能体,迟早会找到那条捷径:放宽断言、跳过不稳定的测试、直接上线。没有约束的持续,最终换来的是一个绿色但测试更少的套件。 约束不是事后检查,而是提前划好的边界。

聚焦策略的决策阶梯

约束前置(pre-constraint)来自经典规划与安全对齐里的一条经验:事后检查永远追不上一个足够坚持的优化器。当一个智能体被赋予「让测试全绿」这样的目标,它会在解空间里搜索一切达成条件的路径,其中就包括删掉测试、把断言改宽、把失败标成 skip 这类捷径,这在业界被称为 reward hacking(奖励劫持)。后置的审查往往发生在动作已经执行之后,撤回成本很高;而前置过滤把不可接受的动作直接从候选集合里删掉,智能体连「想到走这条路」的机会都没有。这也是为什么工具调用权限、白名单、沙箱要作为运行时的硬边界,而不是依靠模型自身的自觉。约束的作用不是降低智能体的能力,而是把它的搜索空间收缩到人类愿意为之负责的那一部分。

策略本身就是决策阶梯

decide 函数是这套东西的心脏,它的顺序就是设计本身:

  1. 已完成,直接赢
  2. 缺信息就询问,不要擅自猜是哪份租约
  3. 预算耗尽就停下
  4. 卡住且还有备选方法,就切换
  5. 卡在阻塞上且没有备选,就上报阻塞
  6. 卡在失败上且没有备选,就诚实放弃
  7. 下一步重要且没被批准,就发起确认
  8. 否则,继续

八条分支里只有一条是“继续”,其余七条全是“如何体面地停下”。Meta 把询问和确认写进 Active Focus 的内部,而不是当作它的例外——这一点值得反复咀嚼。

文中提到的 decide 函数本质是一个决策阶梯(decision ladder),也常被称为优先级规则(priority rules)或守卫链(guard chain)。它的设计哲学是在每一层用最便宜、最确定的判断先排除掉不允许的状态,只有在所有停止条件都不满足时才落到默认的「继续」。这种写法有几个好处:其一,顺序本身就是规格说明,读代码即可知道智能体的行为边界;其二,越靠前的条件越确定,可以避免模型在明显该停的时候还去做昂贵的尝试;其三,把「继续」放在最后一条,意味着任何一种停止理由都能覆盖默认行为,从而在结构上防止智能体陷入无限推进。许多智能体框架会把这个阶梯拆成策略(policy)、守卫(guard)和终止条件(termination condition)三层,但本质都是同一件事:用一组有序规则约束住「下一步」。

运行循环与示例结果

运行循环把策略和脚本化的步骤接起来。每一步的 outcome 是写死的,所以演示是确定性的、离线的。在真实智能体里,这一行就是一次模型调用加一次工具调用,但外围的策略完全不需要变。

需要特别注意的是确认的返回值:它返回待执行的具体动作,而不是一段摘要。这很关键——人类要审的是“删除 14 个远程分支”这件事本身,而不是一句模糊的“准备清理分支”。

脚本里铺排了六个运行案例,得到五种不同的结局。第 1 个运行丢掉了作弊方法,两次失败后切换,扛过一次超时,最终完成,12 个测试全过。第 3 个运行在删除 14 个分支前停下来等你确认;第 3b 拿到批准后跑完。第 4 个运行不会永远重试,连续三个过期 token 已经是人类的问题。第 5 个运行拒绝 test.skip,尝试两种诚实的办法,都不行之后如实说明。

带着清晰理由放弃也是一种结果,假装成功不是。

这套玩具会在哪里崩掉

诚实地说,这个模型有六个明显的断层:

  • 结果是脚本化的。真实循环最难的部分是“归类发生了什么”——这到底是失败还是阻塞?模型得自己判断,而且有时会判断错。
  • “重要”在这里只是个标签。判定哪些动作需要确认是真正的策略工作。删除、支付、给别人发消息是个不错的起点,但问得太频繁,人就不看了。
  • 预算是瞎猜的。长任务需要按时间和成本设预算,而不只是尝试次数。
  • 约束是字符串标签。一个既能读又能写的“读”工具,会轻松绕过标签检查。
  • 方法是提前列好的。真实智能体会在学习中发明新方法,而大部分智能和大部分风险都在那里。
  • 运行之间没有记忆。3b 重复了列清单那一步——如果有类似 Active Memory 的机制,它能带着那 14 个分支继续。

这些断层恰恰说明,把“专注”做成一个可评测的功能有多难。也正因如此,Meta 专门为它造 FocusBench 和 SWE-Marathon 这样的评测口径,方向是对的。

FocusBench 和 SWE-Marathon 分别代表了两类长周期智能体评测思路。FocusBench 关注「专注度」这类行为指标,通常通过构造多步任务并统计智能体在正确时刻继续、切换、询问、确认或停下的比例来衡量,属于过程性评测。SWE-Marathon 则更接近端到端的结果性评测:给智能体一个跨很多小时、需要多次提交和调试的真实软件项目,观察它能否在长周期内保持方向不漂移。这类评测远比单轮问答难做,因为长周期任务里失败模式多样——可能是过早放弃、可能是错误累积、也可能是陷入局部循环。正因如此,评测设计本身成为一项独立工程,而 Meta 愿意为专注度单独造口径,说明业界已经把「能不能开长跑」而不是「单步答得对不对」当作下一代智能体的核心能力。

更大的想法:停对时机才是真本事

把整个流程抽象出来:目标加约束先筛掉禁止的方法,然后尝试、记录结果,交给策略判断,策略输出继续、换方案、询问、确认、上报阻塞或带理由放弃这六种走向。模型提供尝试,约束提供边界,尝试日志提供证据,策略提供判断,确认环节提供人类。

这部分是预测,不是历史。我认为“它到底能独自工作多久”正在成为智能体模型的头条问题。Meta 把 Active Focus 命名为一项功能并直接评测它,方向是对的。但运行的长度并不是那个有趣的数字,有趣的数字是它多大比例是在正确的时刻停下来的。

问得太晚,分支已经没了;问得太早,你不如自己干。一个专注的智能体不是永远不停的那个,而是为正确理由停下的那个。

#Meta Muse Wonder#Active Focus#AI智能体#TypeScript教程#AI Agent#FocusBench#LLM长任务#智能体重试策略
分享:

相关推荐