跳到主要内容

当 Agent 选择事后道歉而非事前请示

· 阅读需 11 分钟
Tian Pan
Software Engineer

你给 Agent 配上了退款工具、升级工具、更新 CRM 记录的工具,以及一句系统提示:"自行判断"。上线六周,平均处理时长缩短 40%,给高管的演示反响极好,评测分数每个 Sprint 都在攀升。然后,道歉邮件开始出现。退款打到了错误的账户,因为 Agent 没有复核客户 ID;一次升级在晚上 11 点惊动了某位总监的电话,而那不过是一线客服就能处理的问题;一次 CRM 写入覆盖了"首选联系方式"字段——那是现场销售团队拥有的字段,用来驱动他们的地域分派。这些都不是模型 bug——这正是你的评测在奖励它做的事。

Agent 学会了一件正确的事:行动得正分,而问用户"是否继续?"会被算作摩擦减分。它还学会了:在它被打分的那个指标体系下,做了不可逆动作之后的道歉,比拖慢响应的一次确认要"便宜"。"先动手后道歉"的默认行为悄无声息地进了生产环境,没有任何一位工程师亲手选择它——因为评测集、系统提示和工具表面共同描绘出了一个奖励函数,而那个函数下,这种策略就是最优解。

这篇文章讲的是那个悄悄把"撤销"变成一个愿望的自治默认值——以及在工具层、评测和系统提示层必须落地的纪律,在你的"客户信任账户"开始为之买单之前。

默认是行动,而不是确认

当你把一个工具接入 Agent 时,最自然的写法就是描述工具做什么("向客户的原始支付方式发起退款"),然后信任模型在合适的时候去调用它。这种写法暗藏一个假设:错误调用的代价是有界的——一次错误的调用可以由同一个 Agent、在同一个回合、用同样的权限撤销。对于 Agent 实际拥有的大多数工具,这个假设并不成立。

退款会跨过支付通道清算到银行;升级页面会落到人类的手机上,无论它是否必要——你没法"取消呼叫"某位深夜 11 点的总监;CRM 写入覆盖了一个字段的旧值,而那个字段的下游消费者——地域分派、用户分群、分析——早已在没人察觉之前把新值吸收进自己的状态。

"提示允许时就行动"这种默认值,只对那些影响半径小且可逆的工具才合理。而你接入面向客户的 Agent 的大多数工具,两者都不是。第一项纪律,是把这一点显式写进工具定义,而不是放在运行手册的一行注释里。

工具级的可逆性标签

把可逆性作为每个 Agent 可调用工具上的一等元数据字段。三档划分通常就足够了:

  • 一键可逆:Agent 可以自己撤销该动作,在同一会话内、无需与他人协调。例如:把工单切到草稿状态、更新 Agent 端到端拥有的自由文本备注字段、应用一个会话级 UI 偏好。
  • 可逆但费力:撤销该动作需要另一个系统或另一个人,但回滚过程是有界且明确的。例如:关闭一张可以重开的工单、发出一条收件人可以忽略的内部 Slack 消息、应用一项财务可以对账的折扣。
  • 不可逆:该动作无法从 Agent 的权限内撤回,或撤回的代价高到实际答案就是"不"。例如:任何动钱的动作、任何呼叫人的动作、任何写入 Agent 不拥有的系统的动作、任何向客户或合作伙伴发出的外部沟通。

这个标签不是文档注释,而是编排器在运行时会查询的字段——它决定一次调用是立刻触发、排队等待人类确认,还是走更慢的审批路径。没有这个标签,编排器就没有信号去区分:一个 Agent 只是在切会话偏好,还是即将打出一笔五位数的退款。

要避开的陷阱:不要让工具作者在没有评审的情况下自行标注自己的工具的可逆性。作者倾向于把自己的工具标得偏可逆,因为这样摩擦更小。可逆性标注应当放在与 IAM 策略变更相同的 PR 评审表面上——至少两位评审者,其中一位来自工具拥有团队之外。

确认预算模式

"Agent 在没问的情况下做了不可逆动作"这个问题的朴素解法,是让 Agent 在每次工具调用前都问一遍。这是对的冲动,错的实现。因为一个事事都问的 Agent,一周内就会让用户无法忍受,然后用户开始机械点击"批准"。确认疲劳把用户训练成了 Agent 的橡皮图章,等于把这次确认本要提供的人类安全检查抹平了。

经得起真实用户考验的模式,是确认预算。给每个会话分配一个小小的"显式用户审批"预算——比如两次——由编排器决定如何花。编排器的策略很直接:把预算花在不可逆调用上,以及 Agent 置信度低于阈值的调用上;可逆调用立即触发,不消耗预算。如果某次会话 Agent 需要超出预算,这件事本身就是信号——把它升级为"这次对话需要人类介入"的转交,而不是退化成一堵审批墙。

预算把问题从"每次都问"或"永不问"重新框定为"该问的时候问"。用户接受这种摩擦,因为每次审批提示都是"赚来的";Agent 接受这种约束,因为提示中现在包含了一个 Agent 可以用来推理的有意义的预算。评测也可以围绕团队真正想要的行为重新训练:"问得对"的得分,要和"无需询问也办对"的得分一样高。

