Amazon Web Services ブログ

Amazon Lex を使用してモバイル加入者に自然で効率的なカスタマーサービス体験を提供する

この投稿は、”Deliver natural and efficient customer service experiences to mobile subscribers with Amazon Lex” を翻訳したものです

携帯キャリアプロバイダーは、毎日大量のカスタマーサービスコールを対応しています。 急速に進化するネットワークテクノロジーとデバイスの革新は、顧客の期待を変化させています。 迅速なやり取りで顧客を喜ばせることは、カスタマーエクスペリエンス戦略を成功させるために重要です。 モバイル加入者は、新しい SIM カードの作成、プランの変更、支払い期限の確認、サービスのキャンセル、端末の登録、SIM ロックの解除など、いくつかの理由でカスタマーサポートに連絡します。 これらの加入者のニーズを満たすために、プロバイダーは、自動化によって通信の効率と品質を向上させながら、複数のチャネルにわたって顧客サービスを拡大する必要があります。

この投稿では、Amazon Lex で構築済みのソリューションを使用して、SIM カードの発行、料金の支払い、盗難・紛失の報告などのために、顧客とのやり取りを自動化する方法を確認します。これにより、自然で効率的な顧客体験を提供できます。

ソリューション概要

Amazon Lex は、音声をテキストに変換するための自動音声認識 (ASR) と、テキストの意図を認識する自然言語理解 (NLU) の高度な深層学習機能を提供します。これにより、非常に魅力的な顧客体験と、リアルな会話型インタラクションを備えたアプリケーションを構築できます。Amazon Lex for telecom は、サービスデリバリモデルを最適化し、新しいコミュニケーションとメディアテクノロジーを顧客が利用できるようにしながら、自然な会話体験を提供できるように構築済みのソリューションを提供します。構築済みのボットは、モバイルサービスのユースケース向けのインテント、サンプル発話、スロットタイプで構成され、Amazon Connect の問い合わせフローと統合されています。

構築済みのソリューションにあるさまざまなコンポーネントを取り上げながら、新しい SIM カードのリクエストに関する会話の例を見てみましょう。

エージェント:ABC モバイルにお電話いただきありがとうございます。ご用件をお伺いします。

顧客:SIM カードを再発行したい。

エージェント:電話番号 1234567891 からお電話をいただいているようです。この電話番号の SIM カードを再発行しますか。

顧客:はい

エージェント:確認のため、パスコードをご入力ください。

顧客:123456

エージェント:次に進むために、ワンタイム PIN を電話番号 1234567891 に送信する必要がございます。先に進んで送信しますか?

顧客:はい

エージェント:送信しました。受信したワンタイムPINをご入力ください。

顧客:1234

エージェント:ご確認ありがとうございます。電話番号 1234567891 の新しい SIM を発行しますか?

顧客:はい

エージェント:承りました。新しい SIM カードは、登録された住所に 4 〜 6 営業日で届きます。

顧客:ありがとう

この会話では、顧客は新しい SIM カードを要求したいと考えています。 エージェントは検証のためにパスコードを取得してから、SIM カードの再発行を開始します。

構築済みのソリューションには、認証用のボットと、会話を自動化するために Amazon Lex にデプロイできるモバイルサービスが含まれています。 MobileServicesBot には、新しい SIM カードの発行、プランの変更、請求書の取得、サービスのキャンセル、新しいサービスの登録、端末のアクティベート、番号の変更など、一般的なモバイルサービスアクティビティのインテントが含まれています。 具体的には、次のインテントが含まれます。

  • RequestNewSim – 顧客情報を収集し、新しい SIM カードの発行を行う。
  • AddNewLine – 顧客情報を収集し、新しい端末を登録する。
  • ReportLostDevice – 顧客情報を取得し、盗難・紛失した端末の報告を受けて、サービスを一時停止する。
  • CheckDuePayment – 顧客情報を取得し、顧客に支払い情報を提供する。
  • MakePayment – 支払い金額、クレジットカード、電子小切手の詳細などの情報を取得し、支払いを処理する。
  • FindAStore – 郵便番号を取得し、最寄りの店舗を検索する。
  • EndConversation – 「ありがとう、以上」などのユーザー入力に基づいて会話を終了する。
  • Fallback – 入力が設定されたインテントのいずれにも一致しない場合に呼び出される。

ボットの定義には、会話を管理するためのプロンプトとともに、完全な会話も含まれています。各ボットは、ビジネスロジックをシミュレートするコードを含む AWS Lambda 関数とも統合されています。 Amazon Kendra との統合により、会話中に自然言語の質問に答えることができます。

ソリューションアーキテクチャ

