プラトンデータインテリジェンス。
バーティカルサーチ&アイ。

AmazonLexを使用して住所を取得する

日付:

Amazon Lex 自動音声認識(ASR)および自然言語理解(NLU)テクノロジーを提供して、ユーザー入力を転記し、要求の性質を識別し、会話を効率的に管理します。 Lexを使用すると、洗練された会話を作成し、ユーザーエクスペリエンスを合理化して、顧客満足度(CSAT)スコアを向上させ、コンタクトセンターへの封じ込めを強化できます。

自然で効果的な顧客とのやり取りには、Lex仮想エージェントが顧客から提供された情報を正確に解釈する必要があります。 特に困難なシナリオのXNUMXつは、通話中に番地を取得することです。 たとえば、最近新しい都市に引っ越してきて、ワイヤレスアカウントの住所を更新するために電話をかけた顧客について考えてみます。 XNUMXつの米国の郵便番号でさえ、さまざまな通りの名前を含めることができます。 電話で正しい住所を取得することは、人間のエージェントにとってさえ難しい場合があります。

この投稿では、AmazonLexと Amazonロケーションサービス 音声またはテキストを介してアドレスをキャプチャするための効果的なユーザーエクスペリエンスを提供します。

ソリューションの概要

この例では、セルフサービス機能を提供するAmazonLexボットを使用します。 アマゾンコネクト 接触流。 ユーザーが電話をかけると、アドレスの変更を要求でき、ボットは顧客番号と新しいアドレスを要求します。 多くの場合、新しいアドレスは最初の試行で正しくキャプチャされます。 より難しい住所の場合、ボットは、通りの名前を言い直すか、通りの名前を綴るか、郵便番号または住所番号を繰り返して正しい住所を取得するように依頼する場合があります。

Lexボットをモデル化するためのユーザーインタラクションの例を次に示します。

IVR:こんにちは、ACME銀行のカスタマーサービスへようこそ。 手伝いましょうか? アカウントの残高を確認したり、注文を確認したり、住所を変更したりできます。

ユーザー:住所を変更したい。

IVR:お客様番号を教えていただけますか?

ユーザー:123456。

IVR: ありがとう。 新しい郵便番号を教えてください。

ユーザー:32312。

IVR:OK、あなたの新しい番地は何ですか?

ユーザー:6800 Thomasville Road、Suite1-oh-1。

IVR: ありがとうございました。 正しく理解するために、あなたの街の名前だけを教えてもらえますか?

ユーザー:トーマスビルロード。

IVR:OK、新しい住所は6800 Thomasville Road、Suite 101、Tallahassee Florida 32312、USAです。 そうですか?

ユーザー:はい。

IVR:OK、あなたの住所は更新されました。 他に何かお手伝いできることはありますか?

ユーザー: 結構です。

IVR:お問い合わせいただきありがとうございます。 すてきな一日を!

別の方法として、最初に郵便番号を要求するのではなく、住所全体をXNUMXターンで取得できます。

IVR:こんにちは、ACME銀行のカスタマーサービスへようこそ。 手伝いましょうか? アカウントの残高を確認したり、注文を確認したり、住所を変更したりできます。

ユーザー: したい update 私の住所。

IVR:お客様番号を教えていただけますか?

ユーザー:123456。

IVR: ありがとう。 番地、市区町村、都道府県、郵便番号など、新しい住所を教えてください。

ユーザー:6800 Thomasville Road、Suite 1-oh-1、Tallahassee Florida、32312。

IVR: ありがとうございました。 正しく理解するために、あなたの街の名前だけを教えてもらえますか?

ユーザー:トーマスビルロード。

IVR:OK、新しい住所は6800 Thomasville Road、Suite 101、Tallahassee Florida 32312、USです。 そうですか?

ユーザー:はい。

IVR:OK、あなたの住所は更新されました。 他に何かお手伝いできることはありますか?

ユーザー: 結構です。

IVR:お問い合わせいただきありがとうございます。 すてきな一日を!

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

このソリューションでは、AmazonConnectと統合されたAmazonLexボットを使用します。 ユーザーが電話をかけて新しいアドレスを入力すると、Lexは自動音声認識を使用して音声をテキストに変換します。 次に、それを使用します AWSラムダ 転写されたテキストをAmazonLocationServiceに送信するフルフィルメント関数。AmazonLocationServiceは、アドレス検索を実行し、正規化されたアドレスを返します。