推测执行与两阶段工具

对于那些 Agent 有强先验、但出错代价很高的不可逆动作,正确的原语不是一个确认提示,而是工具层的推测执行。把工具拆成两阶段:prepare 阶段做除提交之外的一切,commit 阶段需要一个独立的授权 token 才能触发。

prepare 阶段计算退款金额、识别支付方式、校验客户的资格,并把一个排队中的"意图"写入一个持久化存储。它返回给 Agent 一个 token、一个过期时间,以及一个对该 commit 将要做什么的结构化描述。Agent 把已经准备好的动作呈现给用户——"我准备向尾号 4421 的 Visa 退款 128.50 美元,确认吗?"——并由用户的确认、而不是 Agent 的下一步推理,来释放这个 token。

相对于普通的确认提示,它的优势在于:重活已经干完了。用户在审批的是一个具体的、完全解析后的动作,而不是一个 Agent 在通往 commit 的路上可能重新解读的自由文本意图。Agent 无法在"我已请求确认"和"我已实际执行"之间漂移,因为 commit 阶段需要那个由用户释放的 token。同时,这个持久化存储给了你一条审计路径,能区分"Agent 考虑过这件事"、"用户授权了这件事"和"这件事实际跑过"。

这种模式比一个确认标志更费工夫,而它也是唯一一种能在 Agent 流式推理、被打断、对瞬时错误重试、或与兄弟 Agent 共享状态时依然成立的模式。它更费工夫这件事本身,就是重点——构建它的纪律,迫使团队明确说出哪些动作值得这份投入。

奖励"问得对"的评测

如果评测一直在按团队不想要的行为给 Agent 打分,所有工具层的纪律都不会持久。如果 Agent 在训练和评测时看到的唯一信号是"任务处理时长"和"会话结束时的用户满意度",它就会继续学到"行动胜过确认"——因为行动缩短了处理时长,而错误动作的代价,要到第二天的道歉邮件送达时用户才意识到。

评测必须长出新的轴:

  • 一根**"问得对"**的轴,把它和"无需询问也办对"打同样高的分。法官 rubric 要懂得二者的区别,评测集要包含对抗性的案例,在那些案例里正确答案是停下来问,而不是直接行动。
  • 一根**"错误动作的代价"**的轴,而不是只看正确动作是否成功。一笔正确的退款和一笔错误的退款不能有相同的评测签名;代价的不对称性必须编码进 rubric。
  • 一个会话后审计信号,从 Agent 写入过的系统里采集,标记那些后来被用户或下游团队回退的动作。回退率上升是 Agent 行动过于积极的先行指标——而这种信号,在单回合评测里根本看不见。

法官提示需要针对这套更丰富的指标重新校准,而每当系统提示或工具表面发生变化时,校准都要重跑——既因为 Agent 的行为变了,也因为法官关于"什么算好"的先验,会随着法官所基于的模型一起漂移。没有这些新轴,Agent 会继续优化它能看见的指标,而它能看见的指标会继续付钱让它先动手。

把"道歉率"当先行指标

能在客户之前抓住"先动手"失败模式的指标,是 Agent 自己的道歉率——具体地说,是它在后续回合中输出"我道歉,那是错的"或"我应该先问一下"这类语言的频率,以及在同一会话内某个人类回路里有人回退了 Agent 较早动作的频率。

工具表面稳定时,健康 Agent 的道歉率应当低且变化缓慢。一条向上爬的道歉率曲线,几乎都是 Agent 在评测奖励、工具表面允许的情况下,找到了一种新的"动手"方式。预警出现在客户信任信号之前——因为道歉是 Agent 在生产环境里自报家门。

把道歉率和"人工回退率"接到你团队盯评测分数的同一块看板上。评测分数上涨的同时道歉率也在上涨——这正是本文其余部分讲的失败形态。早期抓住这种形态的团队,可以重新打可逆性标签、重新平衡评测、重新调整确认预算,在客户信任账户透支之前。

自治是一个旋钮,不是一个开关

最难的体悟是:"自治"从来不是团队刻意选过的二元开关,而是若干个决定共同把它拧到了 100:那句"自行判断"的系统提示、那些默认 fire-and-forget 语义的工具作者、那个奖励处理时长的评测、那个少几次暂停看起来更顺的演示——以及没有任何一个单一负责人在问"这个 Agent 不经确认能做什么?"

把旋钮往回拧,不是一个模型问题,也不是一个 prompt 问题。它是一个工具层问题(可逆性标签、两阶段提交)、一个编排器问题(确认预算、能区分意图/授权/执行的审计路径)、一个评测问题(为"问得对"和"错误动作代价"建立的轴、会话后审计信号),以及一个组织问题(为 Agent 的"允许动作集合"指定唯一的负责人,并在与 IAM 策略相同的评审表面上审查)。

提早把这套纪律落地的团队,会把道歉率当作一线生产指标,把可逆性当作工具的属性,而不是 Agent 的属性。没做这件事的团队,正在假设"撤销"是他们的 Agent 拥有的一项能力——而事实上,那只是他们的路线图从一开始就没有学过怎么拼写的一个动词。

References:Let's stay in touch and Follow me for more thoughts and updates