🤝 Agent Handoff(智能体交接)
当AI说"这事儿我搞不定,叫人来吧"的时候——这就是交接的艺术。
凌晨3点17分,客服Agent已经尽力了。用户的问题是:"你们的产品和我奶奶的老式收音机兼容吗?"Agent搜索了知识库、查了规格表、甚至尝试了模糊匹配,但答案就是没有。
这时候,Agent做了一个聪明的决定:"我帮您转接到人工客服,他们更懂这个。"
但交接不是简单地说"再见"。好的交接就像医院换班——前一班医生要把病人的所有情况交代清楚,下一班医生才能无缝接手。这就是Agent Handoff的核心。
什么是Agent Handoff?
Agent Handoff(智能体交接)是指当Agent无法或不宜继续处理任务时,将任务连同上下文信息优雅地转移给人类或其他Agent的过程。它涉及状态保存、上下文传递、责任转移三个核心环节。
三种交接场景
1. Agent → Human(人机交接)
最常见场景:AI遇到无法处理的复杂问题、情感敏感话题、或需要人工决策的情况。
handoff:
triggers:
- type: sentiment_low
threshold: "negative"
- type: loop_detected
max_iterations: 3
- type: keyword
patterns: ["人工客服", "投诉", "退款"]
- type: confidence
threshold: 0.6
target: human_queue
context_transfer: full
2. Agent → Agent(智能体间交接)
专业分工:通用Agent识别任务类型后,转交给专业Agent处理。
agents:
name: dispatcher
role: 路由分发
handoff_rules:
- condition: "${task.type == 'code'}"
target: coding_agent
- condition: "${task.type == 'search'}"
target: search_agent
- condition: "${task.type == 'math'}"
target: math_agent
3. Human → Agent(人工转智能体)
反向交接:人工处理完高优先级问题后,将后续交回Agent处理标准化流程。
交接时需要传递什么?
📋 必须传递
- 对话历史(完整或摘要)
- 用户意图识别结果
- 当前任务状态
- 已尝试的解决方案
🎁 建议传递
- 用户情绪状态
- 等待时间统计
- 问题优先级
- 个性化信息(用户偏好等)
OpenClaw Handoff 实战
{
"type": "handoff",
"from": {
"agent_id": "customer_service_001",
"reason": "sentiment_below_threshold",
"confidence": 0.45
},
"context": {
"conversation_summary": "用户询问退款政策,情绪逐渐消极...",
"attempts": ["FAQ查询", "工单搜索"],
"user_sentiment": "frustrated",
"wait_time_seconds": 127
},
"target": "human_support_tier2",
"priority": "high"
}
交接触发的判断逻辑
好的Handoff不是"放弃",而是"知止"。以下情况应该考虑交接:
- 置信度阈值 - 当Agent对回答的置信度低于设定值(如0.6)
- 循环检测 - 同一问题尝试多次无进展
- 情感分析 - 用户情绪变为负面或愤怒
- 关键词触发 - 用户明确要求人工服务
- 业务规则 - 特定场景(如投诉、退款、法律问题)强制转人工
- 超时机制 - 任务处理时间超过阈值
常见陷阱
交接时的坑:
- 🚫 上下文丢失 - 用户重复说一遍问题,体验极差
- 🚫 无限交接 - Agent A转B,B转C,C又转回A
- 🚫 无声消失 - Agent直接"消失",用户一脸懵逼
- 🚫 过度交接 - 遇到一点点困难就甩锅给人工
避免"交接地狱"的模式
handoff_policy:
max_handoffs: 3
on_max_reached: "escalate_to_human"
prevent_loop: true
announce: "正在为您转接专业客服,请稍候..."
最佳实践
- 透明告知 - 明确告诉用户即将交接、为什么交接、等待多久
- 上下文摘要 - 为接收方生成简洁的摘要,不是丢一堆日志
- 优先级队列 - 情绪激动的用户应该优先处理
- 交接回退 - 如果人工服务不可用,要有Plan B
- 数据埋点 - 记录交接原因、耗时、结果,用于优化
实际案例:客服场景
workflow:
name: customer_service_flow
steps:
- agent: intake_bot
on_handoff:
check:
- condition: "${user.sentiment == 'angry'}"
target: human_urgent
message: "检测到您可能有些着急,马上为您接入专属客服"
- condition: "${task.category == 'refund'}"
target: human_refund_team
message: "退款问题将由我们的退款专员处理"
- condition: "${confidence < 0.5}"
target: human_general
message: "这个问题比较复杂,我帮您转接人工客服"
context_package:
- conversation_summary
- user_info
- attempts_made
- sentiment_score