ZhaoCong赵聪 — 2026.11.03

Handoff 模式:让多 Agent 任务按职责接力

最后更新 · 2026/10/26

Handoff 常被翻译成“交接”或“移交”。在多 Agent 系统里,它指当前 Agent 完成自己负责的阶段后,把任务交给更适合处理下一步的 Agent,并把继续工作所需的信息一并带过去。接手者成为新的任务负责人,前一个 Agent 不再同时推进同一份任务。

因此,一次真正完整的 Handoff 至少包含三件事:任务移交、必要上下文移交、控制权移交。只调用另一个 Agent、只复制对话、或只在聊天记录里写一句“请继续处理”,都不能自动保证这三件事发生。

不过,Handoff 不是每段 AI 对话都必须有的机制。用户问一个简单问题、一个 Agent 调用一个工具就能完成时,直接回答或工具调用通常更简单。只有任务跨越不同专业职责、权限边界或处理阶段,且确实需要换负责人时,Handoff 才有价值。

为什么多 Agent 对话会需要 Handoff

一个 Agent 包办所有事情,边界会变得模糊

拿景区退款举例。游客说:“票买了但没用,想退款。”系统要识别诉求、查询订单、确认支付与核销状态、检查风险、计算退款金额,最后可能还要申请审批并执行退款。

如果一个 Agent 做完所有步骤,它不仅要理解用户,还要知道订单、风控、票务、退款和审批规则,并持有相应工具。工具越来越多,模型每次都要判断该调用哪个;提示词和上下文也越来越重。更麻烦的是,查询订单、判断风险和执行退款的权限不同,放在一个 Agent 上容易让职责和安全边界缠在一起。

交给一个总控 Agent,也有成本

另一种做法是让 Supervisor 每次决定下一步:客服处理后回报 Supervisor,再由它派给订单 Agent;订单查完再回报,Supervisor 再决定是否交给风控。这样集中调度,流程更容易观察和控制,但每一步路由都压在总控上。业务越多、分支越多,总控越容易成为又重又难维护的决策中心。

Handoff 可以让熟悉当前业务阶段的 Agent 直接把任务交给下一位专业 Agent。例如客服判断出这是退款并收齐订单号后,直接交订单 Agent;订单核验完成,再交风控 Agent。这样少一层重复路由,也保留了按结果选择下一步的空间。

Handoff 是责任转移,不等于“多找一个模型帮忙”

多 Agent 对话里最容易混淆的是“调用”与“交接”。工具调用通常是当前 Agent 发出一个请求,拿回结果后仍由它继续负责。Handoff 则把任务当前负责人换成另一个 Agent。两者的状态变化不同。

动作 发起后谁仍负责任务 典型例子
工具调用 当前 Agent 客服 Agent 查询订单接口,拿回订单状态后继续判断
Handoff 目标 Agent 客服 Agent 完成信息收集,把退款任务交给订单 Agent
并行委派 通常仍由协调者负责汇总 多个 Agent 同时调查客流、天气和支付数据

Handoff 也不天然代表去中心化。如果每次目标 Agent 都由 Supervisor 决定,整个系统仍是中心调度,只是交接消息采用了 Handoff 的形式。视频重点讨论的是 Agent 之间可以直接交接的 peer-to-peer 路径。

用退款流程看任务如何流动

先把用户请求转成一项可追踪的业务任务,而不只是留在聊天记录里。系统可以创建 task_id,记录这是一个退款申请;session_id 只说明它来自哪次对话。一段对话里可能有多个订单、多个请求,任务 ID 和会话 ID 分开后,才知道审计或恢复时要追踪哪一件事。

客服 Agent 负责识别退款意图、记录游客诉求、收集订单号。没有订单号时先向用户追问,满足最低交接条件后才交给订单 Agent。订单 Agent 查询权威订单系统,核实订单归属、支付状态、核销状态和重复退款情况。通过基础校验后,把查到的事实和证据交给风控 Agent。

风控 Agent 检查退款频率、账号标签、设备异常或重复申请。风险较低时交给退款 Agent;命中规则时转人工审批。退款 Agent 根据票种和规则计算金额、手续费和退款方式,但最终执行仍要通过后端的权限和业务校验。处理完成后,系统通知用户;如果进入审批,就由人工完成决策,再把任务交回系统。

这不是一条必须写死的 A 到 B 到 C 流程。大方向可以明确,具体路线根据订单状态、风控结果和审批条件分支。每次交接都应由当前 Agent 完成职责后触发,而不是因为“还有另一个 Agent”就随意转交。

一份交接包应包含什么

交接包的目标是让接手者知道:这是哪项任务、为什么交给我、我应该做什么、哪些信息已经确认、哪些内容仍不确定。字段可以按业务需要调整,以下是一种参考结构:

