空闲代理:设计事件驱动的AI系统
环境代理的定义不在于它做什么,而在于什么唤醒它
梯形图转SCL | 自然语言生成梯形图 | 自然语言生成SCL | 梯形图在线查看 | 博途编程文档MCP | AI模型价格对比 | AI工具导航 | ONNX模型库 | Vibe Coding教程 | PLC在线仿真器 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace
大多数代理写作假设提示刚刚到达。这关乎另外99%的时间——触发器、去抖动和监控成本。
一个我将保持匿名的团队——细节是几个故事的复合体,经许可并模糊处理——去年发布了一个可爱的东西:一个监控其支持收件箱和值班频道的代理,在人类知道之前就举手表示需要人工。它奏效了。演示闪闪发光。然后第一个完整月的账单到了,有人提出了这篇文章的问题:为什么一个在三十天内采取了十一个有意义行动的代理,成本比工程师的IDE、CI和可观测性堆栈的总和还高?
答案在于没有人绘制的架构。为了"监控"收件箱,代理轮询:每两分钟,一个cron任务组装最近的消息,并询问前沿模型是否有任何新内容需要注意。那个月两万两千次,模型阅读了上下文,仔细思考,然后回答没有。十一个"是"很出色。账单是为了那些"不"。他们建立了一个系统,其最昂贵的活动——高出三个数量级——是什么都没发生。
与此同时,在相同的基础设施中,一个十五年的cron任务每分钟检查一次磁盘阈值,在其整个生命周期中几乎没有任何成本。它知道代理团队还没有内化的东西:等待是一种设计好的事情。
所以这里有一句话要记住:环境代理的定义不在于它做什么,而在于什么唤醒它——工程是一个漏斗,以尽可能低的价格决定一万个事件中哪个值得模型的注意力,以及一个直到有事件才产生成本的睡眠。 聊天代理免费获得其分类,因为人类在输入消息之前就决定它值得发送。当你从触发器中移除人类的那一刻,你就继承了分类工作——如果你用模型本身来解决它,你就雇佣了你最昂贵的员工来分拣邮件。