の一環として、 AWS CloudFormation スタック、オプションを作成することもできます Amazon CloudWatchログ Lex会話ログをキャプチャするためのロググループ。これを使用して、会話分析ダッシュボードを作成し、結果を視覚化できます(投稿を参照) AmazonLexボット用のビジネスインテリジェンスダッシュボードの構築 これを行うXNUMXつの方法)。

機能

このソリューションは、次のような効果的なユーザーエクスペリエンスを作成するために、いくつかの手法を組み合わせています。

  • 音声をテキストに変換するAmazonLex自動音声認識テクノロジー。
  • アドレス検索と正規化のためのAmazonLocationServiceとの統合。
  • 法律 スペルスタイル、音声入力が明確でない場合に「say-spell」アプローチを実装する(たとえば、ユーザーに通りの名前を言ってから、必要に応じてそれを綴るように依頼する)。

最初のステップは、必要なスロットがキャプチャされていることを確認することです。

次の最初のコードセクションでは、Lexを使用してユーザーに郵便番号と住所の入力を求めます。 ElicitSlot ダイアログアクション。 The elicit_slot_with_retries() 関数は、構成可能なプロンプトのセットに基づいてユーザーにプロンプ​​トを表示します。

 
    # check for ZipCode code slot; if not available; elicit it
    zip_code = None
    zipCode = slot_values.get('ZipCode', None)
    if zipCode is not None:
        zip_code = zipCode['value'].get('interpretedValue', None)
    else:
        response = helpers.elicit_slot_with_retries( intent, activeContexts, sessionAttributes, 'ZipCode', requestAttributes)
        return response		
    # check for StreetAddress slot
    street_address = None
    streetAddress = slot_values.get('StreetAddress', None)
    if streetAddress is not None:
        street_address = streetAddress['value'].get('interpretedValue', None)
    else:
        # give the caller extra time for this response
        sessionAttributes['x-amz-lex:audio:end-timeout-ms:' + intent_name + ':StreetAddress'] = 2000
        response = helpers.elicit_slot_with_retries( intent, activeContexts, sessionAttributes, 'StreetAddress', requestAttributes)
        return response
    street_address = parse_address.parse(street_address)
    sessionAttributes['inputAddress'] = street_address

上記のコードの最後のセクションでは、ヘルパー関数を使用しています parse_address.parse() これは、話された数字を数字に変換します(たとえば、「6800」を「XNUMX」に変換します)。

次に、ユーザーの発話をAmazon Location Serviceに送信し、応答を検査します。 番地や番地がないエントリ、または郵便番号が正しくないエントリは破棄されます。 通りの名前または番号の再入力が必要な場合は、以前に提案された住所も破棄します。

# validate the address using the AWS Location Service
    location_response = locationClient.search_place_index_for_text(IndexName='explore.place', Text=street_address)
    # inspect the response from Amazon Location Service
    if location_response.get('Results', None) is not None:
        for address in location_response['Results']:
            if address.get('Place', None) is not None:
                addressLabel = address['Place'].get('Label', None)
                addressNumber = address['Place'].get('AddressNumber', None)
                street = address['Place'].get('Street', None)
                postalCode = address['Place'].get('PostalCode', None)
                if street is None:
                    continue                    
                if addressNumber is None:
                    continue                    
                if zip_code is not None:
                    if postalCode[:len(zip_code)] != zip_code:
                        continue
                already_tried = False
                prior_suggestions = helpers.get_all_values('suggested_address', sessionAttributes)
                for prior_suggestion in prior_suggestions:
                    if addressLabel == prior_suggestion:
                        already_tried = True
                        break                    
                if already_tried:
                    continue
                # the first entry with a valid street that was not already tried is the next best guess
                resolvedAddress = addressLabel
                break

解決済みのアドレスを取得したら、ユーザーに確認します。

if (event.get('inputMode') == 'Speech'):
        response_string = '<speak>OK, your new address is <say-as interpret-as="address">'
        response_string += resolvedAddress + '</say-as>. Is that right?</speak>'
        response_message = helpers.format_message_array(response_string, 'SSML')
    else:
       response_string = 'OK, your new address is ' + resolvedAddress + '. Is that right?'
        response_message = helpers.format_message_array(response_string, 'PlainText')
    intent['state'] = 'Fulfilled'
    response = helpers.confirm(intent, activeContexts, sessionAttributes, response_message, requestAttributes)
    return response