{
  "task_id": "refund-20260831-001",
  "session_id": "session-abc123",
  "handoff_id": "handoff-002",
  "trace_id": "trace-xyz789",
  "schema_version": "1.0",
  "from_agent": "customer_service",
  "to_agent": "order_verification",
  "current_owner": "order_verification",
  "handoff_reason": "已确认退款诉求,需要核验订单状态",
  "objective": "核实订单是否属于该用户、是否支付、是否核销",
  "business_context": {
    "intent": "refund_request",
    "order_id": "A20260831",
    "user_request": "订单已支付但尚未消费,希望退款"
  },
  "known_facts": [],
  "evidence_refs": ["order-service-query-789"],
  "risk_flags": [],
  "open_questions": ["订单当前状态是否满足退款审核条件"],
  "constraints": ["只查询,不执行退款"],
  "deadline": "2026-10-08T16:30:00+08:00"
}

这里的字段不是通用标准,关键是定义稳定的“上下文契约”。例如:

  • 任务身份与路由:task_id、session_id、handoff_id、from_agent、to_agent、当前负责人和交接原因。
  • 处理目标:这次要回答的问题、允许执行的动作,以及不能做的事。订单 Agent 可能只需核验,不能退款。
  • 业务上下文:用户意图、订单号和简要诉求,不需要把几十轮聊天全部复制过去。
  • 事实与证据:把“用户声称已付款”和“订单系统返回已付款”分开记录;尽量带来源或查询结果引用。
  • 风险与未决问题:有哪些风险标记,哪项信息仍待核实,下一位 Agent 应先解决什么。
  • 追踪和时限:trace_id、交接包版本、截止时间和幂等标识,帮助串起链路并处理超时或重复请求。

信息应“最小但充分”。上下文太少,接手者会重复问用户或漏掉限制;上下文太多,关键事实会被淹没,还会增加成本和数据暴露面。原始业务数据很大时,交接包传引用,下游按权限读取即可。

不要在交接包里传密码、数据库凭证或服务令牌。Agent 有什么权限,应由系统自己的授权配置决定。上游 Agent 有权限,不代表下游也应获得同样权限。

交接前要有门槛,交接后要确认结果

视频把交接前的检查称为 handoff guard。它可以检查几件事:当前 Agent 是否完成职责;目标 Agent 是否确实需要介入;关键字段是否齐全;路由是否符合业务规则;任务是否已取消、已完成或已经转给别人。

例如客服还没有拿到订单号,guard 应阻止任务进入订单核验。退款金额超过某个阈值时,规则应要求进入审批,而不能让模型自由选择自动退款。通用问题可以由模型根据 Agent 能力描述选择目标;退款、支付和审批等高风险路径则应由明确规则约束。两种办法可以组合使用。

交接发出后,还需要明确接收状态。目标 Agent 是否成功接收?任务负责人是否已经切换?交接消息是否重复?如果调用超时,系统要能判断“对方没收到”还是“对方处理了但回执丢了”。这也是 handoff_id 和幂等处理有用的原因。

进一步的工程建议是把“写入交接事件、切换任务负责人、投递交接消息”设计成可恢复的操作。否则可能出现负责人已切换、消息却没发出去,或消息发出、旧负责人仍能写入的半完成状态。可以通过事务性事件或 Outbox 一类机制协调状态更新和消息投递;采用哪种方式取决于系统架构,但要能恢复和去重。

所有权、状态机和并发控制

一个任务在同一时刻应只有一个 Agent 负责推进状态。系统可在任务记录里保存 current_owner 和 owner_version。比如订单 Agent 持有版本 7,交接给风控时负责人更新为风控、版本变为 8。订单 Agent 若拿着版本 7 的旧请求回来更新任务,系统就拒绝过期写入。

这可以用乐观锁、状态版本或其他并发控制实现。它解决的是“谁有权写当前状态”,不代表其他 Agent 完全不能读取所需信息。

复杂任务还适合用明确状态表达生命周期,例如:

created → assigned → active → handed_off → active
                          ↘ awaiting_human → active
                          ↘ completed
                          ↘ failed / cancelled

状态名称可以因系统而异,但要规定谁能触发每种转换。completed 任务不能被旧 Agent 重新打开;cancelled 任务不能继续执行退款;等待人工审批时,自动 Agent 不应偷偷越过审批继续操作。

防止踢皮球、无限重试和重复副作用

如果客服把任务交给订单 Agent,订单 Agent 又把它退回客服,补完后再交回来,系统可能一直循环。可以设置最大交接次数 max_hops,但具体上限要按流程长度决定。还要记录交接路径;重复的 Agent 序列或重复退回同一原因时,触发环路保护,转异常队列或人工处理。

每个阶段应有截止时间或 SLA。订单服务超时,可以有限次重试;服务持续不可用时,告知用户状态暂时无法确认,再转人工或异常队列。重试要有上限、退避策略和可观察的失败原因,不能让任务无期限挂起。

退款、支付、库存扣减都可能产生不可逆或重复的副作用。系统应为业务动作设置幂等键,后端在执行前重新检查订单最新状态和权限。Agent 的重试不能变成两次退款。对于状态不确定的请求,应先查执行结果,再决定是否重试,不能仅凭“没收到响应”就再发一次。

