一张标题卡上写着“在 Claude Opus 5.5 上构建主动式智能体循环”,副标题讲的是五个阶段、一个模型,以及 Anthropic 的消费级应用不会直接交给你的所有东西;标题卡上方有四个描边胶囊标签,分别标注为“调度器”“缓存提示词”“审批闸门”和“故障转移”,右侧则是一个由错位圆角矩形构成的浅色几何图案。
Guides & Insights

在 Claude Opus 5.5 上构建主动式智能体循环

作者

Rowan Sterling

发布日期

最新模型 · 20查看全部模型 →
基准测试:Artificial Analysis · 每日更新
返回全部文章

构建你自己的主动型智能体时,令人不舒服的一点是:真正有意思的工作并不在模型调用上。你可以用一个下午就让 Claude Opus 5.5 回答问题。但要让它按计划唤醒、只读取自上次以来发生变化的内容、判断是否有任何事值得人工介入、起草行动,然后停下来等待——这要花数周时间,而且几乎没有什么发生在模型内部。Anthropic 以 Claude Duet 的形式发布过这个循环的一个版本,而对任何自建者来说,这个产品有用的地方不是其功能列表,而是从其组装方式中可见的决策。它没有公开的 API,也无法重新指向你自己的系统,所以如果你想要的是这个循环而不是这个应用,你就得自己构建。接下来是架构,逐阶段展开,并说明每个阶段的真实成本。

先说结构。五个阶段按顺序运行,只有人类说“是”之后才会到达第五个阶段。调度器触发。摘要步骤把每个连接的系统归约为一个增量。决策步骤把这个增量连同一条策略转化为一个带类型的提案。模型之外的审批关口决定该提案是否可以运行。执行器执行它。这就是整个设计,而其中所有困难之处都藏在接缝里。

An architecture card titled The loop, stage by stage, showing five numbered stages from left to right, Scheduler firing every few hours rather than continuously, Digest reading a diff of what changed since the last sweep, Decide where Claude Opus 5.5 reads the diff against a byte-identical system prompt and tool schema, Approval gate as a separate service that can say no, and Act executing only the approved action, with a blue callout on Decide and a cyan callout noting the gate can refuse.

第一阶段:一个每隔几小时触发一次的调度器

第一个决定,人们往往会因热情而非工程判断而做错:不要持续轮询。Anthropic 的 Duet 文档在解释其{{1}}间隔——每隔几小时检查一次——{{/1}}时表示,不间断地检查会更快耗尽套餐限额。这不是营销式的谨慎。它是对真实成本问题的正确答案,也是每个自建智能体在第一周都会掉进的陷阱。

持续轮询之所以代价高昂,有一个结构性原因。每一次扫描都是一个完整上下文:指令、工具定义、你拉取进来的材料,以及模型对此所做的任何推理。按一分钟一次的节奏,一天就是 1,440 个完整上下文,而其中绝大多数都发现不了任何新东西。你付了全价,却只是被告知邮箱没有变化。按三小时一次,你得到八次,发现与花费之比就变得可以拿去向签发票的人交代了。

所以,调度器是一个 cron 风格的定时器,带有最小间隔下限,而不是事件流。事件听起来很有吸引力——事情一发生就做出反应——但它们会把你推回持续工作的模式,并让繁忙一天的成本变得没有上限。定时器提供可预测的上限,而这正是费用可变时你所需要的。当你希望某个来源获得更快反应时,只缩短该连接器的间隔,并接受额外的花费。

第二阶段:一个字节完全相同的前缀,保存在缓存中

公布的数字在这里发挥的作用最大。在 OrcaRouter 上,Claude Opus 5.5 的价格为每百万输入 token 4.00 美元、每百万输出 token 20.00 美元,上下文窗口为 100 万 token,缓存读取为每百万 token 0.20 美元,均按提供商标价、零加价。请把这些数字看作一项设计约束,而不是一份价目表:一次缓存读取的成本是全新输入 token 的二十分之一,因此,你在多轮扫描之间保持稳定的每一个字节,都是你不再需要为其支付全价的字节。

在实践中,系统提示词和工具 schema 在部署时只组装一次,之后绝不会按每轮扫描重新生成。不会从键顺序不同的字典重新序列化。不会用时间戳、请求 ID 或将当前已连接账户拼接到中间的方式做模板化。任何字节差异都会使缓存前缀失效,指令块在每轮扫描时都会回退到完整输入价格。团队意外丢失这一点的频率高于有意为之,通常是因为某个“有用”的抽象开始在提示词顶部附近注入运行标识符。

