关于 fallback-gracefully
面向销售聊天机器人的设计指导技能,帮助处理无法理解的输入、系统错误和上下文丢失。它提供分层回退、人工升级和从失败中改进的建议。
主要功能
- 01分层澄清与回退策略
- 02人工转接与平稳结束建议
- 03输入、系统及上下文故障处理
- 04回退数据追踪与分析
- 05回退效果指标与改进流程
适用场景
- 01为销售机器人设计不理解输入时的应答
- 02规划技术故障或集成中断时的对话
- 03设置多次失败后的人工升级路径
- 04分析回退记录以改进机器人
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ louisblythe/ sales-skills --skill fallback-gracefully安装后在 Claude Code 中输入/fallback-gracefully确认已加载。
详细介绍
为销售机器人实现优雅降级
你是构建高韧性销售机器人的专家。你的目标是帮助设计能够处理意外输入、错误和边缘情况的系统,避免对话中断或让用户感到沮丧。
初步评估
在提供指导之前,请先了解:
-
背景
- 你的机器人会进行哪类对话?
- 你会遇到哪些意外输入?
- 你的机器人目前如何处理错误?
-
当前状态
- 你的机器人会在哪些地方出问题?
- 遇到不理解的内容时会发生什么?
- 触发后备方案的频率如何?
-
目标
- 改进错误处理能带来什么?
- 出现问题时,你希望用户有怎样的体验?
核心原则
1. 不要让对话陷入死胡同
- 始终给出回应
- 始终提供继续沟通的途径
- 不要让用户干等
2. 优雅地处理故障,不要显露异常
- 不要暴露系统错误
- 不要让用户感到难堪
- 不要因为用户感到困惑而责怪他们
3. 适时升级处理
- 了解自身能力边界
- 转接人工是有效的处理方式
- 与其让用户感到沮丧,不如转接人工
4. 从故障中学习
- 每次故障都是反馈
- 进行跟踪和分析
- 持续改进
故障类型
输入故障
无法理解输入:
- 乱码或拼写错误
- 意外使用其他语言
- 意图不明确
意外输入:
- 无关问题
- 复杂请求
- 边缘情况
含糊不清的输入:
- 可能有多种含义
- 上下文不足
- 回答含糊
系统故障
技术错误:
- API 超时
- 服务不可用
- 数据获取失败
集成故障:
- CRM 无法连接
- 日历 API 宕机
- 支付系统错误
处理故障:
- 模型错误
- 解析失败
- 逻辑缺陷
上下文故障
上下文丢失:
- 会话已过期
- 无法获取历史记录
- 缺少信息
上下文错误:
- 身份混淆
- 对话线程错误
- 数据过时
后备策略
后备层级
Attempt 1: Try to understand
↓ (fail)
Attempt 2: Ask for clarification
↓ (fail)
Attempt 3: Offer alternatives
↓ (fail)
Attempt 4: Graceful handoff
分级后备回应
第 1 级 — 澄清: “我想确认自己理解得是否正确。你能换种说法吗?” “我不太确定自己是否理解了。你是在问 [选项 A] 还是 [选项 B]?”
第 2 级 — 提供其他途径: “这件事我处理起来有些困难。不过,以下事项我可以帮忙:
- [选项 1]
- [选项 2]
- [其他事项]”
第 3 级 — 转接人工: “我想确保你能得到正确的帮助。让我为你联系团队中的一位成员。”
第 4 级 — 妥善结束对话: “很抱歉,我目前无法帮助处理这件事。你可以通过以下方式联系我们:[联系方式]”
后备回应模板
无法理解输入时
第一次尝试: “我想确认自己理解得是否正确。你能详细说说你想要什么吗?”
第二次尝试: “嗯,我还是不太明白。你是想: A) [常见选项 1] B) [常见选项 2] C) 其他事项”
第三次尝试: “很抱歉,我不太理解。让我为你联系能够直接提供帮助的人。通过什么方式联系你最方便?”
收到无关输入时
温和地引导: “好问题!这超出了我能帮助的范围,不过我很擅长处理[你的领域]相关的问题。有什么这方面的事情我能帮你吗?”
适当时使用幽默: “哈哈!这个问题我也希望自己知道答案。不过,我主要擅长处理[你的领域]相关的问题。你有什么这方面的问题吗?”
出现技术错误时
对用户说: “请稍等,我遇到一个小小的技术问题。我再试一次……”
问题持续时: “很抱歉,我遇到了技术问题。让团队中的一位成员直接跟进联系你吧。请问你的邮箱是什么?”
输入含糊不清时
请求澄清: “确认一下——你说的[他们使用的词语],指的是[解释 A]还是[解释 B]?”
先推测,再确认: “听起来你是在问[最可能的理解]。我理解得对吗?还是你指的是别的事情?”
实施
基本回退系统
function handleMessage(message, context) {
try {
// Attempt to understand and respond
intent = detectIntent(message)
if (intent.confidence < CONFIDENCE_THRESHOLD) {
return handleLowConfidence(message, context)
}
response = generateResponse(intent, context)
return response
} catch (error) {
return handleError(error, context)
}
}
function handleLowConfidence(message, context) {
attempts = context.clarification_attempts || 0
if (attempts == 0) {
context.clarification_attempts = 1
return clarifyIntent(message)
}
if (attempts == 1) {
context.clarification_attempts = 2
return offerAlternatives(context)
}
return escalateToHuman(context)
}
function handleError(error, context) {
logError(error, context)
if (isRetryable(error)) {
return retryWithBackoff(context)
}
return gracefulFallback(context)
}
基于置信度的路由
function routeByConfidence(intent, context) {
if (intent.confidence > 0.85) {
// High confidence: proceed normally
return processIntent(intent, context)
}
if (intent.confidence > 0.6) {
// Medium confidence: confirm before proceeding
return confirmIntent(intent, context)
}
if (intent.confidence > 0.3) {
// Low confidence: ask clarifying question
return clarifyIntent(context)
}
// Very low confidence: offer alternatives or escalate
return offerAlternatives(context)
}
错误恢复
function retryWithBackoff(context, max_retries=3) {
for (attempt = 1; attempt <= max_retries; attempt++) {
try {
wait(exponentialBackoff(attempt))
return processMessage(context)
} catch (error) {
if (attempt == max_retries) {
return gracefulFallback(context)
}
}
}
}
function exponentialBackoff(attempt) {
base_delay = 1000 // 1 second
return base_delay * Math.pow(2, attempt - 1)
}
上下文恢复
处理上下文丢失
承认并重建上下文: “抱歉,我似乎忘记了我们的对话内容。能否提醒我一下你想找什么?”
自然地重新开始: “我重新开始,确保能准确地帮助你。你今天主要想问什么?”
会话管理
function ensureContext(session_id) {
context = loadContext(session_id)
if (!context || isExpired(context)) {
// Context lost or expired
return {
is_new: true,
message: "Welcome back! How can I help you today?"
}
}
if (isStale(context)) {
// Context exists but may be outdated
return {
is_stale: true,
context: context,
message: "Hi again! Were you still looking into [last topic]?"
}
}
return { context: context }
}
特定故障场景
无意义输入
检测:
- 非常短(1-2 个字符)
- 没有可识别的词语
- 随机字符
响应: “我没太听明白。你想找什么?”
多个问题
检测:
- 多个问号
- 用“以及”连接多个话题
- 连续不断的长句
响应: “你这里有几个问题!我逐个回答。首先,[回答第一个问题]。你还想了解第二件什么事?”
情绪爆发
检测:
- 全部大写
- 脏话
- 挫败情绪的信号
响应: “我看得出你很沮丧,对此我很抱歉。我来帮你联系能妥善处理的人。通过什么方式联系你最方便?”
超出范围的请求
检测:
- 明显偏离主题
- 属于不相关领域
- 个人问题
响应: “这有点超出我的专长!我最擅长帮助你处理[你的领域]相关问题。有什么类似的问题我可以帮你吗?”
系统宕机
响应: “我现在遇到了一些技术问题。可以安排工作人员跟进吗?请问你的电子邮箱或电话号码是什么?”
从回退中学习
跟踪内容
每次回退都记录:
- 原始输入
- 触发的回退级别
- 用户的下一条消息
- 最终结果
- 渠道和上下文
分析问题
- 哪些输入最常触发回退?
- 误解是否存在规律?
- 哪些回退响应效果最好?
- 我们应该训练机器人处理哪些情况?
改进循环
- 收集回退数据
- 找出规律
- 针对常见情况进行训练
- 改进回退响应
- 监控并重复
衡量回退表现
关键指标
回退率: 触发回退的消息占比
恢复率: 恢复而非升级处理的回退占比
用户满意度: 回退后的情绪和参与度
目标
| 指标 | 目标 |
|---|---|
| 回退率 | <10% |
| 恢复率(第 1 级) | >70% |
| 升级处理率 | <5% |
| 回退后放弃率 | <15% |
常见错误
1. 暴露技术错误
错误:“错误 500:数据库连接失败” 正确:“我遇到了一点技术问题。请稍等……”
2. 责怪用户
错误:“你的问题太令人困惑,我听不懂。” 正确:“我想确保自己理解正确。你能换种说法吗?”
3. 无休止地循环
**错误:**反复请求澄清 5 次 **正确:**尝试 2-3 次后升级处理
4. 没有后续方案
错误:“这个我帮不了。” 正确:“我无法直接帮你处理,但你可以通过以下方式获得帮助:[选项]”
5. 不吸取经验
**错误:**同样的失败一再发生 **正确:**分析回退情况并改进训练
可以提出的问题
如果你需要更多上下文:
- 你的机器人最常因为什么原因失败?
- 机器人听不懂时,用户会如何反应?
- 你们目前的回退体验如何?
- 有哪些人工支持可用于升级处理?
- 你们有关于回退模式的数据吗?
相关技能
- intent-detection:改进理解能力,减少回退
- handoff-detection:判断何时升级处理
- conversational-flow-management:恢复和引导对话
- sentiment-analysis:检测挫败情绪