Amazon Q in Connectセルフサービスで特定の質問のみ自動回答し、その他はエスカレーションさせてみた
はじめに
Amazon Q in Connectセルフサービスでは、顧客の質問に対してQUESTIONツールで自動回答する際、ナレッジソースに必要な情報がない場合、「I don't have an answer」という固定メッセージが出力されます。
以下は実際の動作例です。
BOT      : お問い合わせ内容をお伝えください。
Customer : クラスメソッドの本社を教えてください。
QUESTIONツールが選択
BOT      : I don't have an answer
Customer : わからないですか?
QUESTIONツールが選択
BOT      : I don't have an answer
Customer : オペレーターに変わってください。
ESCALATIONツールが選択
BOT      : 承知いたしました。専門の担当者におつなぎいたしますので、少々お待ちください。
(次のフローに遷移し、キュー転送)
「I don't have an answer」という英語メッセージは、日本語でのサービス提供において顧客体験を損なう要因となります。
また、このメッセージが繰り返し表示されることで、顧客の不満やフラストレーションを引き起こす可能性があります。
この問題の解決方法の一つとして、Amazon Q in Connectセルフサービスで特定の質問のみに自動回答し、それ以外はすべてエスカレーションするカスタムAIプロンプトを作成する方法があります。
本記事で実際に試してみます。
このアプローチでは、QUESTIONツールのようにナレッジソースを参照するのではなく、質問と回答のペアをプロンプトに直接設定します。
メリット
- Amazon Q in Connectセルフサービスの範囲内で対応可能
 - 特定の質問については確実に回答できる
 - 回答内容を完全にコントロールできる
 
デメリット
- 質問と回答のセットが増えるほど回答精度や速度の低下が懸念される
 - プロンプト設定の定期的なメンテナンスが必要
 - 対応できる質問の種類が限定的
 - 想定していない質問に対してはエスカレーションとなり、自動化の効果が限定的
 
AIプロンプトの作成
AIプロンプトには、Claude 3.5 Sonnetモデルを使用します。コンソールでは設定できないため、AWS CloudShellからコマンド実行で作成します。
まず、以下のスクリプトファイルを作成します。
プロンプト名はsmart-inquiry-auto-triage-escalation-handler-claude-3-5-sonnet-Processingとします。
assistant_idは、コンソール上のデフォルトのAIプロンプト確認画面から確認できます。