1、提示一直是一个事件
你读过的每一篇代理文章——包括我的大多数——都始于同一时刻:一个请求刚刚到达,循环开始转动。这是一个方便的起点。它也是一个承载假设,因为那个请求来自人类,人类在第一个令牌被处理之前免费执行了三项服务:他们决定某事值得做(分类),他们将情况压缩成一段话(上下文组装),他们在那个确切时刻出现(时机)。聊天代理是拥有人工驱动事件层的代理。
环境代理——LangChain团队推广的术语,指"监听事件流并相应地采取行动,可能同时对多个事件采取行动"的代理——移除了那个人类,所有三项免费服务也随之消失。剩下的工程问题有五种输入,值得命名它们,因为每种都有不同的物理特性:
消息 — 人类说话。罕见,经过预分类,意图丰富。奢侈的情况。
计划 — cron及其后代。无论是否发生任何事情都会触发,这既是它的优点(它捕捉事件流遗漏的内容)也是它的缺点(它大多在沉默中触发)。
事件 — webhook、队列消息、某处落地的行。世界推送。高容量,零分类,以突发方式到达,并且——关键的是——由系统和陌生人编写,而不是你的用户。
监视 — 状态上的条件:这个PR变得可合并,这个文档更改了,这个客户变得安静了。没有人推送;必须有东西注意到,这意味着有人为注意到付费。
阈值 — 指标越过了一条线。操作中最古老的触发器,其四十年的告警历史(疲劳、抖动、死区)代理目前正在从头学习。
空闲代理的设计问题是组合:哪些唤醒它,什么介于原始信号和模型之间,以及代理在睁开眼睛时重建什么?在一个方向上搞错组合,你会得到我的冷开场——模型每两分钟读取一次沉默。在另一个方向上搞错,你会得到一个在它被雇佣来捕捉的事件中沉睡的代理。
2、唤醒漏斗——分类是阶梯,不是开关
环境设计的核心经济事实:模型是你将拥有的最昂贵的if语句。 前沿模型调用来决定"这重要吗?"的成本比决定同一件事的WHERE子句高出五到七个数量级。所以有效的架构从来不是事件→模型。它是一个漏斗,每个阶段比下面的阶段便宜,每个阶段丢弃大部分到达的内容。
阶段一:结构过滤器。 规则、模式、WHERE子句。发件人不在此列表中→丢弃。事件类型未订阅→丢弃。机器人编写的提交→丢弃。这个阶段应该以实际为零的成本消除大部分原始事件,它是纯粹的经典工程——不需要智能,因为大多数不相关性是结构性的。
阶段二:去抖动和合并。 事件以共享原因的突发方式到达:一个线程中的四十封邮件,一次推送中的三十个提交,一个即将死亡的交换机产生的两百个告警。代理注意力的单位不是事件——而是情况——所以漏斗保持一个短窗口,按关联键(线程、PR、事件)分组,并为每个情况发出一个合并信号。去抖动也是你编码耐心的地方:一个更改一次的文档可能在接下来的十分钟内再更改五次;在安静边缘唤醒——在最后一次更改后N分钟,而不是第一次——将唤醒计数减半,并改善每次唤醒看到的上下文。共享状态文章的教训在这里以微缩形式适用:突发是一个事实,不是四十个。
关于监视触发器的特别说明,因为它隐藏了其他触发器没有的成本决策。一个监视——"当这个PR变得可合并时告诉我","当这个客户变得安静时告诉我"——需要有人注意到,只有三种方式可以注意到:源推送(webhook或订阅,理想情况下存在),你轮询并差异(按计划获取状态,与最后一个快照比较,仅在更改时发出事件),或者你轮询并判断(按计划获取状态并询问模型——冷开场的罪过)。中间选项值得复兴,因为"轮询"在我的开场故事中得到了不应有的坏名声:轮询很便宜;判断很昂贵。一个获取页面、哈希它并比较哈希的cron每年只需几分之一美分。规则不是"永远不轮询"——很多世界不提供webhook——规则是轮询必须以差异结束,而不是以模型结束。 快照、比较,只有更改作为事件进入漏斗,像其他所有内容一样接受规则和分类器的考验。"有什么变化了吗?"是哈希函数的问题。"这个变化重要吗?"是你为模型保留的问题。
阶段三:廉价分类。 在结构和合并中幸存的内容获得一个小模型——快速、便宜、提示狭窄:"紧急/相关/忽略,一个词。"这是经济学文章中的路由级联模式穿着寻呼机:让廉价层吸收规则无法表达的歧义,只升级其"相关"和"不确定"。一个92%时间正确的小模型,守卫着一个成本30倍的大模型,就是这一层的全部商业案例。
阶段四:代理。 只有现在完整的框架才启动,具有真正的上下文组装、工具和预算。如果你的漏斗是健康的,这个阶段只看到原始流的一小部分——每次唤醒都作为情况预包装到达,而不是裸事件。
阶段五:人类。 漏斗不会在代理那里结束——代理本身就是一个过滤器,决定什么值得人类关注。第四部分会更多讨论这一点,因为这是环境系统生死攸关的地方。
计算我冷开场团队的重新设计:他们将收件箱转移到webhook(结构:-70%的原始事件是新闻通讯和自动化),按线程合并(-60%的剩余内容),在前面放一个小分类器(其"忽略"吸收了85%的那部分),前沿模型现在每月唤醒大约三十次,而不是两万两千次。十一个有用行动保持不变。每次有用唤醒的成本下降了一个数量级以上,并且——没有人预测到的部分——精度提高了,因为每次唤醒现在看到一个连贯的情况,而不是两分钟窗口的任意切片。