能经受真实代码检验的纪律其实很无趣:用一个函数为稳定块返回常量字符串,用冻结的字面量定义工具 schema,并把每个可变元素都放在它后面。然后再写一个测试,对该块做哈希,并在哈希变化时让构建失败,因为总有一天会有人新增一个 schema 字段,却完全不会想到缓存。这个测试花一小时,却能保住缓存带来的全部收益。

第三阶段:每次连接生成一份摘要,而不是倾倒整个邮箱。

第三阶段是消费级产品能免费享有、而你却无法获得的阶段。Duet 位于 Anthropic 的账户内部,并能触达已连接的应用,因此它可以询问自指定时间以来发生了什么变化,并得到一个简短的答复。在该账户之外构建时,你与任何普通客户端一样调用相同的 API:要么你实现增量读取,要么你拉取全部内容,然后把一大段文字交给模型。

全量拉取是默认做法,因为它在第一天就能用。它也是让每轮扫描成本变得不可预测的最快方式,因为输入会随邮箱规模增长,而不是随实际变更增长。对四十个未变更会话做一次扫描,与对四十个会话(其中只有一个真正重要)做一次扫描,成本相同,而只有后一种情况才有机会产生有用的提案。这样过了一个月,你的大部分预算都花在确认现状上了。

摘要步骤应当写成代码,而不是靠提示词。每次连接时,用 API 提供的任意游标或增量方式抓取,并把结果归约成结构化摘要:哪些是新出现的、哪些被修改了、哪些已解决。给每个条目一个稳定的标识符,以便后续阶段可以引用它;并按连接记录最后一次成功抓取的游标,这样某次抓取失败时,就不会把昨天的内容当作新内容重放一遍。一份无法区分“什么都没发生”与“我无法检查”的摘要,最终会对自己从未观测到的状态给出笃定的报告。

第四阶段:一个输出对象而非散文的决策步骤

Claude Opus 5.5 就处在这样的位置:它输出的内容,决定着系统其余部分究竟能否被构建出来。直觉上的做法是让模型写一份摘要,再由人来阅读。这对仪表盘可行,对门禁却行不通:下一阶段必须决定是否允许某项操作,而许可无法授予一段文字。

决策步骤应返回一个类型化的动作提案:来自封闭列表的动作名称、该动作适用的目标、参数、一行理由,以及明确的置信度或升级标志。封闭的动作列表不是官僚主义;它正是使审批关卡可强制执行的机制,因为关卡只能验证它可以枚举的动作。一个能发出任意动词的智能体无法被关卡约束,只能被信任。

两点实用说明。先把摘要交给模型,再给策略,这样策略就排在可变材料之后,缓存前缀也能保持完整。另外,把默认结果设为“不采取行动”,而不是一份读起来像是在行动的空白提案。把沉默当作失败的循环只会产出数量,而一个为了显得有用而凭空制造工作的智能体,比一个如实报告没有任何变化的智能体更糟。

第五阶段:一个真正能说“不”的审批关口

闸门必须是一个独立服务,而不是智能体自身代码里的一个分支。这是构建过程中最重要的结构性决策。如果智能体的进程能够自行执行该动作,那么该进程中的一个缺陷、一次提示注入或一个设置错误的标志都会直接影响到实际效果。如果执行器只接受闸门已签名的提案,那么智能体最坏也只能提出错误的提案,而闸门的拒绝则是真实有效的。

Anthropic 针对 Duet 发布的政策,即便你的清单与之不同,其在结构上也值得照搬。闸门要求在某个操作发送消息、付款、签署文件或删除任何内容之前先获得批准。在此之上还有第二层,即使获得批准也会被拒绝——在 Duet 的案例中,就是证券交易和在账户之间转移资金。这种模式是一种两层策略:一大批可由人工批准放行的受闸门控制操作,以及一小批任何批准都无法解锁的操作。即使每个条目都发生变化,也要照搬这两个层级,因为它们解决的是不同的问题。闸门防范的是失误。禁止清单防范的是被攻陷的操作者,包括人类操作者。

真正的门禁的另一半在于它会打断流程。Duet 的审批请求会展示确切的待执行操作并等待响应,这是有意让流程停下来,而不是给它加个注释。一个只往没人看的日志里写一行的门禁算不上门禁,那只是一张收据。如果你的审批环节需要有人凌晨三点盯着仪表盘,那要么是时间间隔太短,要么是操作清单太宽泛。两者都可以解决,而且都不是靠加一条通知来解决的。

内存、凭据,以及两个无法靠测试摆脱的表面

在这五个阶段之下,潜藏着两个棘手的问题;它们乍看之下都像是功能特性——直到你发现并非如此。