Amazon Location Serviceから解決済みのアドレスが返されなかった場合、またはユーザーが提案したアドレスが正しくないと言った場合は、追加情報の入力を再度求めて、再試行します。 追加の情報スロットは次のとおりです。

  • StreetName:スロットタイプAMAZON.StreetName
  • SpelledStreetName:スロットタイプAMAZON.AlphaNumeric(Amazon Lexを使用) スペルスタイル)
  • StreetAddressNumber:スロットタイプAMAZON.Number

再プロンプトを表示するロジックは、 next_retry() 試行するアクションのリストを参照する関数:

RETRY_ACTIONS = [
    { "street_name": {
          "method": elicit_street_name,
          "style": None,
          "no-match": "Thank you. To make sure I get it right, can you tell me just the name of your street?",
          "incorrect": "Let's try again. Can you tell me just the name of your street?"
       }
    },
    { "street_name_spelled_by_letter": {
          "method": elicit_spelled_street, 
          "style": "SpellByLetter",
          "no-match": "Let's try a different way. Can you please spell just the name of your street?",
          "incorrect": "Let's try a different way. Can you please spell just the name of your street?"
       }
    },
    { "street_address_number": {
          "method": elicit_street_address_number, 
          "style": None,
          "no-match": "I didn't find a matching address. Can you please tell me your street address number?",
          "incorrect": "OK, let's try your street address number. Can you tell me that once more?"
       }
    },
    { "street_name_spelled_by_word": {
          "method": elicit_spelled_street, 
          "style": "SpellByWord",
          "no-match": "Let's try one last time. Please spell the name of your street. You can use words for letters, such as a as in apple, or b like bob.",
          "incorrect": "Let's try one last time. Please spell the name of your street. You can use words for letters, such as a as in apple, or b like bob."
       }
    },
    { "agent": {
          "method": route_to_agent, 
          "style": None,
          "no-match": "Sorry, I was not able to find a match for your address. Let me get you to an agent.",
          "incorrect": "Sorry, I was not able to find a match for your address. Let me get you to an agent."
       }
    }
]

  next_retry() 関数はこれらのアクションを順番に試行します。 プロンプトの順序を変更することにより、プロンプトのシーケンスを変更できます。 RETRY_ACTIONS リスト。 また、Amazon Location Serviceが一致するものを見つけられないシナリオと、提案されたアドレスが正しくないとユーザーが言ったシナリオに対して、異なるプロンプトを設定することもできます。 ご覧のとおり、Amazon Lexのスペルスタイルを使用して、ストリート名を言い直して失敗した場合は、ユーザーに名前を変更するように依頼する場合があります。 これを「say-spell」アプローチと呼びます。これは、このシナリオで人間のエージェントが顧客と対話する方法に似ています。

これが実際に動作していることを確認するには、AWSアカウントにデプロイできます。

前提条件

次のCloudFormationリンクを使用して、独自のAWSアカウントにソリューションをデプロイできます。 このソリューションを展開する前に、次の前提条件があることを確認する必要があります。

  • 利用可能 AWSアカウント ソリューションを展開できる場所。
  • 次のAWSサービスへのアクセス:
    • Amazon Lex
    • AWS Lambda、AmazonLocationServiceとの統合用
    • アマゾンロケーションサービス、住所検索用
    • AWS IDおよびアクセス管理 (IAM)、必要なポリシーと役割を作成するため
    • CloudWatch Logs、Lambda関数のロググループを作成し、オプションでLex会話ログをキャプチャします
    • スタックを作成するCloudFormation
  • Amazon Connectインスタンス(セットアップの手順については、を参照してください) Amazon Connectインスタンスを作成する).

次のAWSリージョンは、Amazon Lex、Amazon Connect、およびAmazon Location Serviceをサポートしています:US East(N. Virginia)、US West(Oregon)、Europe(Frankfurt)、Asia Pacific(Singapore)、Asia Pacific(Sydney)Region、およびAsiaパシフィック(東京)。

サンプルソリューションの展開

にサインインする AWSマネジメントコンソール AWSアカウントで、次のリンクを選択してサンプルソリューションをデプロイします。

これにより、新しいCloudFormationスタックが作成されます。

入力します スタック名、 といった lex-update-address-example。 ソリューションのテストに使用するAmazonConnectインスタンスのARN(Amazonリソース名)を入力します。 他のパラメータのデフォルト値を維持することも、ニーズに合わせて変更することもできます。 選ぶ Next、スタックに必要なタグを追加します(オプション)。 選ぶ Next もう一度、スタックの詳細を確認し、チェックボックスを選択してIAMリソースが作成されることを確認してから、 スタックを作成.