3、睡得好——零成本的机制
在唤醒之间,理想的环境代理不存在。不是"安静运行"——不存在。没有进程,没有容器,没有保持温暖的上下文。它的全部存在是存储中的一行:身份、配置、记忆指针、订阅。这是持久执行文章的等待即状态模式从功能提升为生活方式:运行是数据,停放的运行是静止数据,这是云几乎免费出售的东西。
那么唤醒就是重建,本系列关于恢复的所有内容都以额外的力量适用,因为没有人看着:
首先是时钟。 六天后唤醒的代理必须被告知时间,并且必须重新解析所有相对内容——时间基础文章完整地建立了这个案例。"截止日期是周五"写在周二,到下周一就是一个错误。
其次是过时。 世界在代理不动时移动了。记忆中携带的事实需要as-of标签和重新验证;唤醒上下文应该优先考虑新鲜读取而不是记忆状态。人在回路中文章的过时世界纪律——绑定到快照,在恢复时重新验证——是同一块肌肉。
第三是目标。 上一篇文章认为目标每回合都从上下文中重新派生;唤醒是从零开始构建的上下文,这使其成为漂移最危险的时刻或你将获得的最佳重新锚定机会。做得正确,每次唤醒都重新读取目标文件——一个每年重建自身两百次的代理获得两百次免费重新锚定,这正是为什么每次唤醒的新鲜设计(每次触发都启动一个干净的会话,连续性存在于外部记忆和文件中,而不是不断增长的转录中)比一个积累三个月残留物的不朽会话优雅得多。行业的计划代理产品——Claude Code的例程是一个突出的例子——几乎都选择了每次触发的新鲜,我认为这不是巧合:他们的设计师已经观察了三周上下文的作用。
值得具体说明一个好的唤醒上下文包含什么,因为"重建"在你编写之前听起来很抽象。一个构建良好的环境代理的唤醒提示读起来像一份简报文件,由框架按刻意顺序组装:目标文件,逐字(为什么这个代理存在,它可以和不可以做什么);时钟(现在,在委托人的时区,带有上次唤醒时间戳,以便代理知道它睡了多久);情况(赢得这次唤醒的合并事件摘要——不是四十个原始事件,而是它们的形状);新鲜状态(情况接触的所有内容的当前值,在唤醒时获取,每个都带有as-of戳);相关记忆(先前唤醒留下的少数持久笔记——"客户X喜欢晚间通话","上次此告警触发时是缓存"——检索,不是累积);以及预算(本次唤醒的令牌、工具和自主上限)。注意缺少什么:先前唤醒的转录。每次唤醒的结论幸存下来,由形成它们的唤醒提炼到记忆中——来自记忆文章的写入路径纪律——但过程残留物随会话而死。这是保持唤醒#200和唤醒#2一样敏锐的权衡,它对你的账单有一个愉快的副作用:一份用几千令牌衡量的简报,而不是用几十万令牌衡量的转录。
然后是交付,环境代理继承了分布式系统经典,并带有LLM的转折:
事件至少到达一次,因此唤醒必须是幂等的。 世界上每个队列和webhook提供商都保留两次发送的权利。重复事件进入无状态通知器是噪音;重复事件进入带有工具的代理是双重效果。治疗方法与往常相同的幂等键纪律——从事件派生的键,在唤醒执行任何不可逆操作之前检查——加上其环境特定的表亲:在情况本身上先检查后行动。 被唤醒到"PR #482可合并"的代理应该验证PR #482仍然可合并,因为唤醒可能已经过时了几分钟,另一个参与者(人类!第二个代理!)可能已经处理了它。唤醒时的竞争是共享状态竞争,具有更长的引信。
流有间隙,因此监视需要协调扫描。 Webhook端点会宕机;订阅会过期;提供商会静默丢弃投递。纯粹作为"对事件做出反应"实现的监视最终会无形地错过一个——环境代理的沉默与环境代理的勤奋无法区分。修复方法古老且不吸引人:一个缓慢的cron扫描,将现实与事件流声称的内容进行协调,正是支付文章使用的预期/收费/投递三列表纪律,指向事件。推送延迟,扫描真相。
4、高级——注意力、对手和风暴
触发器是攻击面——可以说是那个攻击面。 用安全文章的眼睛重新阅读第一部分的分类:环境代理是一个陌生人可以提示的系统。每个webhook负载、每个电子邮件正文、每个可能导致唤醒的问题评论都是不可信的输入,流入持有工具的模型——与聊天情况不同,唤醒时没有人在回路中注意到有些不对劲。一个精心制作看起来很紧急的电子邮件句子不仅浪费一次唤醒;它选择代理思考的内容,这是每个注入链的第一步。缓解措施是你已经知道的——将事件内容视为数据,沙箱环境代理比聊天代理更严格,保持致命三脚架的腿分开(一个具有广泛工具和外部通信的收件箱监视代理是带有门铃的三脚架)——加上一个环境特定的规则:自主性应随触发器信任而扩展。 由你自己的cron引起的唤醒可以行动;由外部内容引起的唤醒应该主要通知。
代理收件箱,或者:人类是回路中最稀缺的资源。 环境代理的输出主要是对人们的打扰——打扰是一种你可以贬值的货币。出现的模式(LangChain的代理收件箱工作很好地命名了它)是唤醒可以对人类执行的三个动词阶梯:通知(仅供参考,无需操作),提问(我需要一个事实来继续),审查(我准备了一个行动;批准它)。HITL文章涵盖了机制;环境特定的见解是阶梯是你的质量指标。跟踪人类对每次打扰的响应——已采取行动、已忽略、已忽略——你就有了整个漏斗的精度测量。一个通知被忽略80%的代理不是80%浪费;它在教人类静音它,之后20%也会死亡。警报疲劳在代理出现之前就杀死了监控推出二十年。它不在乎你的警报现在是用优美的散文写的。
并发是安静的超能力——也是安静的危险。 环境定义包含一个容易忽略的条款:同时对多个事件采取行动。聊天代理是一次对话;环境代理可能是四十个同时唤醒,每个都在自己的新鲜上下文中,每个都持有相同世界的一小部分。这是多代理文章的宽度模式不请自来——它带来了共享状态问题。由相邻事件触发的两个唤醒可能伸手拿同一个工单,为同一个线程起草两个矛盾的回复,或者双重声称同一个任务,两者都不会知道,因为新鲜上下文是隔离的上下文。缓解措施是系列条目排名的那些:按关联键分区唤醒,以便情况拥有其状态(你在阶段二构建的合并也作为所有权规则——一个情况,一个唤醒,没有兄弟姐妹);在分区失败时通过单个写入器序列化;当两个唤醒确实必须接触一个对象时,使用乐观并发和冲突作为错误,以便第二个写入器重新决定而不是覆盖。如果你正确完成了第二部分,你也基本完成了这个——这不是巧合:漏斗的关联键和状态层的所有权键想要是相同的键。
风暴模式。 一个上游事件产生一万个相关事件;一个简单的漏斗产生一万个唤醒,一个带有峰值的令牌账单,以及四十个在事件中途被静音的通知。运维学到了这个:告警系统有抖动检测和事件分组是有原因的。代理版本:一个风暴检测器(事件速率与基线对比)将漏斗切换到不同模式——将所有相关内容合并为一个情况,用摘要唤醒一个代理,并给它特定的简报"这是风暴;总结,识别可能的共同原因,并发送一个通知。"经济学很重要——p99-doom-loop教训说尾巴吞噬预算——但注意力数学更重要:在事件期间,人类吸收打扰的能力在事件速率飙升时恰好下降。风暴模式是漏斗对这种反转的尊重。

