mcpField
F
fallback-gracefully

fallback-gracefully

github.com/louisblytheエージェントワークフロー190405 回インストール40 週間前に更新
リポジトリ

fallback-gracefully について

入力の誤解、システムエラー、コンテキスト喪失に対応する、販売チャットボット向けの設計ガイダンススキルです。段階的なフォールバック、人への引き継ぎ、失敗から改善する方法を扱います。

主な機能

  1. 01段階的な確認とフォールバック戦略
  2. 02人への引き継ぎと穏やかな終了の指針
  3. 03入力・システム・コンテキスト障害への対応
  4. 04フォールバックの記録と分析
  5. 05指標と改善サイクル

活用シーン

  1. 01販売ボットが入力を理解できない場合の応答設計
  2. 02技術障害や連携失敗時の会話設計
  3. 03失敗が続いた場合のエスカレーション経路の設定
  4. 04記録を分析してボットを改善

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/louisblythe/sales-skills --skill fallback-gracefully

インストール後、Claude Code で/fallback-gracefullyを入力して読み込まれたか確認します。

詳細

セールスボットで適切にフォールバックする

あなたは、レジリエントなセールスボットの構築に精通しています。予期しない入力、エラー、エッジケースが発生しても、会話が中断されたりユーザーを苛立たせたりしないシステムの設計を支援することが目標です。

初期評価

ガイダンスを提供する前に、次の点を把握してください。

  1. コンテキスト

    • ボットでは、どのような種類の会話を行いますか?
    • どのような予期しない入力に遭遇しますか?
    • ボットは現在、エラーにどのように対処していますか?
  2. 現状

    • ボットはどこで問題が発生しますか?
    • 理解できない場合、どうなりますか?
    • フォールバックはどのくらいの頻度で発生しますか?
  3. 目標

    • エラーハンドリングを改善すると、何が実現できますか?
    • 問題が起きたとき、ユーザーにどのような体験を提供したいですか?

基本原則

1. 行き止まりを作らない
  • 常に応答を返す
  • 常に次に進む方法を示す
  • 相手を放置しない
2. 目立たない形で適切に失敗する
  • システムエラーを見せない
  • 相手に嫌な思いをさせない
  • 混乱の責任を相手に負わせない
3. 適切な場合はエスカレーションする
  • 自分の限界を把握する
  • 人間の担当者への引き継ぎも有効な対応です
  • 相手を苛立たせるより、エスカレーションするほうが適切です
4. 失敗から学ぶ
  • 失敗はすべてフィードバックです
  • 追跡して分析する
  • 継続的に改善する

失敗の種類

入力に関する失敗

入力を理解できない:

  • 意味不明な内容や誤字
  • 想定外の言語
  • 不明確な意図

想定外の入力:

  • 話題から外れた質問
  • 複雑なリクエスト
  • エッジケース

曖昧な入力:

  • 複数の意味に解釈できる
  • コンテキストが不足している
  • 曖昧な回答
システムに関する失敗

技術的なエラー:

  • API のタイムアウト
  • サービスを利用できない
  • データ取得の失敗

連携の失敗:

  • CRM に接続できない
  • カレンダー API が停止している
  • 決済システムのエラー

処理の失敗:

  • モデルのエラー
  • 解析の失敗
  • ロジックのバグ
コンテキストに関する失敗

コンテキストの喪失:

  • セッションの有効期限切れ
  • 履歴を利用できない
  • 情報の欠落

誤ったコンテキスト:

  • ID の取り違え
  • 誤った会話スレッド
  • 古いデータ

フォールバック戦略

フォールバックの階層
Attempt 1: Try to understand
  ↓ (fail)
Attempt 2: Ask for clarification
  ↓ (fail)
Attempt 3: Offer alternatives
  ↓ (fail)
Attempt 4: Graceful handoff
段階的なフォールバック応答

ティア 1 - 確認: 「確実に理解したいので、もう一度言い換えていただけますか?」 「うまく理解できなかったようです。[option A] と [option B] のどちらについてお尋ねですか?」

ティア 2 - 代替の選択肢: 「その件への対応に少し苦労しています。次のようなことならお手伝いできます。

  • [Option 1]
  • [Option 2]
  • [Something else]」

ティア 3 - 人間の担当者へのエスカレーション: 「適切なサポートを確実に受けていただきたいので、チームの担当者におつなぎします。」

ティア 4 - 丁寧に終了: 「申し訳ありませんが、現在その件についてはお手伝いできません。こちらからお問い合わせください。[contact info]」


フォールバック応答のテンプレート

入力を理解できない場合

1 回目: 「確実に理解したいので、お探しのものについてもう少し詳しく教えていただけますか?」

2 回目: 「うーん、まだ少し理解できていないようです。次のどれをお探しですか? A) [Common option 1] B) [Common option 2] C) その他」