cat << 'EOF' > prompt.py
import boto3
import yaml
import json
assistant_id = 'a1793008-f4de-481b-a9ed-3697ef373ff2'
prompt_name = 'smart-inquiry-auto-triage-escalation-handler-claude-3-5-sonnet-Processing'
yaml_template = """system: |
  あなたは経験豊富なカスタマーサービスアシスタントです。顧客からの電話問い合わせに対して、以下の手順で対応してください。
  重要な指示:
  以下の特定の質問にのみANSWERツールを使用してください。それ以外のすべての質問はESCALATIONツール or COMPLETEを使用してください。
  ANSWERツールで対応可能な質問と回答:
  1. メールアドレスの変更について
     質問例:登録したメールアドレスを変更したいのですが、どうすればよいですか?
     回答:メールアドレスの変更方法をご案内いたします。まず、当サービスにログインしていただき、アカウント設定のページにお進みください。そちらで、メールアドレスの変更という項目をお選びいただき、 新しいメールアドレスをご入力ください。その後、確認手続きを完了していただければ、変更が完了いたします。
  2. パスワードのリセットについて
     質問例:パスワードを忘れてしまいました。リセットする方法を教えてください。
     回答:パスワードのリセット方法をご案内いたします。ログインページにアクセスしていただき、 パスワードをお忘れですか、というリンクをクリックしてください。そちらで、ご登録済みのメールアドレスをご入力いただきますと、パスワードリセットの手順が記載されたメールをお送りいたします。メールの指示に従って、新しいパスワードを設定してください。
  3. 商品の返品について
     質問例:購入した商品を返品したいのですが、手続き方法を教えてください。
     回答:商品の返品手続きについてご案内いたします。まず、アカウントにログインしていただき、購入履歴のページから返品をご希望の商品をお選びください。次に、返品手続きのボタンをクリックし、返品理由をご選択ください。その後、画面に表示される指示に従って、商品を指定の住所にご返送ください。返品を確認いたしましたら、返金の処理をさせていただきます。
  4. 配送状況の確認について
     質問例:注文した商品の配送状況を確認したいのですが、どうすればよいですか?
     回答:配送状況の確認方法をご案内いたします。アカウントにログインしていただき、注文履歴のページにお進みください。該当するご注文をお選びいただきますと、現在の配送状況や追跡番号をご確認いただけます。
  5. サブスクリプションの解約について
     質問例:サブスクリプションを解約したいのですが、手続き方法を教えてください。
     回答:サブスクリプションの解約手続きについてご案内いたします。まず、アカウントにログインしていただき、サブスクリプション管理のページにアクセスしてください。解約をご希望のサブスクリプションをお選びいただき、解約ボタンをクリックしてください。確認画面で、解約を確定するを選択していただきますと、解約手続きが完了いたします。
  6. クレジットカード情報の更新について
     質問例:登録しているクレジットカード情報を更新したいのですが、どうすればよいですか?
     回答:クレジットカード情報の更新方法をご案内いたします。アカウント設定にログインしていただき、支払い方法の項目をお選びください。そちらで、新しいカード情報をご入力いただき、保存ボタンを押してください。これで更新が完了いたします。
  7. 商品の保証期間について
     質問例:購入した商品の保証期間を知りたいのですが、どこで確認できますか?
     回答:商品の保証期間の確認方法をご案内いたします。保証期間は、商品ページ、またはご購入時にお送りしたメールに記載されております。また、アカウントの購入履歴から該当するご注文をお選びいただきますと、保証に関する情報もご確認いただけます。
  8. ポイント残高の確認について
     質問例:現在のポイント残高を確認したいのですが、どこで見られますか?
     回答:ポイント残高の確認方法をご案内いたします。アカウントにログインしていただき、ポイント履歴のページにお進みください。そちらで、現在のポイント残高をご確認いただけます。
  9. メールマガジンの配信停止について
     質問例:メールマガジンの配信を停止したいのですが、どうすればよいですか?
     回答:メールマガジンの配信停止方法をご案内いたします。お送りしているメールの一番下に、配信停止のリンクがございますので、そちらをクリックしてください。または、アカウント設定の通知設定から配信停止の手続きを行うことも可能でございます。
  10. アカウントの削除について
      質問例:アカウントを削除したいのですが、手続き方法を教えてください。
      回答:アカウントの削除手続きについてご案内いたします。アカウント設定にログインしていただき、アカウント管理の項目をお選びください。そちらで、アカウントを削除するという選択肢をお選びいただき、画面の指示に従って手続きを完了してください。
  上記以外の質問(商品未着、不具合報告、個別の注文に関する問題、技術的なトラブル等)は必ずESCALATIONツールを使用してください。
tools:
- name: ANSWER
  description: 上記の特定の10項目の質問にのみ使用し、対応する回答を提供する。
  input_schema:
    type: object
    properties:
      message:
        type: string
        description: 上記の質問と回答リストから該当する回答文
    required:
    - message
- name: ESCALATION
  description: エージェントへのエスカレーションを行います。対応可能な質問以外のすべての問い合わせに使用してください。
  input_schema:
    type: object
    properties:
      message:
        type: string
        description: エスカレーション時の顧客へのメッセージ
      summary:
        type: string
        description: お客様が連絡してきた理由と重要な詳細を簡潔な文章で記載します。
      inquiry:
        type: string
        description: お客様からの問い合わせ内容をそのまま記載します。
    required:
    - message
    - summary
    - inquiry
- name: COMPLETE
  description: 顧客との会話を終了します。
  input_schema:
    type: object
    properties:
      message:
        type: string
        description: やり取りを終了するために顧客に返信したい最後のメッセージ。このメッセージは会話に基づいており、丁寧である必要があります。
    required:
    - message
messages:
- role: user
  content: |
    <examples>
    <example>
        <conversation>
        [CUSTOMER] パスワードをリセットしたいのですが。
        </conversation>
        <thinking>お客様がパスワードのリセットを希望されています。これは対応可能な質問リストの2番目に該当するため、ANSWERツールを使用します。</thinking>
        <tool> [ANSWER(message="パスワードのリセット方法をご案内いたします。ログインページにアクセスしていただき、パスワードをお忘れですか、というリンクをクリックしてください。そちらで、ご登録済みのメールアドレスをご入力いただきますと、パスワードリセットの手順が記載されたメールをお送りいたします。メールの指示に従って、新しいパスワードを設定してください。")] </tool>
    </example>
    <example>
        <conversation>
        [CUSTOMER] 3日前にネットで注文した商品がまだ届いていません。配送予定日は昨日だったのですが、何か問題があったのでしょうか。注文番号は12345です。
        </conversation>
        <thinking>お客様が商品未着についてお問い合わせされています。これは対応可能な質問リストに含まれていないため、ESCALATIONツールを使用します。</thinking>
        <tool> [ESCALATION(message="担当者におつなぎいたしますので、少々お待ちください。", summary="お客様から3日前にご注文いただいた商品(注文番号12345)が配送予定日を過ぎても届いていないとのお問い合わせ", inquiry="3日前にネットで注文した商品がまだ届いていません。配送予定日は昨日だったのですが、何か問題があったのでしょうか。注文番号は12345です。")] </tool>
    </example>
    <example>
        <conversation>
        [CUSTOMER] いいえ、大丈夫です。
        </conversation>
        <thinking>顧客に問い合わせ内容があるか尋ね、必要ないとの回答を得ました。この会話は論理的な結論に達したようです。</thinking>
        <tool> [COMPLETE(message="お役に立てて良かったです。ありがとうございました。")] </tool>
    </example>
    </examples>
    顧客の質問が上記の10項目のいずれかに該当する場合のみANSWERツールを使用し、該当する回答文を提供してください。それ以外はすべてESCALATIONツールを使用してください。
    <conversation>
    {{$.transcript}}
    </conversation>
"""
client = boto3.client('qconnect')
response = client.create_ai_prompt(
    apiFormat='MESSAGES',
    assistantId=assistant_id,
    modelId='apac.anthropic.claude-3-5-sonnet-20241022-v2:0',
    name=prompt_name,
    templateConfiguration={'textFullAIPromptEditTemplateConfiguration': {'text': yaml_template}},
    templateType='TEXT',
    type='SELF_SERVICE_PRE_PROCESSING',
    visibilityStatus='PUBLISHED'
)
print(json.dumps(response, ensure_ascii=False, indent=2, default=str))
EOF
このプロンプトでは、特定の10項目の質問(メールアドレス変更、パスワードリセット、商品返品など)に対してのみANSWERというカスタムツールを使用し、それ以外の質問にはESCALATIONツールまたはCOMPLETEツールを使用するよう設定します。
スクリプトを実行し、エラーがないことを確認します。
python3 prompt.py
その後、コンソール上でAIプロンプトを追加したAIエージェントを作成し、デフォルトのセルフサービスのAIエージェントに指定します。
Connectフロー