数分後、スタックが完成し、次のリソースが含まれます。

  • エイリアス付きの公開バージョンを含むLexボット(Development-Alias)
  • ボットのラムダフルフィルメント関数(BotHandler)
  • LexカンバセーションログのCloudWatchLogsロググループ
  • 必要なAmazonIAMの役割
  • Connectインスタンスにサンプルの連絡先フローを追加するカスタムリソース

この時点で、LexV2コンソールで上記の操作例を試すことができます。 CloudFormationテンプレートで指定した名前のサンプルボットが表示されます(例: update-address-bot).

このボットを選択し、 ボットのバージョン 左側のナビゲーションパネルで、 Version 1 バージョンを選択し、 意図 左側のパネルにあります。 インテントのリストと、 ホイール試乗

テストするには、 ホイール試乗 ボタンを選択 Development-Alias、次に選択 確認します テストウィンドウを開きます。

「住所を変更したい」を試してみてください。 これは使用します UpdateAddressZipFirst 郵便番号を尋ねることから始めて、次に番地を尋ねることから、住所を取得する意図。

「私はしたい update 私の住所」を試してみてください UpdateAddress インテント。XNUMX回の発話でアドレスを一度にキャプチャします。

AmazonConnectでのテスト

次に、Connectインスタンスを使用して音声でこれを試してみましょう。 サンプルの連絡先フローは、Connectインスタンスですでに構成されています。

電話番号を設定し、それをこの連絡先フローに関連付けるだけです。 これを行うには、次の手順に従います。

  • AWSコンソールでAmazonConnectを起動します。
  • を選択してConnectインスタンスを開きます アクセスURL、 インスタンスにログインします。
  • ダッシュボードで、 電話番号を見る.
  • 選択 番号を請求する、国を選択します ドロップダウンをクリックして、番号を選択します。
  • 「AmazonLexで住所を更新するフローの例」などの説明を入力し、作成した連絡先フローを選択します。
  • 選択する Save.

これで、Connectインスタンスを呼び出して、音声を使用してボットをテストする準備が整いました。 お使いの携帯電話の番号をダイヤルして、いくつかの米国のアドレスを試してみてください。 郵便番号の最初のアプローチを試すには、「住所を変更してください」と言います。 ワンターンアプローチで住所変更を試すには、「住所を更新」と言います。 「私の新しい住所は」と言ってから、有効な米国の住所を続けることもできます。

しかし待ってください…もっとあります

音声シナリオのもうXNUMXつの難しい使用例は、ユーザーの電子メールアドレスをキャプチャすることです。 これは多くの場合、ユーザーの確認目的で、または単にユーザーがファイルにある電子メールアドレスを変更できるようにするために必要です。 Lexには、AMAZON.EmailAddress組み込みスロットタイプを使用した電子メールアドレスの組み込みサポートがあり、Lexスペルスタイルもサポートしています。

電子メールアドレスをキャプチャするために「say-spell」アプローチを使用すると、非常に効果的です。このアプローチは、前述の番地キャプチャシナリオのユーザーエクスペリエンスに類似しているため、ここに含めました。 試してみる!

クリーンアップ

ボットの使用が終了したら、CloudFormationテンプレートの一部として作成されたリソースをクリーンアップして、継続的な料金が発生しないようにすることができます。 これを行うには、CloudFormationスタックを削除します。

まとめ

Amazon Lexは、強力な自動音声認識と自然言語理解機能を提供します。これらの機能を使用して、ユーザーから必要な情報を取得し、自動化されたセルフサービス機能を提供できます。 通り、都市、町の名前の範囲が広いため、音声認識を介して顧客の住所を取得するのは難しい場合があります。 ただし、AmazonLexをAmazonLocation Serviceと簡単に統合して、顧客の入力に基づいて正しい住所を検索することができます。 この手法を独自のLex会話フローに組み込むことができます。


著者について

ブライアン・ヨースト AWSLexチームのシニアテクニカルプログラムマネージャーです。 余暇には、マウンテンバイク、自家醸造、テクノロジーをいじくり回すのが好きです。

スポット画像

最新のインテリジェンス

スポット画像

私たちとチャット

やあ! どんな御用でしょうか?