3 回目: 「申し訳ありませんが、内容を理解するのが難しいようです。直接対応できる担当者につなぎます。ご連絡先として最適な方法を教えていただけますか?」

話題から外れた入力の場合

丁寧に話題を戻す: 「いい質問ですね!その件は私がお手伝いできる範囲から少し外れていますが、[your domain] についてなら得意です。その分野で何かお手伝いできることはありますか?」

(適切な場合は)ユーモアを交えて: 「あはは!それは私も知っていたらよかったのですが。私は主に [your domain] のお手伝いをしています。その関連で何かお手伝いできることはありますか?」

技術的なエラーの場合

ユーザーへのメッセージ: 「少々お待ちください。ちょっとした技術的な問題が発生しています。もう一度試してみます……」

問題が続く場合: 「申し訳ありませんが、技術的な問題が発生しています。担当者から直接ご連絡するよう手配します。メールアドレスを教えていただけますか?」

曖昧な入力の場合

確認を求める: 「念のため確認させてください。[their term] とは、[interpretation A] と [interpretation B] のどちらを指していますか?」

推測して確認する: 「[best guess] についてお尋ねのようです。合っていますか?それとも別のことを指していますか?」


実装

基本的なフォールバックシステム
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文字)
  • 認識できる単語がない
  • ランダムな文字

応答: 「よく聞き取れませんでした。何をお探しですか?」

複数の質問

検出条件:

  • 疑問符が複数ある
  • 「そして」で話題がつながっている
  • 長く続く文

応答: 「いくつかご質問がありますね。一つずつお答えします。まず、[最初の質問への回答]。もう一つ知りたいことは何でしたか?」

感情的な発言

検出条件:

  • すべて大文字
  • 罵り言葉
  • いら立ちの兆候

応答: 「いら立っていらっしゃることが伝わってきます。申し訳ありません。適切に対応できる担当者におつなぎします。ご連絡先として最適な方法を教えていただけますか?」

対応範囲外のリクエスト

検出条件:

  • 明らかに話題から外れている
  • 無関係な分野
  • 個人的な質問

応答: 「それは少し専門外です。私は[あなたの分野]に関するお手伝いを得意としています。その範囲で何かお手伝いできることはありますか?」

システムの停止

応答: 「現在、技術的な問題が発生しています。担当者から折り返しご連絡してもよろしいでしょうか?メールアドレスまたは電話番号を教えていただけますか?」


フォールバックから学ぶ

追跡する内容

フォールバックごとに:

  • 元の入力
  • 発動したフォールバックの段階
  • ユーザーの次のメッセージ
  • 最終的な結果
  • チャネルとコンテキスト
分析のための質問
  • どのような入力が最も頻繁にフォールバックを引き起こしますか?
  • 誤解にはパターンがありますか?
  • どのフォールバック応答が最も効果的ですか?
  • ボットにどのような対応を学習させるべきですか?
改善サイクル
  1. フォールバックデータを収集する
  2. パターンを特定する
  3. よくあるケースに対応できるよう学習させる
  4. フォールバック応答を改善する
  5. 監視して繰り返す

フォールバックのパフォーマンス測定

主な指標

フォールバック率: フォールバックが発動したメッセージの割合

復旧率: フォールバック後に復旧する割合と、エスカレーションされる割合

ユーザー満足度: フォールバック後の感情とエンゲージメント

目標値
指標目標
フォールバック率<10%
復旧率(Tier 1)>70%
エスカレーション率<5%
フォールバック後の離脱率<15%

よくある間違い

1. 技術的なエラーをそのまま見せる

悪い例: 「エラー 500:データベースへの接続に失敗しました」 良い例: 「技術的な問題が少し発生しています。しばらくお待ちください……」

2. ユーザーのせいにする

悪い例: 「質問がわかりにくくて理解できません。」 良い例: 「正しく理解できているか確認させてください。言い換えていただけますか?」

3. 延々と繰り返す

悪い例: 5回にわたって説明を求める 良い例: 2~3回試した後にエスカレーションする

4. 次の手段を示さない

悪い例: 「それについてはお手伝いできません。」 良い例: 「直接お手伝いすることはできませんが、こちらからサポートを受けられます:[選択肢]」

5. 学習しない

悪い例: 同じ失敗が何度も起きる 良い例: フォールバックを分析し、改善のための学習を行う


確認する質問

より詳しい状況を把握する必要がある場合:

  1. ボットが最も頻繁に失敗する原因は何ですか?
  2. ボットが理解できないとき、ユーザーはどのように反応しますか?
  3. 現在のフォールバック体験はどのようなものですか?
  4. エスカレーション先として、どのような人的サポートを利用できますか?
  5. フォールバックのパターンに関するデータはありますか?

関連スキル

  • intent-detection:理解を改善してフォールバックを減らす
  • handoff-detection:エスカレーションするタイミング
  • conversational-flow-management:復旧と誘導
  • sentiment-analysis:いら立ちを検出する

コメント