ソリューションの全体的なアーキテクチャを確認しましょう(次の図を参照)。

  • Amazon Lex ボットを使用して、顧客の認証、トランザクションの処理(「新しい端末を登録」など)、またはリクエストされた情報の発信者への提供(「支払い金額はいくらですか?」など)を行います。
  • AWS Lambda を使用して、バックエンドシステムへのアクセスをシミュレートし、トランザクションを完了するために必要なビジネスロジックを実行します。この投稿では、使用されるデータは Amazon DynamoDB に保存されます。
  • 顧客の質問に答えるために、ボットが情報を検索して応答できるように Amazon Kendra の検索インデックスを設定しています。
  • 構築済みのソリューションを Amazon Connect インスタンスにデプロイするか、ウェブサイトと統合することができます。

この投稿には、AWS リソースと、必要な AWS Identity and Access Management (IAM) ロールを含む AWS CloudFormation スタックを作成するテンプレートが含まれています。これらのリソースを利用することで、 Amazon Connect チャネルでモバイルサービス用の構築済みのソリューションを使用できます。

前提条件

ソリューションをデプロイする前に、次の前提条件が必要です。

  • AWSアカウント
  • 次のAWSサービスへのアクセス権限:
    • Amazon Lex:ボットを作成
    • Lambda:ビジネスロジック
    • DynamoDB:テーブルを作成
    • IAM: ポリシーとロールを作成する権限
    • AWS CloudFormation:スタックを実行
  • オプションとして、Amazon Connectインスタンス(Amazon Connectにデプロイする場合)

構築済みのソリューションをデプロイする

次の手順でソリューションをデプロイします。

  1. Launch Stack をクリックして、選択したリージョンで AWS CloudFormation スタックの作成を起動します。

    スタックの名前 に、スタックの名前を入力します。この投稿では、次のスクリーンショットに示すように、 mobile-services-solution という名前を使用します。
  2. パラメータ セクションで、Amazon Lex ボット、DynamoDB テーブルの名前、および Amazon Connect インスタンスのARNを入力します。
  3. IAM リソースの作成を承認し、スタックの作成 をクリックします。数分後、スタックの作成は完了するはずです。作成されるコアリソースは以下のようになります。
    • Amazon Lex ボット – TelecomMobileTelecomMobileAuthentication
    • Lambda ファンクション – TelecomMobileFunctionTelecomMobileAuthenticationFunction
    • DynamoDB – telecom_mobile_table
    • Amazon Connect 問い合わせフロー – TelecomMobileContactFlow
    • IAM ロール – LexRole, LexImportRole, LambdaRole, ConnectRole
  4. スタックの作成中に Connect の ARN を指定した場合、Amazon Connect ダッシュボードに移動し、ナビゲーションペインの ルーティング メニューで 電話番号 を選択します。
  5. 次に、電話番号をモバイルサービスの問い合わせフローに関連付けます。

    電話番号が関連付けられると、ソリューションをテストする準備が整います。

ソリューションをテストする

サンプルデータを使用してボットをテストできます。Amazon Connect インスタンスにデプロイした場合、Amazon Connect の電話番号に電話をかけることで、ボットとやり取りすることができます。音声またはテキストを使用して、Amazon Lex V2 コンソールでソリューションを直接テストすることもできます。事前に構築された会話フローを試した後は、ボットをカスタマイズし、必要に応じてインテントを追加し、他のバックエンドシステムと統合できます。

モバイルサービス:主な機能

バックエンドシステムのデータ検証や問い合わせフローなど、構築済みのソリューションによって提供されるいくつの機能を見ていきましょう。

ユーザー入力を検証する

エージェントは、登録済みの社会保障番号 (SSN) の最後 4 桁、またはパスコードを確認することにより、顧客を認証します。 この検証が失敗した場合、エージェントは顧客に情報を再度提供するように要求します。 構築済みのソリューションは、バックエンドシステムに保存されている情報を使用して検証を実行する Lambda 関数を提供します。 さらに、事前に構築されたソリューションは、認証の試行回数を制限するロジックを提供します。顧客が誤った情報を3回入力すると、ボットは通話を終了します。

次のコードは、アカウント情報を使用してユーザーの入力を検証する方法を示しています。

phone_number = dialog.get_slot('PhoneNumber', intent)
zip_code = dialog.get_slot('Zipcode', intent)

status, customer_id = mobile_system.get_customer_id(phone_number, zip_code)

if status == 'INVALID':
    # unauthorized user
    …
    …
else:
    # proceed with authentication fulfillment
    …
    …

次のコードは、セッション属性を使用して試行回数を制限する方法を示しています。

number_of_attempts = number_of_attempts + 1
dialog.set_session_attribute(
  intent_request, 'number_of_attempts', str(number_of_attempts))

if status == 'INVALID':
  # unauthorized user
  if number_of_attempts >= 3:
      message = "For your security, we are unable to complete your request, \
                  until you are able to provide required information. Goodbye"
      dialog.set_session_attribute(
        intent_request, 'authentication_status', 'UNAUTHENTICATED')
      return dialog.close(
        active_contexts, session_attributes, intent, 
        [{'contentType': 'PlainText', 'content': message}])

  if number_of_attempts == 1:
      prompt = "I didn't find a match. Please say or enter your phone number. \
                If you need time to get that information, say, wait a moment."
  elif number_of_attempts == 2:
      prompt = "I didn't find a match. Please try one last time. \
              Say or enter your phone number"
      
  return dialog.elicit_slot(
    'PhoneNumber', active_contexts, session_attributes, init_state,
     [{'contentType': 'PlainText', 'content': prompt}])
      
