设想一位客服正在处理一笔售后退款。
订单和金额已经核对,负责人也批准了。AI 助手发出退款请求,页面显示“正在处理”。就在这时,网络断了。
几分钟后,客服重新打开客户端。聊天还在,最后一条消息仍然是“正在处理”,看不到退款结果。客户又来催问,于是客服说:“刚才没成功,你再做一次吧。”
这句话很自然。人希望继续把事情办完,却未必知道第一次请求到底走到了哪里。
请求可能还没有发出,也可能已经到达支付服务,只是回复没有回来;还可能退款结果已经保存,客户端没来得及收到。相同的界面提示,背后可以是完全不同的业务状态。
如果 AI 把它们都理解成失败,重新发起退款,就可能把“继续原来的工作”变成第二次资金操作。如果它猜测“应该已经成功”,又可能给客户一个无法兑现的答复。
没有收到成功消息,只能说明调用方失去了确认。接下来能不能再做,要看原操作的证据和业务接口的约定。
断线以后,先找回原来的那件事
我们习惯用聊天理解工作:刚才聊到退款,现在接着聊退款,似乎就是同一项任务。
业务系统却需要更明确的关系。是哪笔订单、哪次售后、什么金额、退到哪里?这次请求由谁发起,使用哪个业务身份,得到的批准对应什么内容?
这些信息需要在请求发出前,连同原操作标识一起保存下来。断线后找回它们,才能知道自己正在核对哪次操作。
聊天摘要可以帮助 AI 理解背景,却不能替代这份记录。“客户要求退款”没有说明是否已经发出请求,“负责人同意了”也没有说明批准的是哪笔款、哪个金额。
更不能在重新打开客户端时,临时生成一个新编号,然后把它当成原退款的继续。对调用方来说,它们都是“退这笔钱”;对业务服务来说,却可能是两项不同请求。
当然,同一订单也可能发生两次合法的部分退款。只根据订单号或金额相同,就把后一次当成重复,也会妨碍正常业务。
所以,系统要同时表达两件事:这次操作针对什么,以及它是不是对原意图的继续。用户不必记住这些编号,但负责工作的应用需要保留它们。
AWS 在讨论安全重试时,也强调由调用方提供请求标识来表达意图。参数相同,并不足以判断用户是否想做第二次相同操作。这个问题在 AI 参与之前就已经存在,Agent 把它带进了更自然、更容易省略细节的对话里。
“查一下结果”和“再做一次”需要分开
找回原记录以后,第一项工作通常是核对,而不是再退款。
系统可以查询原调用记录、原退款单,以及业务服务能够提供的当前状态。这个查询本身应当只读,不因为客服想看进度,就再次触发资金操作。
这里还有一个容易误读的细节:查询返回“本次没有执行业务”,说的是这一次查询。它没有证明此前那次退款从未发生。
同样,原记录没有找到,也不能直接变成“可以重新退款”。可能是查错了范围,可能是记录尚未同步,还可能是当前路径已经无法提供完整证据。只有查询能力和业务规则确实足以证明原操作未执行,才能支持这个更强的判断。
接下来,证据可以把工作带向不同路径。
如果可靠记录表明请求一直停在发出之前,便可以检查当前条件,继续原操作的首次执行。如果原退款已被业务系统确认,就取回对应结果,向客服说明;它仍在处理中,就继续查询进度,避免把等待变成新申请。
“已受理”“退款处理成功”和“客户账户已到账”,也应按业务服务的定义分别表达。不能拿到一个受理编号,就替支付服务承诺钱已经到账。
如果只能确认请求可能已经发出,结果仍不清楚,就把这一项保留为待核对。客服可以看到目前查到了哪里、还缺哪个结果、下一次怎样查询,需要人工介入时也能带着原记录接手。
这种接续比一句“失败,请重试”更有用。它没有要求人重新描述全部背景,也没有要求人凭经验猜测资金是否已经动过。
重试能安全进行,需要业务服务配合
开发者常用“幂等”描述一种重复执行保护:在接口约定的条件下,同一操作再次到达,不会额外产生一次相同的业务效果。
但这份保护要由接收操作的业务服务落实。客户端保存了原编号,中间层记了一条日志,或者模型承诺“我不会重复”,都不能单独保证下游没有多退一笔款。
原操作标识需要真正进入业务服务认可的契约。服务还需要约束它属于哪个调用方、对应哪些参数、保留多长时间,以及重复请求会得到什么结果。
Stripe 的官方文档提供了一个具体例子:API v1 在开始执行后,保存同一幂等键的首个响应,重复请求返回保存的结果,其中也包括 500 错误。键至少保留 24 小时后可以被清理;清理以后再使用,会形成新请求,参数不一致则会报错。其 API v2 对失败或部分失败的重试采取不同处理。
这说明,“支持幂等”仍需要读清接口条件。一次重试能返回什么、保护多久,不能从别的接口经验里直接搬过来。
回到退款。如果接口允许在有效期限内,使用原标识和原参数安全重试,应用就可以按照这个契约继续,不必让客服对每次网络波动都重新审批。
如果客服将金额从一百元改成八十元,这已经涉及改变原来的意图。不能保留原标识却悄悄改参数,也不能换个新标识来绕过尚未查清的旧请求。应先核对原退款,再按当前业务规则处理新的要求。
如果原标识的保存期限已经过去,或者接口根本没有相应保护,则要寻找业务系统提供的退款单查询、账务核对或人工处置路径。当前无法确认的结果,需要继续核对;不能仅因为用户着急,就把时间过去了当成原操作消失了。
这也是为什么端到端的重复执行保护,无法只靠一个更聪明的模型补齐。每一层都应说明自己能保留什么,真正改变资金状态的一端则需要提供对应保障。
用户点了停止,已发出的请求仍可能完成
断线后的另一个常见要求是:“先别退了。”
系统应当及时停止后续可阻止的操作,但还要查清此前的请求是否已经发出。一个请求越过业务服务的接收点以后,关闭对话、停止模型生成,甚至取消客户端任务,都不等于资金动作已经撤回。
如果退款随后完成,系统需要保留这个结果并告知接手者。把任务标成“已取消”,再把晚到的成功消息丢掉,会让客服误以为事情没有发生。
有些业务服务提供撤销或补偿能力,也应按各自规则执行。它们是有独立条件和后果的业务操作,不能从“停止 AI”这句话里自动取得授权。
授权变化同样需要认真处理。昨天有权退款,不代表今天仍有权继续;原审批也不能因为换了一位客服、换了一个账户,就自然转移过去。
核对原结果也应符合当前读取权限。授权被撤销时,应用不能为了让对话顺畅,改用另一把默认凭据或管理员身份去取回结果。应该把原操作信息交给有权处理的人,保留接手依据。
但这并不意味着每次恢复都要把全部工作重新审批。范围没有改变、条件仍有效、接口契约允许的部分,可以继续。真正需要重判断的,是当前权限、业务状态或预期后果发生了变化的地方。
暂停一笔不确定的退款,工作仍然可以继续
“结果未知”很容易在产品里变成一个死胡同:任务挂起,聊天不能继续,所有操作一起被挡住。
这样的设计虽然避免了眼前重发,却把异常处理的成本全部留给了人。
合理的暂停应该有明确范围。原退款尚未查清,可以暂缓与它可能重复或冲突的资金操作;已经允许的记录整理、只读核查、进度说明,以及不依赖这笔款的其他工作,仍然可以进行。
例如,客服可以让助手整理客户诉求,核对原批准内容,准备一份准确的处理进度。它可以说明“原请求结果仍在核对”,但不能编出到账时间,也不能把未确认的结果写成已经完成。
接手说明还需要包含具体下一步:向哪个业务服务查询,依据哪个原操作,当前看到什么,下一次复查在什么时候,什么结果会允许继续。否则,“等待确认”只会成为另一个没有负责人的待办。
用户体验也可以因此变得更自然。客服说“接着处理刚才那笔退款”,应用先找回原操作,展示已经查明的进度,然后继续允许的工作。有依据时直接推进;需要一个新决定时,才把具体变化交给有权决定的人。
让人不断重复目标、逐步确认每一个动作,并不会自动得到可靠性。系统保留了原关系,能够清楚区分查询、继续和新增操作,才有条件减少人的负担。
企业验收,也要看中断后能否继续
采购或评估 AI 助手时,我们很容易只看一次顺利演示:客户提出要求,AI 查询信息,点击执行,最后报告完成。
但真正投入日常工作以后,中断总会出现。有人合上电脑,有人换班,网络会超时,服务会重启,业务条件也会改变。
因此,验收可以主动加入几次中断:请求发出之前、发出后尚未得到结果、业务成功但客户端没有收到,以及用户要求停止以后仍有结果返回。
观察的重点是,重开以后能否找回同一项工作,是否避免凭空创建第二次资金操作,未知有没有被保留下来,有权接手的人能否看懂下一步。再观察确认结果回来以后,工作能否自然继续,而不是永远停在异常状态。
这些表现会影响实际成本。重复退款需要追回和解释;无依据的成功承诺会增加投诉;每次断线都从头核查,则会消耗客服和财务的注意力。自动化省下的时间,要与这些返工和接手成本一起计算。
企业可以先选一个高频流程,把原操作如何记录、结果向哪里核对、哪些条件允许继续写清,再逐步扩大委托范围。可靠续办由应用、业务接口和组织规则共同形成,不必先等待一个能包办一切的 Agent。
这也是我们讨论 Agent-to-Business 时关注的具体问题。ACC 是独立的能力治理声明契约,帮助表达操作范围、可信身份、风险与审批意图,不替应用编排退款,也不判断实时业务结果。BailingHub Core 提供相应接入、治理和原调用回执机制;只读核对与可能继续执行的操作分开。工作步骤由客户端或宿主编排,模型中枢承担模型接入、计量与异步结算,真实退款及其重复执行保护仍由业务系统负责。
回到开篇,客服说“再做一次”,希望的是把原来的事情办妥。系统需要先回答原退款走到了哪里,再决定查、等、继续还是交给有权处理的人。
AI 能在断线后把事情接回来,既不丢掉已完成的结果,也不把失去确认变成第二次操作,企业才更容易放心把一段持续的工作交给它。