Amazon Lexの拡張型組み込みスロットタイプAMAZON. AlphaNumericは、文字数の範囲を指定した英数字を認識できます

お問い合わせ番号などの英数字を、指定した文字数内で、英数字文字列を認識させることができます。
2023.04.05

はじめに

お問い合わせ番号などの複数の英数字をAmazon Lexで認識させたい場合、拡張型の組み込みスロットタイプAMAZON. AlphaNumericが利用できます。

(正式名称は分かりません。以降、拡張型のAMAZON. AlphaNumeric)

例えば、お問い合わせ番号が「小文字の英字3文字 + 数字3文字」の場合、拡張型のAMAZON. AlphaNumericで設定すると、「gher234」は認識しますが、指定した文字数でない「awsge12」などは、認識せずLex側で聞き返してくれます。

また、文字数は範囲指定も可能で、「小文字の英字3~5文字 + 数字2~3文字」と拡張型のAMAZON. AlphaNumericで設定すると、「awsge12」も正しく認識してくれるようになります。

文字数の範囲を指定することで、間違った値の場合、Lex側で聞き返してくれるメリットがあります。

今回は、拡張型のAMAZON. AlphaNumericの構築方法についてご説明します。

使用用途

拡張型のAMAZON. AlphaNumericを使う用途としては、以下をヒアリングしたいケースが挙げられます

  • 複数の英数字を絡めたお問い合わせ番号
  • 6桁から12桁の数字が羅列する電話番号
  • 7桁の郵便番号
  • 車両識別番号
  • 運転免許証の番号

また、Lexには会話のログを残すことができますが、後述するスロットの難読化の設定を行うことで、機密情報をマスクしてログを残すことができ、セキュリティを高めることができます。

調査環境の作成

今回、作成したボットとインテントの作成方法を説明します。

ボットの作成

  1. Lexのコンソール画面から、[ボットの作成]をクリックします。
  2. [空のボットを作成します]を選択し、ボット名を記載し、下記画像の通りに入力します。
  3. 日本語を選択し、音声はTakumiを選択し、[完了]をクリックします。

これでボットが作成できました。

拡張型組み込みスロットタイプを作成

文字数の範囲を指定しつつ、英数字の文字列を認識するスロットタイプを作成します。

今回は、「小文字の英字3文字 + 数字3文字」で設定します。

  1. [スロットタイプの追加]から、[組み込み型を使用]を追加します。
  2. 組み込みスロットタイプは、AMAZON. AlphaNumericにし、スロットタイプ名を記載します。
  3. 正規表現を[a-z]{3}[0-9]{3}と入力し、スロットタイプを保存します。

正規表現

Lexでは、正規表現で次の文字がサポートされています。

  • A~Z
  • a~z
  • 0~9

例として、以下の正規表現が設定できます。

  • 「大文字の英字3文字 + 数字3文字」
    • [A-Z]{3}[0-9]{3}
  • 「大文字の英字3~5文字 + 数字3文字」
    • [A-Z]{3,4,5}[0-9]{3}
  • 「大文字の英字のA~G、Y~Zを3文字 + 数字3文字」
    • [A-GY-Z]{3}[0-9]{1,3}
  • 「JA + 大文字の英字3文字 + 数字3文字」
    • JA[A-Z]{3}[0-9]{3}

アスタリスク(*)は、使用できないようでした。

インテントの作成

  1. インテントの[インテントを追加]から[空のインテントを追加]をクリックします。
  2. インテント名を入力し、サンプル発話に「番号」を追加します。
  3. [スロットを追加]から、先程作成したスロットタイプ3_alphabet-3_numberを選択します。プロンプトと名前も記載します。
    • スロット名をInquiryとしました。
  4. [Confirmation]をアクティブにし、確認プロンプトに以下を記載します
    • {Inquiry}、でよろしいでしょうか?
  5. インテントを保存後、Buildすると、インテントのテストが行えます。

テスト

