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

还应记录:

转移任务所有权,不转移调用者身份

假设 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
允许使用的数据作用域

不应默认包含:

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 -> ...

这不是协作,而是没有收束条件的控制循环。至少设置:

记录 handoff.from、handoff.to、reason 和 task version,才能从轨迹中发现循环。

什么时候使用 Handoff

适合:

不适合:

检查理解

Handoff 适合顺序接管;两个互不依赖的调查则应该并行执行。

下一章:并行任务怎样汇聚而不丢失因果关系?

进入 keel 阅读