else:
  # proceed with authentication fulfillment
  message = "Thanks for being our customer."
  intent_request = dialog.set_session_attribute(
      intent_request, 'authentication_status', 'AUTHENTICATED')
  dialog.set_session_attribute(
      intent_request, 'phone_number', phone_number)
  dialog.set_session_attribute(
      intent_request, 'customer_id', customer_id)
  session_attributes = dialog.get_session_attributes(intent_request)
  return dialog.close(
      active_contexts, session_attributes, 
      intent, [{'contentType': 'SSML', 'content': message}])

データベースと統合する

エージェントは、通話中に定期的に情報を取得する必要があります。 例えば、顧客は、支払金額(「今月の請求金額はいくらですか?」)または支払期日(「今月の支払日はいつですか?」)を知りたい場合があります。 構築済みのソリューションには、バックエンドシステムと統合できる、ビジネスロジックコードを備えたプレースホルダーの Lambda 関数が含まれています。 会話管理とビジネスロジックを分離することで、コードを構築および維持しやすくなります。

次のコードは、バックエンドシステムと統合して関連情報を取得する方法を示しています。

payment_due = mobile_system.get_payment_due(customer_id)
if not payment_due:
    response = responses.get('PaymentDueNotAvailable')
    return dialog.elicit_intent(
        active_contexts, session_attributes, intent,
        [{'contentType': 'PlainText', 'content': response}])
        
response = responses.get(
    'Response', payment_due_balance=payment_due['payment_due_balance'],
    payment_due_date=payment_due['payment_due_date'], 
    last_payment_amount=payment_due['last_payment_amount'],
    last_payment_date=payment_due['last_payment_date'])
return dialog.elicit_intent(
    active_contexts, session_attributes, intent,
    [{'contentType': 'PlainText', 'content': response}])

次のコードスタブは、DynamoDBのサンプルデータにアクセスする方法を示しています。

def get_payment_due(customer_id):
  customer = telecomdb.query(
      KeyConditionExpression=Key('customer_id').eq(customer_id),
      FilterExpression=Attr("record_type").eq('mobile'))
  if customer and len(customer) == 0:
      return None
  customer = customer.get('Items')[0]
  payment_due = {}
  payment_due['payment_due_balance'] \
      = customer['due_payment']['payment_due_balance']
  payment_due['payment_due_date'] = \
      = customer['due_payment']['payment_due_date']
  payment_due['last_payment_amount'] \
      = customer['last_payment']['last_payment_amount']
  payment_due['last_payment_date'] = \
    customer['last_payment']['last_payment_date']

  return payment_due

コンタクトセンターの流れ

Amazon Connect 問い合わせフローの一部として、事前に構築されたソリューションをデプロイできます。顧客がコンタクトセンターに電話をかけた場合、処理する問い合わせフローは、その顧客がコールした電話番号に割り当てられた問い合わせフローになります。問い合わせフローでは、顧客の入力を取得するブロックを使用して Amazon Lex ボットを呼び出します。次の図は、問い合わせフローを示しています。

クリーンアップ

今後料金が発生しないように、作成したリソースをすべて削除してください。

  1. Amazon Lexボット
  2. Lambda関数
  3. DynamoDBテーブル
  4. Amazon Connectの問い合わせフロー
  5. IAMロール

結論

Amazon Lex for telecom は、魅力的で洗練された会話体験の提供を促進するために構築済みのソリューションを提供します。 この投稿では、モバイルサービスの顧客が、SIM カードや端末の登録、プランの変更、支払い、端末のアクティベートなどの一般的なタスクを自動化するためのソリューションを確認しました。 AWS を基盤とすることで、安全なインフラストラクチャとして、運用を簡素化しながら、カスタマーエンゲージメントを変革することができます。構築済みのソリューションは、Amazon Connect ですぐにデプロイできるコンタクトセンターの設定も提供します。 ビジネスのニーズに合わせた会話フローを追加することで、ソリューションを簡単に拡張できます。ぜひ Amazon Lex で構築済みのモバイルサービスソリューションをお試しください!


著者について


Jaya Prakash Kommu
Smartbots.ai チームのテクノロジーリーダーです。次世代の会話型 AI インターフェースを構築する AI エンジニアとしてチームを管理しています。ボットを設計していないとき、サッカーを楽しんでいます。


Sandeep Srinivasan
は Amazon Lex チームのプロダクトマネージャーです。人間の行動に熱心な観察者として、彼は顧客体験に情熱を注いでいます。彼は起きている時間を、人、テクノロジー、そして未来の交差点で過ごしています。

翻訳は Solution Architect の Ming Yang が担当しました。原文はこちらです。