像产品一样衡量空闲代理。 两个数字统治:每次有用唤醒的成本(总支出除以人类事后认可的唤醒——计量文章的单位经济思考向内应用),以及分类精度/召回率,你可以离线很好地评估:将一个月的历史事件通过任何提议的漏斗重放,并根据人类实际所做的对唤醒决策进行评分。该重放套件是罕见的评估,几乎可以免费构建——标签已经存在于你的工单历史中——它将漏斗更改从感觉变为差异。

时间形状的自主性。 另一个高级模式,构建便宜且奇怪地未被使用:让唤醒的自主上限取决于何时触发和谁可达。同一个发现在周二上午11点值得自主修复——人类在线,停止按钮在可及范围内,爆炸半径已社会化——在周日凌晨3点可能只值得通知。这不是胆怯;这是承保文章的带有钟项的预期价值门:C_ask(询问的成本)在工作时间很低,在夜间很高,但p_hum × C_err(人类捕捉错误的概率乘以其成本)向另一个方向移动——在夜间,没有人捕捉任何东西,因此错误项占主导地位,阈值应该向询问滑动……这意味着延迟,因为询问没有听众。将其编码为框架中的表格:触发器信任 × 行动严重性 × 人类可用性 → 行动 / 排队等待早晨 / 立即通知。排队等待早晨这个动词是默默无闻的英雄:环境代理在凌晨3点注意到的大部分内容都完全乐意成为上午8:55的审查项目,预包装,附带代理提议的行动——正好在人类的咖啡到达时到达。
5、案例研究
电子邮件助手及其收件箱。 LangChain的环境代理参考——一个起草、归档和升级的电子邮件代理——与其说是因为起草,不如说是因为围绕它的交互设计。团队的框架是坦率的:人在回路中不是让步,它"降低风险,使其更容易发布",建立信任,并为长期记忆提供素材。专用代理收件箱——你和代理之间的每个开放线程在一个可审查的表面上——是通知/提问/审查阶梯给的家具。Harrison Chase的笑话"如果我忽略了你,那肯定是AI代理的错"包含了第四部分的整个注意力经济学:代理的工作是更好地花费他的注意力,当它没有这样做时笑话就开始了。
计划代理成为主流。 在2025年末和2026年,所有主要编码代理平台都生长了相同的器官:在计划和仓库事件而不是提示上触发的代理——Claude Code的例程和GitHub触发的运行是本系列读者最可能接触的版本。两个设计选择在所有这些中反复出现,并且都是对本文论点的默默认可:每次触发都启动一个新鲜会话(通过文件和记忆的连续性,而不是通过不朽的转录——目标衰减处方,默认发布),触发层是经典基础设施——cron表达式、webhook过滤器、YAML条件——模型在分类路径中无处可寻。智能很昂贵;闹钟不是;产品将它们分开。
被监视的监视者。 AWS发布的AgentWatch模式——监控云基础设施并主动提出发现的环境代理——读起来像是本文部署的检查清单:来自平台原生总线的事件(免费结构),调用前的关联,产生供审查的发现而不是任何重要自主修复的代理。值得窃取的细节是信任梯度:提议的行动越远,它落在通知/提问/审查阶梯上的位置就越高。监视是自主的;触摸是受监督的。
轮询篝火,重新审视。 我的冷开场团队,一个季度后。漏斗:webhook,在10分钟安静边缘上的线程合并,一个提示适合索引卡的小分类器,每月约30次前沿唤醒。他们回顾中的两个数字值得框架。每次有用唤醒的成本:下降约40倍。让他们惊讶的是——捕捉率上升了:轮询设计一直将情况切成任意的两分钟窗口,并且两次对某个片段回答了"不",而整体看是"是"。漏斗不仅使监视更便宜。合并使监视者更聪明,因为判断单位终于与意义单位匹配了。他们回顾中最便宜的句子:"cron任务从来不是问题。"
6、景观
触发器基础设施(使用,不要构建): cron及其托管后代;事件总线和队列(EventBridge、Pub/Sub、Kafka、普通webhook);工作流引擎计划和信号(Temporal、Restate、Inngest)——它们在同一购买中获得持久停车。你的漏斗的第一阶段和第二阶段是这些工具的原生词汇。
环境代理脚手架: LangGraph(持久性、中断、cron——加上开源代理收件箱),主要编码代理的计划/触发模式(Claude Code例程和GitHub Actions集成及其同行),以及不断增长的中间层电子邮件/webhook到代理连接器。在相同的问题上评估所有这些:分类在哪里发生(在模型之前,请),唤醒重建什么,人类看到什么。
分类层: 任何快速的小模型;纪律在于狭窄的提示和离线重放评估,而不是模型选择。
收件箱: 如果你想要存在的家具,使用LangChain的代理收件箱;否则使用你团队现有的表面(Slack、电子邮件、工单),保持三个动词——通知、提问、审查——明确且被衡量。
我的选择建议:将你的新颖性预算花在漏斗和唤醒上下文重建上;购买其他所有东西。调度器是一个有四十年测试覆盖的已解决问题。你的两分钟轮询循环不是。
7、故障模式现场指南
轮询篝火。 前沿模型按计划读取沉默。治疗方法:漏斗——任何模型之前的规则和合并,大模型之前的小模型。
雷群效应。 一个事件,一万个唤醒。治疗方法:风暴模式——速率检测器、完全合并、一个代理、一个通知。
双重唤醒。 至少一次传递遇到工具承载的代理。治疗方法:唤醒上的幂等键;情况上的先检查后行动。
过时唤醒。 代理在事件触发时的世界而不是现在采取行动。治疗方法:唤醒重新读取——now()、新鲜状态、重新验证的事实——在任何效果之前。
注入唤醒。 外部内容选择你的自主代理思考的内容。治疗方法:事件内容是数据;自主性随触发器信任而扩展;比聊天更严格地沙箱化环境。
静音收件箱。 打扰精度下降,直到人类完全停止倾听。治疗方法:跟踪每次通知的已采取行动/已忽略/已忽略;将低于50%的已采取行动视为中断。
静默间隙。 Webhook在三月死了;直到错过续订才有人注意到。治疗方法:推送延迟,扫描真相——一个假设流在撒谎的缓慢协调cron。
不朽守护进程。 一个会话,存活数月,安静地衰减。治疗方法:每次唤醒的新鲜会话;连续性在文件和记忆中,而不是转录中。
午夜惊喜。 代理最冒险的行动在凌晨3点触发,正是因为没有人在那里询问。治疗方法:审查动词、时间感知的自主阈值,以及取消机器在手臂可及范围内。
8、如何开始——一周计划
第1天:审计你的触发器。 列出当前可能导致代理运行的所有内容,以及每次触发的成本。如果任何路径是"按计划的模型调用",用红笔圈起来。
第2天:构建阶段一。 每个触发器前面的结构过滤器。测量丢弃率;如果低于一半,你的规则太害羞了。
第3天:合并。 选择关联键(线程、PR、事件、客户),添加安静边缘去抖动,并将代理的输入从"事件"重新定义为"情况"。
第4天:插入分类层。 小模型,三个词的输出。然后从上个月的事件和你人类的实际响应构建重放评估——在信任之前对整个漏斗的精度和召回率进行评分。
第5天:使唤醒安全。 幂等键、先检查后行动,以及重建仪式:时钟、新鲜读取、目标文件。
第6天:安装阶梯。 通知/提问/审查作为明确的输出类型,在可跟踪的地方交付。开始记录已采取行动/已忽略/已忽略。
第7天:运行两个演练。 重放一次突发(风暴模式合并了吗?),并杀死一个webhook一小时(扫描捕捉到间隙了吗?)。然后计算你的第一次每次有用唤醒的成本,并将其放在仪表板上令牌账单旁边。
9、结束语
两个阵营,这次他们在争论界面本身的未来。
环境阵营说聊天是一个过渡性UI——终局是编织到事件流中的代理,在你之前注意到,并且"打开一个聊天窗口解释你的问题"会感觉像走向终端室一样过时。注意力是知识工作者拥有的最稀缺资源;软件花费自己的注意力来监控,只有在有保证时才花费你的注意力,这就是更好的软件。
怀疑者阵营说一个始终在线的带有工具的代理正是本系列四篇文章警告的东西——不可信的触发器,唤醒时没有人类,凌晨3点的自主性——提示从来不是开销:它是同意。从回路中移除人类的每一次都是将风险从行动时刻转移到你的护栏质量。
两者都对,漏斗是他们相遇的地方。环境阵营是对的,监控是未来——但注意,让我的案例研究奏效的一切都是经典工程:过滤器、去抖动、幂等性、协调扫描、警报疲劳纪律。怀疑者阵营是对的,承诺需要同意——这就是通知/提问/审查阶梯编码的:用于注意到的自主性,用于触摸的升级。构建监视一切、很少唤醒并在行动前询问的代理,你就穿过了它:环境感知,人类承诺。
作业花费一个晚上:找到你个人收到的最嘈杂的通知流,并勾画其漏斗——规则会丢弃什么,什么合并,什么小模型可以分类,什么真正值得唤醒。在编写一行代码之前,你就已经设计了你的第一个空闲代理。
原文链接:The Idle Agent: Designing Ambient, Event-Driven Systems That Wait Well
汇智网翻译整理,转载请标明出处