做产品 PMaker 首页
搜索
跟随系统
颜色主题
空格的键盘
三种策略只是三种对待安全点的方式事件循环取事件、推理、执行工具,回到边界安全点一段推理结束、一次工具返回取消式为紧急事件提前制造安全点队列式等自然边界,批量消费并行式独立会话轻量查询,标记后回写常态维持同步轨迹,打断是必要的妥协

「马上停下」和「今天天气怎么样」不该走同一条路。

事件只在安全点被消费

新事件不在任意时刻插入正在推理或执行工具的循环,而是在每轮边界被消费;取消也只是提前制造一个安全点。打断靠占位符维持轨迹合法,且只在真正紧急时使用。

一个 Agent 实例可能同时面对多个事件:用户新消息、工具返回、定时器到期、另一个 Agent 的协作请求。处理它们的第一原则不是「快」,而是纪律:事件只在每轮循环的边界被消费。抢进正在执行的那一步,换来的是没人能解释的轨迹。

循环边界就是默认的安全点

把异步 Agent 看作一个长期运行的循环:每轮从输入队列取出若干事件,追加到轨迹,调用一次 LLM,执行它决定的工具,再回到循环开头等待下一批——这与 goroutine 从 channel 取消息、在 select 里逐轮处理是同一个结构 ai-agent-book-6。这个模型的关键性质:当 LLM 正在推理、工具正在执行时,新到达的事件不会凭空插入、打乱当前这一步,而是先在队列里等待,到安全点——一段推理结束、一次工具返回——再统一处理。取消也遵循同一纪律:不在任意时刻强行掐断,而是在安全点检查「是否被要求停止」,这正是 Go 里 ctx.Done() 扮演的角色。整章的交互机制共享同一组原语:唤醒、安全点、取消、抢占、快慢分离。

三种策略,只是三种对待安全点的方式

取消式用于紧急事件,本质是提前制造一个安全点,流程固定四步:停止当前操作(取消流式推理、向执行中的工具发取消信号)、清空待处理队列、把队列事件和紧急事件一起追加到轨迹末尾、以更新后的完整轨迹重新调用 LLM ai-agent-book-6。典型场景:用户在 Agent 执行错误操作时输入「停!我说错了」,取消式让模型立刻看到这条更正,避免把错误执行完。队列式用于常规事件:放入队列不打断,等任何工具调用返回时检查队列,非空则所有事件一次性追加——搜索等待期间用户补一句「只看最近一个月」,两个事件一起呈现,省一次往返。并行式用于独立轻量查询:与主任务无关、要快、成本低,三特征同时满足才另起一个推理会话独立回答,再把问答对追加回主轨迹并显式标记「与主任务并行执行」,避免模型混淆。

先判紧急度,再选策略

策略选择的前提是分类。紧急事件:用户中断(user.interrupt)、监督指令(supervisor.instruction)、Agent 间中断、系统告警与支付失败这类紧急外部触发。非紧急事件:常规输入、工具结果、定时器 ai-agent-book-6。硬编码规则有局限——事件的语义决定处理方式,「马上停下来」用取消式、「今天天气怎么样」用并行式、「报告用中文发我」用队列式。建议用一个轻量级分类 LLM 当事件路由器,在到达时快速判断策略。注意路由器本身要快而便宜:它坐在每个事件的通路上,慢一点就是全局延迟。

打断靠占位符修复轨迹

取消点的硬约束:必须是工具或推理能够安全收尾的位置;未完成的工具结果用显式占位符表示,不能伪造成功 ai-agent-book-6。工程上模拟「同步的异步」,五条规则:LLM 输出后立即记录 assistant message;工具完成才记录结果;工具执行中被打断,为未完成的调用生成占位符响应(「工具正在后台执行,请优先处理新事件」)再追加打断事件;思考中被打断则当前思考直接丢弃;非打断事件一律排队批处理。以起草邮件时用户打断问天气为例:被打断的 search_contacts 留下占位符,LLM 看到的轨迹配对完好,答完天气、原结果到达、继续起草。常态下模型看到的是完美的同步轨迹——这对按同步范式训练的模型最友好;占位符是只在真正需要打断时的「必要妥协」。妥协有代价:模型没见过「结果还没回来」的轨迹,后续思考里仍可能编造一个工具结果当真去用。所以只在紧急时打断;被打断的任务要记得恢复,避免幻觉以为工具已经完成。这与 长任务要有交接物和终态 面对的是同一个敌人,只是时间尺度不同——那边以小时计,这里以秒计;回答不等于负责 则给出占位符之外的另一半:真实世界被改变到哪种程度,不能靠轨迹记忆,要靠收据。

参考资料

  1. 《AI Agents in Depth》第六章 交互:观察与动作空间的扩展