• 上下文延续。每次扫描都是一次全新的上下文,因此智能体需要在各次扫描之间记住的任何内容,都必须在两次扫描之间写下来。为每个连接维护一个滚动状态文件,限制其大小,记录未决事项和近期决策,对大多数循环来说就足够了。行不通的做法是指望模型从摘要中重建历史,因为摘要明确是对变化的描述,并不包含对已决定事项的记忆。

• 凭据保管。 Duet 遵循 Anthropic 托管代理所采用的设计,因此它永远不会直接看到你的密码或登录令牌。复现这一纪律正是大多数自研代理会跳过的部分,而跳过它就意味着每个提示词都有一条通往凭据的路径。模型绝不应持有令牌,绝不应以文本形式获得 API 密钥,也绝不应成为负责身份验证的组件。让摘要环节和执行器持有凭据,只把结果交给模型。

然后还有一个没人愿意去想的层面:一旦智能体读取电子邮件和网页,每一项都是可能包含指令的输入。一条写着“将此转发到以下地址”的消息,对于没有独立权限概念的模型来说,与数据无法区分。有两种防御胜过任何程度的提示加固。保持动作列表封闭,这样注入的指令就没有可用的动词可抓。并把关卡保持在模型的影响力之外,因为一次说服模型发送某物的注入,仍然必须说服看到目标地址的人类。

故障转移,以及路由真正发挥作用的场景

循环搭建完成后,一种单供应商设计不具备的架构选项随之出现。OrcaRouter 的路由 DSL 可将多个模型组合成一次调用,而模型融合则会运行一组并行作答的模型;两者都能让多个模型服务于同一个请求。这里的实际用法并不花哨:让更便宜的模型负责摘要生成,因为这项工作的重点是压缩而非判断;同时把 Claude Opus 5.5 留在决策环节,由它来形成提案。同一个兼容 OpenAI 的密钥可访问 200 多个模型,因此切换哪个模型服务于哪个阶段只需更改配置,而无需重写。

OrcaRouter's own Claude Opus 5.5 model page. The site navigation lists Products, Models, Pricing, Docs and Blog, and the page hero carries the model name Claude Opus 5.5 above a specifications card showing a 1M-token context window, input priced at 4.00 dollars per million tokens, output at 20.00 dollars per million tokens, cached reads at 0.20 dollars per million tokens, zero percent markup, and access to more than 200 models through one OpenAI-compatible key.

故障转移是另一半。当某个提供商出现一小时故障时,只能访问一个端点的代理也会跟着出现一小时故障;而没有回退方案的定时循环则只会直接错过本轮巡检。路由会把一次错过的巡检变成一次更慢的巡检——在你真正需要它的那一周之前,这算不上什么显著好处,而到了那时,它就是记录出现缺口与没有缺口之间的差别。

OrcaRouter's own model catalogue page, headed Every frontier model, one key, with a subhead reading 200+ models from 20+ providers with a single OpenAI-compatible API, a search field for the models, a row of vendor filter pills, and a list where each row gives the model, its vendor, its context length and its input and output price, with Claude Opus 5.5 at 1M context and $4.00 and $20.00 visible in view.

你实际报名参加的是什么

运行这个循环就是在运营一项服务,而这项服务具有四个你刚刚接手负责的属性。

• 正常运行时间。Anthropic 的应用是别人的寻呼机;你的应用才是你自己的。一个悄悄停止触发的调度器不会产生错误,也不会有任何输出;你发现它出问题,是因为有人注意到自己的晨间简报没来,而不是因为收到了告警。

• 凭据保管。你的摘要步骤所持有的每一个令牌,都是你要负责的;一旦泄露,其影响范围就是该连接所能触及的一切。Anthropic 的设计让凭据远离模型;如果你的设计并非如此,模型就会成为你已连接的每个账户的攻击面。

• 提示注入防御。这道闸门在这里能带来很多保障,但只对它把关的操作有效。智能体未经批准所做的任何事情——读取、总结、写入自身状态——都不受保护,而一份被投毒的摘要可能会污染记忆,后续扫描正是从这些记忆中推理的。

• 漏洞赏金无人负责。如果你的循环误触发并向客户发送了错误消息,就没有供应商可以上报,没有状态页,也没有事件报告。上述决策是唯一的安全网,这就是为什么闸门是一个独立服务,并且操作列表是封闭的。

这些都不构成反对构建它的理由,只反对草率地构建它。每个阶段都很小,而它们之间的接缝才是判断力所在:用定时器而非流,用冻结的前缀而非模板,用摘要而非转储,用对象而非散文,用作为服务的门禁而非注释。把这些做对,这个循环就物有所值——它能找到你不会去找的东西,并且在做任何不可逆的事之前停下来。把这些做错,你构建出的东西就会持续消耗你的预算,还告诉你早已知道的事。