番号と入力後、例として、「drf276」と入力すると、Lex側で認識してくれました。

ちなみに、「sed12345」「sdr1234」などの指定した文字数でない場合、Lex側で聞き返してくれることも確認できました。

スロットの難読化設定

冒頭でご説明しました、Lexで認識したスロットが機密情報の場合、スロットの難読化を行うことで、Lexの会話のログをマスクできます。

  1. スロットの[詳細オプション]をクリックし、スロットの難読化を有効にするにチェックをいれます。
  2. スロットを更新後、Buildします

これで設定完了です。設定したスロットのみマスクされます。

マスク設定前

ログは、CloudWatch Logsに出力されています。

スロット値のdrf276がログとして確認できますね。

    "sessionState": {
        "sessionAttributes": {},
        "originatingRequestId": "a3b47eeb-e787-4b96-bab8-b58d939ff592",
        "intent": {
            "name": "Inquiry_number",
            "state": "InProgress",
            "confirmationState": "None",
            "slots": {
                "Inquiry": {
                    "value": {
                        "originalValue": "drf276",
                        "interpretedValue": "drf276",
                        "resolvedValues": [
                            "drf276"
                        ]
                    },
                    "shape": "Scalar"
                }
            }
        },
        "dialogAction": {
            "type": "ConfirmIntent"
        }
    },
    "interpretations": [
        {
            "intent": {
                "name": "Inquiry_number",
                "state": "InProgress",
                "confirmationState": "None",
                "slots": {
                    "Inquiry": {
                        "value": {
                            "originalValue": "drf276",
                            "interpretedValue": "drf276",
                            "resolvedValues": [
                                "drf276"
                            ]
                        },
                        "shape": "Scalar"
                    }
                }
            }
        },

マスク設定後

スロット値のdrf276{Inquiry}に変換されて、マスクされていることを確認できました。

    "sessionState": {
        "sessionAttributes": {},
        "dialogAction": {
            "type": "ConfirmIntent"
        },
        "originatingRequestId": "0d626042-8cfe-4126-a955-8d000569eba1",
        "intent": {
            "name": "Inquiry_number",
            "state": "InProgress",
            "confirmationState": "None",
            "slots": {
                "Inquiry": {
                    "value": {
                        "originalValue": "{Inquiry}",
                        "interpretedValue": "{Inquiry}",
                        "resolvedValues": []
                    },
                    "shape": "Scalar"
                }
            }
        }
    },
    "interpretations": [
        {
            "intent": {
                "name": "Inquiry_number",
                "state": "InProgress",
                "confirmationState": "None",
                "slots": {
                    "Inquiry": {
                        "value": {
                            "originalValue": "{Inquiry}",
                            "interpretedValue": "{Inquiry}",
                            "resolvedValues": []
                        },
                        "shape": "Scalar"
                    }
                }
            }
        },

Connectのコンタクトフロー内では利用できませんでした。

Connectのコンタクトフロー内でLexを連携させて、英数字を聞き取れるか検証しましたが、連携してもうまくいきませんでした。

理由は、英字3文字「DPC」を発話すると、inputTranscript内は、d. p. c.が入りますが、Lexで認識されないためです。

数字も同様で、「123」と発話すると、inputTranscript内は、イチ に サンが入りますが、Lexで認識されませんでした

原因は、拡張型のAMAZON. AlphaNumericでは、指定した文字列以外の「.」や「イチ に サン」の文字が入っているためだと推測します。

ただし、今回使用した拡張型のAMAZON. AlphaNumericではなく、通常のスロットタイプAMAZON. AlphaNumericだと、「DPC」を発話すると、Lexで認識してくれます。

以下の記事で設定方法を記載していますので、参考になればと思います。

最後に

拡張型のAMAZON. AlphaNumericで、英数字を組み合わせた文字列をLexで認識してくれることが確認できました。

チャットでの問い合わせ等で利用できるかと思いますので、参考になればと思います。