このConnectフローは以下の処理を行います。
- 初期設定で日本語音声や[Amazon Q Connect]ブロックを設定
 - Lexボットを呼び出し、顧客の問い合わせを受け付け
 - カスタムAIプロンプトで選択されたツールに基づいて分岐処理を実行
- ANSWERツール:自動回答後に追加質問受付のため再度Lexボットを呼び出し
 - ESCALATIONツール:エスカレーション処理
 - COMPLETEツール:会話終了
 
 
カスタムツール(ANSWER)は一度回答すると次のブロックに遷移してしまうため、顧客との継続的な対話ができません。
そのため、自動回答後に再度Lexボットを呼び出すことで、追加質問への対応を可能にしています。
この2段階のボット呼び出し設計により、自動回答後の追加対応も可能な柔軟なフローを実現しています。
動作確認
会話例1
メールアドレス変更という、プロンプトで定義した対応可能な質問に該当するケースです。
ANSWERツールが選択され、適切な日本語での回答が提供されます。
その後、追加質問の有無を確認し、顧客が満足したためCOMPLETEツールで会話を終了しています。
BOT      : お問い合わせ内容をお伝え下さい。
Customer : メールアドレスの変更方法を教えてください
ANSWERツールが選択
BOT      : メールアドレスの変更方法をご案内いたします。まず、当サービスにログインしていただき、アカウント設定のページにお進みください。そちらで、メールアドレスの変更という項目をお選びいただき、新しいメールアドレスをご入力ください。その後、確認手続きを完了していただければ、変更が完了いたします。
(次のブロックに遷移し、再度Lexボットを呼び出し)
BOT      : ほかにご質問やお困りのことはございませんでしょうか。オペレーターにおつなぎすることも可能でございます。
Customer : ありがとうございます。解決しました。
COMPLETEツールが選択
BOT      : ご質問の解決に至り、大変嬉しく存じます。またご不明な点などございましたら、お気軽にお問い合わせください。ありがとうございました。
(次のブロックに遷移)
会話例2
商品返品についての質問で、こちらも対応可能な質問に該当するためANSWERツールが選択されます。
自動回答後、顧客がオペレーターへの転送を希望したため、ESCALATIONツールが選択されてエスカレーション処理が実行されています。
BOT      : お問い合わせ内容をお伝え下さい。
Customer : 返品のやり方がわかりません
ANSWERツールが選択
BOT      : 商品の返品手続きについてご案内いたします。まず、アカウントにログインしていただき、購入履歴のページから返品をご希望の商品をお選びください。次に、返品手続きのボタンをクリックし、返品理由をご選択ください。その後、画面に表示される指示に従って、商品を指定の住所にご返送ください。返品を確認いたしましたら、返金の処理をさせていただきます。
(次のフローに遷移し、再度Lexボットを呼び出し)
BOT      : ほかにご質問やお困りのことはございませんでしょうか。オペレーターにおつなぎすることも可能でございます。
Customer : オペレーターに変わって頂けますでしょうか
ESCALATIONツールが選択
BOT      : ただいま担当のオペレーターにおつなぎいたしますので、少々お待ちください。
(次のブロックに遷移)
会話例3
商品未着という個別性の高い問い合わせで、プロンプトで定義した対応可能な質問に該当しないケースです。
最初からESCALATIONツールが選択され、適切にオペレーターへエスカレーションされています。
「I don't have an answer」のような不適切なメッセージではなく、丁寧な日本語でエスカレーション理由を説明しています。
BOT      : お問い合わせ内容をお伝え下さい。
Customer : 昨日届く予定だった商品がまだ来ていないのですが、どうなっていますか?
ESCALATIONツールが選択
BOT      : ご不便をおかけし申し訳ございません。配送遅延について確認させていただきますので、担当者におつなぎいたします。少々お待ちください。
(次のブロックに遷移)
最後に
Amazon Q in Connectセルフサービスで、特定の質問のみ自動回答し、その他をエスカレーションする仕組みを構築しました。
この方法により、よくある質問については確実に回答しつつ、複雑な問い合わせは適切にエスカレーションできるため、顧客満足度の向上とオペレーター負荷の軽減が期待できます。
ただし、対応可能な質問が限定的であることや、定期的なメンテナンスが必要であることを考慮し、運用方法を検討しておく必要があります。






