KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
05. Handoff 究竟转移了什么? — keel 龙骨
用户一开始只说“支付服务异常”。Triage Agent 识别到这是运行指标问题,把当前任务交给 Metrics Agent;Metrics Agent 发现需要数据库权限,再把任务交给人工值班人员。
用户一开始只说“支付服务异常”。Triage Agent 识别到这是运行指标问题,把当前任务交给 Metrics Agent;Metrics Agent 发现需要数据库权限,再把任务交给人工值班人员。
这种“下一位处理者接管当前工作”的模式叫 handoff。它与 Supervisor 创建子任务不同。
Delegation 和 Handoff 的差别
| 行为 | 原所有者是否继续负责 | 是否创建子任务 | 典型场景 |
|---|---|---|---|
| Delegation | 是 | 通常是 | Coordinator 请两个 Worker 分别调查 |
| Handoff | 否,控制权转给新所有者 | 可以沿用同一任务 | 客服从分诊转给退款专员 |
Delegation 更像负责人请同事提供材料;handoff 更像工单转派,新处理者承担下一步响应责任。
一次完整交接至少包含什么
class HandoffRecord(BaseModel):
task_id: str
from_agent: str
to_agent: str
reason: str
artifact_refs: list[str]
remaining_attempts: int
remaining_seconds: float
还应记录:
- 交接发生时的任务版本;
- 新所有者从何时生效;
- 哪些上下文和工件被允许转交;
- 原 Agent 是否仍可写任务状态;
- 失败时回到哪里;
- 交接链允许经过多少跳。
转移任务所有权,不转移调用者身份
假设 Triage Agent 可以读取基本事件,Refund Agent 可以发起退款。交接到 Refund Agent 后,新 Agent 仍要使用当前用户身份和自己的能力策略重新授权。
handoff(task, refund_agent)
!=
copy_all_credentials(triage_agent, refund_agent)
Agent A 有权请求 Agent B 接手,不表示 A 能授予 B 超出系统策略的权限。委派链不能凭空扩大 authority。
上下文不是整段聊天原样复制
一个安全 handoff packet 可以包含:
当前任务目标
已确认的用户意图
经过校验的 artifact 引用
尚未解决的问题
剩余预算和 deadline
允许使用的数据作用域
不应默认包含:
- 原 Agent 的隐藏 system prompt;
- 原 Agent 的原始 thinking;
- 未经验证的中间猜测;
- 与新任务无关的敏感消息;
- 原 Agent 的工具凭据。
Context Builder 应根据新 Agent 的职责重新装配上下文,而不是复制整个 transcript。
所有权变化必须是原子操作
下面两个状态不能同时成立:
task.owner = triage_agent
task.owner = metrics_agent
在数据库中,交接通常需要条件更新:
UPDATE tasks
SET owner = :new_owner, version = version + 1
WHERE task_id = :task_id
AND owner = :expected_old_owner
AND version = :expected_version;
受影响行数为 0,说明任务已经被其他执行者更新,当前交接必须失败或重新读取,不能覆盖新状态。
防止循环交接
A -> B -> A -> B -> ...
这不是协作,而是没有收束条件的控制循环。至少设置:
max_handoffs;- 整次运行 deadline;
- 相同边重复次数限制;
- 低置信度 fallback;
- 人工接管或明确失败状态。
记录 handoff.from、handoff.to、reason 和 task version,才能从轨迹中发现循环。
什么时候使用 Handoff
适合:
- 用户需要与当前专业 Agent 继续多轮交流;
- 下一 Agent 需要接管同一任务,而不是提供独立材料;
- 当前处理者已经不能继续,需要升级到人工或更高权限队列。
不适合:
- 需要同时获得多个独立视角;
- 原 Coordinator 仍要汇总全部结果;
- 只是调用一个确定性能力,此时 Tool Calling 更简单。
检查理解
- Handoff 为什么不等于普通函数调用?
- 新 Agent 为什么不能继承旧 Agent 的全部权限?
- 为什么交接需要任务版本?
- 为什么原始 thinking 不应随 handoff 自动传播?
Handoff 适合顺序接管;两个互不依赖的调查则应该并行执行。