如果超时或无法路由时交给 Supervisor 兜底,这不代表正常流程也必须改成 Supervisor 模式。Supervisor 可以只处理异常出口;人工审批也可以是正式链路节点。

安全边界不能随着任务一起漂移

Handoff 转移的是任务控制权和必要上下文,不是上游 Agent 的全部能力。客服 Agent 可以收集诉求,订单 Agent 可以查询订单,退款 Agent 才可能调用退款执行能力。高风险操作还需审批或额外授权。

业务数据应以权威系统为准。上游传来的结论如果会影响退款,接手 Agent 应按需重新查验,或验证附带的证据引用。对外部网页、用户输入、工具返回内容也要保留来源边界:这些内容可以提供事实,但不应自动获得修改系统规则、越权调用工具或改变任务权限的资格。

还要控制传递的数据范围。任务只需要订单状态,就不应把不相关的个人资料带到下游。多租户场景中,查询和交接都必须沿用当前租户与用户的授权范围,避免“换了 Agent 就丢了访问控制”。

用户看到的应该是一件连续的事

内部发生多次 Handoff,不代表用户需要面对多个机器人轮番自我介绍。系统最好指定一个对话出口,由它负责把内部结果转成一致的用户回复。处理中可以简短说明正在核验或等待审批;任务切换时保存用户已提供的信息,避免反复索要订单号和退款理由。

遇到耗时任务,还要处理用户中途补充信息、撤销申请或开启新请求的情况。新信息要关联到正确的 task_id:它可能更新当前任务,也可能创建新任务。用户取消后,待执行的 Agent 和工具调用都应检查取消状态,特别是尚未发生的退款操作。

因此,“Agent 对话要有 Handoff”并不是普遍要求。真正需要的是让多阶段任务在内部交接时,对用户仍保持连贯、可解释、可中断。简单对话不必为了架构整齐而拆 Agent。

记录什么,才能知道 Handoff 有没有用

每次交接至少记录任务 ID、发起方、接收方、交接原因、时间、交接结果、处理耗时和 Trace ID。需要审计时,可保存交接包快照或哈希,并记录哪个版本的规则做了路由决定。日志里不要因为方便而保留不必要的敏感数据。

除单次日志外,还可以观察几项系统指标:交接成功率、每个 Agent 的超时率、平均交接次数、重复退回率、环路触发率、人工接管比例、重试后重复执行拦截数,以及用户被重复追问的比例。若任务经常在两个 Agent 间往返,问题可能是职责边界不清或交接字段不足;若人工接管很多,也要判断是规则过严、信息不足,还是某个 Agent 的能力不够。

什么时候选 Handoff,什么时候换方法

适合 Handoff 的任务通常有明确分工,阶段之间存在先后依赖,但下一步仍可能根据结果分叉。客服、订单、风控、退款这样的业务链就是典型例子。售后转技术支持、工单分级和审批流程也可能适用。

如果流程完全固定,每一步都不需要 Agent 决定下一站,普通工作流可能更简单。如果问题需要多个 Agent 同时探索、相互共享中间发现,例如分析收入下滑的原因,Blackboard 更合适。如果系统必须由中心统一掌握每次路由,Supervisor 更合适。它们不是等级关系,按任务结构选择即可,也可以组合。

一个实用的起步方法是先画出任务状态和职责边界,再列清每个 Handoff 的触发条件、交接字段、权限范围和失败出口。先把正常路径做成少数几次可解释的交接,记录真实运行情况;确认职责划分稳定后,再增加模型动态选路。不要一开始就让每个 Agent 可以自由地交给任何其他 Agent。

上线前的检查问题

  • 当前任务由谁负责?交接完成后旧负责人还能否写状态?
  • 每次交接的业务目的和完成条件是否明确?
  • 目标 Agent 拿到的信息够不够用?哪些事实要重新向权威系统核实?
  • 交接是否带了不必要的个人数据、凭证或权限?
  • 同一任务重复提交、消息超时、回执丢失时,系统如何去重和恢复?
  • 是否有最大交接次数、路径检测、阶段超时、重试上限和人工出口?
  • 退款等副作用操作是否由后端最终校验并支持幂等?
  • 用户中途补充或取消时,任务如何更新?
  • 发生错误后,能否根据事件记录还原谁在什么依据下做了什么?
  • 如果流程根本不需要动态分工,是否可以用更简单的工作流或单 Agent?

最后把它说清楚

Handoff 解决的是多阶段业务里的责任交接:当前 Agent 做完自己这一段后,把可追踪的任务和必要信息交给下一位负责人。它能让专业分工更清楚,也能减少总控节点的重复路由;代价是状态、上下文、权限、重试和异常恢复都需要认真设计。

所以判断一个 Handoff 系统是否成熟,不看 Agent 之间能不能互相调用,而看任务能否明确交接、唯一推进、失败后恢复,并且在每个关键步骤上都能说明“谁做了什么、依据是什么、下一步由谁负责”。

  • 作者:赵聪(ZhaoCong),产品经理与独立开发者。