按场景选型(Pattern Selection by Scenario)
根据任务特征选择最合适的 Agent 设计模式,避免过度设计或能力不足
Agent 之间按条件主动移交控制权和上下文,实现专业化分工协作
内容摘要
Handoff(任务移交)是一种多 Agent 协作模式:当一个 Agent 发现当前任务超出自己的能力范围,它会**主动把对话控制权和完整上下文一起交给另一个更合适的 Agent** 继续处理。用户不需要重新描述问题,新 Agent 接手后就能无缝接续工作。
Handoff(任务移交)是一种多 Agent 协作模式:当一个 Agent 发现当前任务超出自己的能力范围,它会主动把对话控制权和完整上下文一起交给另一个更合适的 Agent 继续处理。用户不需要重新描述问题,新 Agent 接手后就能无缝接续工作。
这个模式最早由 OpenAI 在 2024 年 10 月发布的实验性框架 Swarm 中提出并演示,后来被正式纳入 OpenAI Agents SDK(Swarm 的生产级升级版),Microsoft AutoGen、Semantic Kernel 等主流框架也都支持了这一模式。Handoff 在多 Agent 体系中的定位是对等分工型协作——每个 Agent 是平等的专家,通过主动移交而非中央调度来完成协作。
一句话概括:Agent 判断自己搞不定时,把"话筒"和"笔记本"一起递给更合适的 Agent。
Handoff 模式由四个核心模块协作运转:
| 模块 | 作用 | 与其他模块的关系 |
|---|---|---|
| 能力评估 | 判断当前任务是否在自己的专业范围内 | 评估结果决定是否触发路由选择 |
| 路由选择 | 从候选 Agent 中选出最合适的接手者 | 依赖能力评估的结果,驱动上下文打包 |
| 上下文打包 | 把对话历史、已收集信息、推理过程打包传递 | 为新 Agent 接管提供完整背景 |
| 控制权转移 | 把"活跃 Agent"身份切换到目标 Agent | 新 Agent 基于上下文包开始处理 |
每个 Agent 都有明确的专业范围(比如"订单查询""退货处理""库存管理")。当接收到用户请求时,Agent 需要判断:这个任务我能不能处理?
判断依据通常包括:
如果判断结果是"我搞不定"或"我只能搞定一部分",就进入下一个模块。
确定要移交之后,需要选出最合适的目标 Agent。选择方式有三种常见做法:
这是 Handoff 区别于普通"转接电话"的关键。移交时不是只把用户的问题丢过去,而是把完整的信息包一起传递,通常包含:
系统把"当前活跃 Agent"切换为目标 Agent。在 OpenAI Agents SDK 中,这通过一个特殊的工具调用实现——Agent 调用 handoff() 函数,框架自动完成切换。新 Agent 成为对话的主角,可以继续回复用户或进一步调用自己的工具。
流程说明:
循环终止条件:
用户问:"我昨天下的订单一直没收到,想退货,但这个产品快缺货了,能不能帮我预留一个新的?"
第 1 阶段 —— 订单 Agent 处理
第 2 阶段 —— 退货 Agent 处理
第 3 阶段 —— 销售 Agent 完成
三次移交,三个 Agent 各做自己擅长的事,用户全程只提了一个问题。
以下基于 OpenAI Agents SDK 展示 Handoff 的核心用法(基于 openai-agents 0.0.7+ 验证,截至 2025-03):
# 环境准备:
# pip install openai-agents
# export OPENAI_API_KEY="your-api-key"
from agents import Agent, Runner, handoff, function_tool
# 定义各 Agent 的专用工具
@function_tool
def search_order(order_id: str) -> str:
"""根据订单号查询订单状态"""
return f"订单 {order_id}: 已发货,在途中,预计明天送达"
@function_tool
def process_refund(order_id: str, reason: str) -> str:
"""处理退货申请"""
return f"退货已受理,退货单号 RMA-{order_id},退款 7 个工作日内到账"
@function_tool
def reserve_inventory(product_name: str) -> str:
"""为客户预留库存"""
return f"已为您预留 {product_name},预留有效期 30 天"
# 先声明 Agent(解决循环引用)
sales_agent = Agent(
name="SalesAgent",
instructions="你是库存管理专家,负责产品预留和库存查询。",
tools=[reserve_inventory],
)
refund_agent = Agent(
name="RefundAgent",
instructions="你是退货专家,负责退货申请。如果用户还需要预留新货,移交给 SalesAgent。",
tools=[process_refund],
handoffs=[handoff(sales_agent)], # 声明可以移交给 sales_agent
)
order_agent = Agent(
name="OrderAgent",
instructions="你是订单查询专家。如果用户需要退货,移交给 RefundAgent。",
tools=[search_order],
handoffs=[handoff(refund_agent), handoff(sales_agent)],
)
# 运行
result = Runner.run_sync(
order_agent,
"我昨天下的订单没收到,想退货,能帮我预留个新的吗?"
)
print(result.final_output)
代码结构对应 Handoff 的四个核心模块:每个 Agent 的 instructions 定义了能力边界(能力评估),handoffs 参数声明了可移交的目标(路由选择),框架自动处理上下文传递和控制权切换。开发者只需定义"谁能做什么"和"可以交给谁",运行时的移交决策由 LLM 根据 instructions 自主完成。
| 优势 | 劣势 |
|---|---|
| 上下文完整传递,用户不需要重复提问 | 需要预先定义好每个 Agent 的能力边界 |
| 每个 Agent 专注自己的领域,易于维护和扩展 | 每次移交增加延迟(上下文打包 + 新 Agent 理解) |
| 路由可以动态决策,灵活适应不同场景 | 能力边界重叠时容易选错目标 Agent |
| 添加新 Agent 只需定义能力和移交规则 | 多步移交的调试排查比较困难 |
边界说明:Handoff 的优势在任务有明确分工边界时最明显。如果 Agent 之间的职责划分模糊,移交决策的准确性会显著下降。
| 对比维度 | Handoff(任务移交) | Master-Worker(主从调度) | Group Chat(群聊协作) |
|---|---|---|---|
| 控制方式 | 分布式,Agent 自主决定移交 | 集中式,Master 统一调度 | 自组织,无明确中央控制 |
| 信息流向 | 单向链式传递 | 星形(Master ↔ 各 Worker) | 广播式,所有人可见 |
| 适用流程 | 线性/树形任务流 | 需要全局规划的复杂任务 | 开放式讨论、创意协作 |
| 上下文传递 | 显式打包,精准传递 | Master 集中维护 | 共享对话历史 |
| 扩展新 Agent | 定义能力 + 移交规则即可 | 需要更新 Master 的调度逻辑 | 直接加入群聊 |
选择建议:
| 常见误区 | 正确理解 |
|---|---|
| Handoff 就是"把其他 Agent 当工具调用" | 工具调用中被调用者是辅助角色,结果返回给调用者。Handoff 是转交控制权,新 Agent 成为对话主角,两者的权力结构完全不同 |
| 移交后原 Agent 就"消失"了 | 原 Agent 的工作成果(查到的信息、推理结论)通过上下文包传递给了新 Agent,实际上两者通过上下文实现了协作 |
| 路由规则越详细越好 | 规则应简洁清晰。过度详细的规则容易冲突、难以维护。更好的做法是定义几条核心规则,灰色地带让 LLM 自主判断 |
参考答案:
核心区别在于控制权归属。工具调用模式中,调用者始终是主角,被调用的 Agent 只是提供一个结果然后退出,对话继续由调用者主导。Handoff 模式中,控制权完整转移给了新 Agent,新 Agent 成为对话的主角,可以自主决策、调用自己的工具、甚至再次移交。打个比方:工具调用像"打电话咨询",Handoff 像"把整个案子移交给另一个人全权处理"。
参考答案:
上下文包至少应包含:(1) 完整的对话历史;(2) 前一个 Agent 已收集的事实信息(如订单号、查询结果);(3) 前一个 Agent 的推理过程和移交原因。
只传原始问题的话,新 Agent 不知道前面已经做过什么,可能重复查询、遗漏已知信息,导致效率下降和用户体验变差。完整的上下文包让新 Agent 能"接着做"而不是"从头做"。
参考答案:
当任务需要全局规划和统筹协调时。例如,一个复杂的项目管理任务需要同时考虑资源分配、时间排期、风险评估等多个维度,这些子任务之间有复杂的依赖关系。Handoff 的链式移交缺乏全局视角,每个 Agent 只看到自己这一段,容易出现局部合理但整体不优的结果。Master-Worker 由一个 Master 统筹全局,能更好地协调各子任务的执行顺序和资源分配。
优先展示同分类且标签更接近的内容,方便继续串联学习。
根据任务特征选择最合适的 Agent 设计模式,避免过度设计或能力不足
多个 Agent 对同一问题各自作答、互相质证,通过多轮辩论逼近更可靠答案的协作模式。
多层级 Agent 树状组织,通过逐层委托实现大规模任务的分解与协调。