Amazon Web Services ブログ

Microsoft Excel を使った Amazon Lex チャットボットの構築

この記事は、AWS コミュニティヒーローの Cyrus Wong によるゲスト投稿です。

ここ香港にある私たちの学院 (IVE) では、教育、研究、およびヘルスケアにおいて Amazon Lex での実験を開始しました。当学院には、IVE の英語教師、IVE の保育、高齢者およびコミュニティサービス学科のセラピストなど、Amazon Lex コンソールで自然言語での対話ボットを作成する技術的ノウハウを持たない従業員が多数存在します。私たちは、非技術系ユーザーのための Amazon Lex チャットボットを構築する試験的なプロジェクトをいくつか完了しました。非技術系ユーザーは Excel スプレッドシートにそれぞれの質問を記入し、その後開発者が Amazon Lex コンソールにユーザーの質問をコピーしました。しかし、ユーザーがチャットボットで何かを変更したい場合、開発者はいつもこれと同じコピーアンドペーストプロセスを行わなければなりませんでした。

そこで私たちは、「チャットボットの構築に Excel を直接使ってコピーアンドペーストの繰り返し作業をやめたらどうだろう?」と考えました。

当学院の従業員は全員 Microsoft Excel の使用方法を知っているため、私たちは最小限のプログラミングスキルでチャットボットを作成するために Excel を使用できる「ExcelLexBot」というプロジェクトを立ち上げることにしました。

ExcelLexBot は、事前定義されたフォーマットの Excel ファイル (xlsx) を Amazon Lex チャットボットに変換するサーバーレスアプリケーションです。私たちが作り上げた ExcelLexBot は様々な方法で使用することができ、その全てが迅速に、最小限の開発スキルで構築できるように設計されています。私のような教師は、ExcelLexBot を使ってインタラクティブなチャットに似たテストや課題を作成することができます。生徒は、最後の学年末プロジェクトにチャットボットの機能性を追加するためにこれを使用しますが、これも迅速に行うことができます。クラウドおよびデータセンター管理の副学士課程に属する 80 人の生徒たちが 1 時間内で 80 のチャットボットを作成しました。

この記事では、ExcelLexBot の仕組みと、それをデプロイして使用する方法について説明します。

Amazon Lex のコンセプト

Amazon Lex は、開発者が音声およびテキスト用の対話型インターフェイスをアプリケーションに組み込むことを可能にするサービスです。Amazon Lex により、開発者の誰もが Amazon Alexa を作動させるディープラーニングテクノロジーと同じ技術を利用できるようになっため、高度なチャットボットを素早く簡単に構築することが可能です。

Amazon Lex チャットボットには 3 つのコンポーネントタイプで構成されています。

  1. ボット – ボットには対話のコンポーネント全てが含まれています。
  2. インテント – インテントは、ボットのユーザーが達成したいアクションを表します (予約を入れる、花を注文するなど)。
  3. スロットタイプ – スロットタイプはスロット内のデータがどのように認識され処理されるかを定義します。Amazon Lex は Alexa Skills Kit からの組み込みスロットタイプをサポートします。インテント内にカスタムスロットタイプを作成することも可能です。

詳細については、Amazon Lex コンセプトの Amazon Lex – 対話的音声&テキストインターフェースを構築を参照してください。

アーキテクチャと設計

ExcelLexBot は AWS サーバーレスアプリケーションモデル (AWS SAM) を使って Excel に連結する AWS SAM Amazon Lex アプリケーションを作成します。AWS SAM は、Lambda ベースのアプリケーションを記述するための仕様で、特にサーバーレスリソースを表現するために設計された構文を提供します。

ExcelLexBot ビルダースタック

このスタックは、Amazon S3 バケットと ExcelLexBuilder Lambda イベントフック関数で構成されています。ユーザーが Excel ファイルをアップロードすると、ExcelLexBuilder Lambda 関数が以下のアクションを実行します。

  1. Excel ファイルの解析。
  2. ExcelLexBot SAM テンプレートの生成。
  3. Lambda コードパッケージの作成。
  4. S3 への Lambda コードパッケージのアップロード。
  5. ExcelLexBot SAM テンプレートからの変更セットの作成。
  6. チャットボットスタックのデプロイ。

ExcelLexBuilder は Excel ファイルを読み取り、ExcelLex SAM テンプレートとデプロイメントパッケージを生成します。現在、ExcelLexBuilder はワークシートごとにひとつの JSON ファイルを作成し、私は AWS Lambda-backed カスタムリソースを使って JSON ファイルを実行してチャットボットを作成します。Amazon Lex ボットを作成するための JSON の使用に関する詳細については、演習 1: Amazon Lex ボットを作成する (AWS CLI) で確認することができます。

チャットボットスタック

基本的な Lex 用語 (例えばインテントの意味など) については、AWS ブログの Amazon Lex – 対話的音声&テキストインターフェースを構築を参照してください。

Lex Dispatcher は、ダイアログとフルフィルメントイベントの両方をキャプチャするデフォルトのコードフックです。これは、以下のタスクを実行します。

  1. 命名規則に基づいてリクエストを他の Lambda 関数に転送します。命名規則は 3 つあります。
    1. 最初の規則は「Capture All」で、インテントと同じ名前を持つ Lambda 関数、例えば MakeAppointmentIntent がある場合、ダイアログとフルフィルメントイベントの両方を転送します。
    2. 2 番目の規則は「Capture Dialog」で、「_dialogCodeHook」で終わる名前を持つ Lambda 関数、例えば「MakeAppointmentIntent_dialogCodeHook」にダイアログイベントを転送します。
    3. 3 番目の規則は「Capture Fulfillment」で、「_fulfillmentActivity」で終わる名前を持つ Lambda 関数、例えば「MakeAppointmentIntent_fulfillmentActivity」にダイアログイベントを転送します。

    Lambda 関数を使用して、インテント設定で初期化と検証、フルフィルメント、またはそれら両方を実行することができます。

  2. 「Capture All」を定義した場合、「Capture Dialog」や「Capture Fulfillment」は定義しないようにしてください。「Capture All」を定義していない場合は、「Capture Dialog」と「Capture Fulfillment」を同時に定義する必要があります。
  3. fulfillmentActivity イベントが生じた場合、インテント情報がインテントと同じ名前で Amazon DynamoDB テーブルに保存されます。また、全てのテーブルには Auto Scaling for Amazon DynamoDB が 1~50 キャパシティユニットのスループット範囲で有効化されています。
  4. fulfillmentActivity イベントが発生し、ユーザーが Excel に E メールアドレスを提供している場合、Amazon SNS にインテント情報が発行され、Amazon SNS にこれらの E メールアドレスに対する E メールを送信させます。

この設計は、インテント情報を保存してそれをユーザーに E メールで送信する、およびチャットボットスタックからカスタムコードフックを分離させるなどの一般的なタスクを処理することができます。

既存の Amazon Lex チャットボットを ExcelLexBot に移行させるには、Excel ワークシートに記入して、全ての Lambda 関数コードフックを命名規則に従って再デプロイする必要があります。Lex Dispatcher 関数に特別な魔法があるわけではありません。これは単に、現行のインテント名を取得し、適切なサフィックスを付加して、別の Lambda 関数を呼び出すだけです。

def call_lambda(event, function_name, function_set):
    if function_name in function_set:
        response = lambda_client.invoke(
            FunctionName=function_name,
            InvocationType='RequestResponse',
            Payload=json.dumps(event)
        )
        data = json.loads(response['Payload'].read().decode("utf-8"))
        print(data)
        return data
    else:
        return None

「FulfillmentCodeHook」イベントが発生すると、別の Lambda 関数を呼び出す前に E メールの保存と送信が行われます。

if source == 'FulfillmentCodeHook':
    save_fulfillment(intent_name, event)
    publish_to_sns(intent_name, event, aws_account_id)

ExcelLexBot では、通常通りにコードフックを定義します。いつものようにコードフックを定義すればよいだけです。Lex Dispatcher としての Amazon Lex チャットボットは何も変更を行わず、イベントを元のコードフックに転送するだけです。コードフックの記述方法について学ぶには、Amazon Lex と AWS Lambda の設計図を参照してください。

Excel フォーマット

Excel フォーマットは、設定より規約の原理に従っています。

  1. ワークシート名は Amazon Lex のコンポーネント名になります。
  2. コンポーネントのタイプはワークシート名のサフィックスにマップされ、コンポーネントにはボット、インテント、およびタイプの 3 種類があります。以下の ExcelLexBot のダイアグラムはこれを説明するもので、元の Amazon Lex にもマップすることもできます。

    ボットは 1 つ、または複数のインテントを持つことができます。各インテントは 1 つ、または複数の質問 (スロット) を持つことができます。各質問はタイプ (スロットタイプ) を設定しなければなりません。タイプは Lex の組み込みスロットタイプまたはカスタムスロットタイプ (ワークシートでユーザーが定義) にすることができます。カスタムスロットタイプには、1 つ、または複数の列挙値 (可能値) があります。各列挙値はシノニムを持つことができます。

私は、ほとんどのフィールドの詳しい意味について AWS の設計図を参照することができるように、JSON データを Excel データに再フォーマットしました。

注意する点がいくつかあります。

  1. Excel ファイル名には英文字のみが含まれています。例えば、ChatBot- Copy.xlsx または ChatBot2.xlsx は有効ではありません。
  2. より親しみのある用語を使うため、「slot」は「question」、「slotType」は「type」、および「slotConstraint」は「Constraint」に名称変更しました。
  3. サンプルの発話、受信者 E メール、質問および可能値については、複数のライン入力が可能です。以下はその例です。

    これは、元の Lex JSON 受信者 E メール内の JSON 配列が、Lex JSON スキーマに存在しない唯一の追加フィールドであることを表しています。
  4. ユーザーは質問ごとの再試行数には関心がないため、インテントワークシートの最大試行数がスロット (質問) の「maxAttempts」に入力されます。
  5. コンテンツセルの値は ASCII 文字のみをサポートし、ASCII 以外の文字を削除します。

ボットワークシート

  1. Description (説明) – ボットの説明です。
  2. Abort Statement (Abort ステートメント) – Amazon Lex が文脈の中でユーザーの入力を理解できない場合、Lex はユーザープロンプトを通じて何度か情報を引き出そうとします。その後、Amazon Lex は Abort ステートメントで定義されたメッセージをユーザーに送信してから、対話を終了します。
  3. Clarification Prompt (明確化プロンプト) – Amazon Lex がユーザーのインテントを理解しないとき、Lex はこのメッセージを使用して明確化を求めます。
  4. ボットの名前はワークシートの名前、つまり ExcelLexBot で、この Excel ワークブックで定義された全てのインテントが含まれます。これらは OrderFlowersIntent および MakeAppointmentIntent です。

詳細については、put-bot CLI コマンドを参照してください。

Output ChatBot_ExcelLexBot.json
{
    "name": "ChatBot_ExcelLexBot",
    "description": "Bot to Demo Excel Lex Bot",
    "intents": [
        {
            "intentName": "ChatBot_OrderFlowersIntent",
            "intentVersion": "$LATEST"
        },
        {
            "intentName": "ChatBot_MakeAppointmentIntent",
            "intentVersion": "$LATEST"
        }
    ],
    "locale": "en-US",
    "abortStatement": {
        "messages": [
            {
                "content": "Sorry, I'm not able to assist at this time",
                "contentType": "PlainText"
            }
        ]
    },
    "clarificationPrompt": {
        "maxAttempts": 2,
        "messages": [
            {
                "content": "I didn't understand you, what would you like to do?",
                "contentType": "PlainText"
            }
        ]
    },
    "voiceId": "Salli",
    "childDirected": false,
    "idleSessionTTLInSeconds": 600
}

インテントワークシート

このスニペットは、MakeAppointmentIntent ワークシートの上部です。

  1. Description (説明) – インテントの説明です。
  2. Max Attempts (最大試行数) – ユーザーに情報の提供を促す回数です。
  3. Confirmation Prompt (確認プロンプト) – インテントのフルフィルメント前に、インテントを確認するようユーザーを促します。
  4. Sample Utterances (サンプル発話) – 各行はサンプルの発話で、インテント用に設定されたサンプル発話の配列に変換されます。
  5. Receiver Email (受取人 E メール) – 各行は E メールアドレスです。インテントのフルフィルメントを示す記録は、SNS を通じてこの E メールアドレスに送信されます。
  6. インテント名がこのワークシートの名前です。

このスニペットは MakeAppointmentIntent ワークシートの質問セクションです。

私は、ユーザーにとって、インテントという考え方よりも質問表の作成のほうが理解しやすいことを学びました。開発者または IT を学ぶ学生にとって、この考えは単に、例えば AMAZON.DATE Date = 10/5/2017 など、強い型付けの言語で変数一式のためのオンラインフォームを作成するだけのことです。Amazon Lex はまさに、複雑な Web フォームをデータ型検証に置き換える援助をしてくれます。私の生徒たちは、ExcelLexBot を使ったチャットボットの作成が、Web フォームの作成よりも簡単だと感じています。

  1. Name (名前) – 質問 (スロット) の名前です。これは、Amazon DynamoDB での属性名、およびコードフック用の JSON データになります。
  2. Description (説明) – 質問 (スロット) の説明です。
  3. Question (質問) – 各行は質問のテキストです。元の AWS Lex JSON は、valueElicitationPrompt を文字列でメッセージのリストと共に使用します。私たちのユーザーに SSML を知っている人はいないので、ExcelLexBot は SSML をサポートしません。
  4. Type (タイプ) – 質問 (スロット) のタイプで、ユーザーが定義するカスタムスロットタイプ、または組み込みスロットタイプのいずれかになります。
  5. Constraint (制限) – スロットが必須またはオプションのどちらであるかを指定します。
  6. Priority (優先度) – ユーザーからこのスロット値を引き出す順序に従うよう Lex に指示します。例えば、インテントに優先度 1 と 2 の 2 つの質問 (スロット) がある場合、Amazon Lex はまず優先度 1 の質問 (スロット) に対する値を引き出します。複数の質問 (スロット) が同じ優先度を共有する場合、Lex が値を引き出す順序は任意となります。
  7. Sample Utterances (サンプル発話) – 質問 (スロット) 値についてユーザーが Amazon Lex に応答する特定のパターンがわかっている場合、これらの発話を提供して正確性を向上させることができます。これはオプションです。ほとんどの場合、Amazon Lex はユーザー発話を理解することができます。

詳細については、put-intent CLI コマンドを参照してください。

ChatBot_ExcelLexBot.json での出力。以下はその一部です。

{
	    "name": "ChatBot_MakeAppointmentIntent",
	    "description": "Intent to make appointment",
	    "slots": [
	        {
	            "slotType": "ChatBot_AppointmentType",
	            "name": "AppointmentType",
	            "slotConstraint": "Required",
	            "valueElicitationPrompt": {
	                "maxAttempts": 2,
	                "messages": [
	                    {
	                        "content": "What type of appointment would you like to schedule?",
	                        "contentType": "PlainText"
	                    }
	                ]
	            },
	            "priority": 1,
	            "description": "The type of flowers to pick up",
	            "sampleUtterances": [
	                "I would like a {AppointmentType}"
	            ],
	            "slotTypeVersion": "$LATEST"
	        },
…

タイプワークシート

  1. Description (説明) – タイプ (スロットタイプ) の説明です。
  2. Value Selection Strategy (値の選択戦略) – スロットタイプ値を返すために Amazon Lex が使用するスロット解決戦略を決定します。このフィールドは、以下の値のいずれかに設定できます。
    ORIGINAL_VALUE – ユーザーの値がスロット値に類似している場合、ユーザーが入力した値を返します。
    TOP_RESOLUTION – スロット用の解決リストがある場合、スロットタイプ値として解決リストの最初の値を返します。解決リストがない場合、null が返されます。
  3. Possible Values (可能値) – スロットタイプが取り得る値を定義する可能値 (列挙値) 文字列のリストです。改行によってシノニムを作成できます。

詳細については、put-slot-type CLI コマンドを参照してください。

Output ChatBot_AppointmentType.json
{
    "name": "ChatBot_AppointmentType",
    "description": "Type of dentist appointment to schedule",
    "valueSelectionStrategy": "TOP_RESOLUTION",
    "enumerationValues": [
        {
            "value": "cleaning"
        },
        {
            "value": "whitening"
        },
        {
            "value": "root canal"
        }
    ]
}

ExcelLexBot のデプロイ

アプリケーションをデプロイするには、以下のステップを実行します。

  1. us-east-1 AWS リージョンに Amazon S3 ソースバケットを作成します。
  2. GitHub の Deployment フォルダで、excellexbot.yamllex_builder_function.zip の 2 つのファイルをダウンロードします。
  3. Deployment フォルダから取得したソースパッケージである lex_builder_function.zip を S3 ソースバケットにアップロードします。Amazon S3 コンソールに詳しくない場合は、S3 バケットにファイルとフォルダをアップロードする方法のチュートリアルに従ってください。
  4. AWS CloudFormation コンソールで [スタックの作成] を選択します。
  5. [テンプレートを Amazon S3 にアップロード] を選択して yaml を選択してから、[次へ] を選択します。
  6. 以下のパラメータを指定して、[次へ] を選択します。
    1. スタックの名前: excellexbot (AWS リージョンにおけるスタックのための一意の名前)。
    2. SourceBucket: ステップ 1 で作成した S3 ソースバケットの名前。
    3. ExcelBucketName: 作成したい S3 バケットの名前。バケット名は一意である必要があります。AWS CloudFormation スタックを削除しても、バケットは残ります。
  7. [オプション] ページで、[次へ] を選択します。
  8. 確認のボックスをすべて選択して、[変更セットの作成] を選択します。
  9. 変更セットが作成されたら、[実行] を選択します。
  10. AWS CloudFormation スタックが作成されるのを待ちます。

Analyze Emotion in Video Frame Samples Using Amazon Rekognition on AWS を参照できます。「HowWhoFeelInVideo」のデプロイセクションはこれらデプロイメントステップと似ています。

デプロイメントの試行

  1. GitHub からサンプル Excel ファイル ChatBot.xlsx をダウンロードします。
  2. S3 コンソールで、ExcelBucketName 用のバケットに ChatBot.xlsx をアップロードします。
  3. AWS CloudFormation コンソール を開きます。

    チャットボットスタックのステータスが CREATE_COMPLETE に変更されるまで待ちます。スタック名は Excel ファイル名の小文字バージョンです。
  4. (オプション) インテントに E メールを入力した場合、サブスクリプションを確認するための E メールを受け取ります。[Confirm subscription] をクリックしてください。
  5. Amazon Lex コンソール を開き、ExcelLexBot を選択します。
  6. [OK] を選択します。Amazon Lex が、Lex Dispatcher Lambda 関数に対するリソースへのアクセス許可を更新します。AWS CloudFormation はすでにこの許可を Amazon Lex に付与していますが、ここで許可の追加をクリックしなければ、チャットボットのテスト時にこのポップアップが毎回表示されます。
  7. 左側の [Test Chatbot] バーを選択します。
  8. これで Amazon Lex コンソールからチャットボットをテストできます。
  9. このデプロイメントにはボットの例: ScheduleAppointment が含まれており、その例に従ってテストできます。
  10. Amazon DynamoDB コンソールを開くと、テーブル ChatBotMakeAppointmentIntent に新しいアイテムが含まれています。
  11. (オプション) インテントに E メールを入力した場合、インテント情報が記載された E メールを受け取ります。

コードフックの追加

このセクションでは、検証とフルフィルメントアクティビティのためのコードフックとして Lambda 関数を使用するように MakeAppointment インテントの設定を更新します。このコードフックに関する詳細については、ステップ 3: インテントの更新: コードフックを設定するを参照してください。

  1. GitHub の Deployment フォルダで、codehook.yamlcodehook.zip の 2 つのフォルダをダウンロードします。
  2. 前の ExcelLexBot のデプロイセクションにあるデプロイメントステップを繰り返します。
  3. スタックの名前とパラメータを指定します。
    1. スタックの名前: codehook (AWS リージョンにおけるスタックのための一意の名前)。
    2. SourceBucket: ExcelLexBot のデプロイのステップ 1 で作製した S3 ソースバケットの名前。
  4. コードフックステップのステータスが CREATE_COMPLETE に変更されるまで待ちます。
  5. チャットボットを再度テストできます。これにはボットの例: ScheduleAppointment と同じ機能があります。

チャットボットの更新と削除

S3 バケットから Excel ファイルを削除すると、チャットボットスタックが削除されます。警告! チャットボットスタックを削除すると DynamoDB テーブルも削除されるため、スタックを削除する前にデータをバックアップする必要があります。

更新を行うには、Excel を削除して、チャットボットスタックが完全に削除されるまで待ちます。その後、更新された Excel を Amazon S3 にアップロードします。

制限

  1. AWS マネジメントコンソールは入力を直ちに検証できますが、ExcelLexBot は入力を検証できません。
  2. Lex はボット全体のインテント、スロットタイプの再利用を許可しますが、Excel ベースのソリューションは独立性を前提としています。要するに、この制限を重要視しません。
  3. Amazon Lex は、活動的なコールをスロットリングすることによって自衛するため、複数の Excel ファイルまたはチャットボットスタックを同時に削除することはできず、同時に行われる「Bot API の削除コール」が多すぎる場合、Lex は「There is a conflicting operation in progress」(拮抗する操作が進行中です) というメッセージを返します。ただし、数個の Excel ファイルを Amazon S3 にアップロードすることによって、複数のチャットボットを同時に作成することは可能です。

まとめ

非技術系ユーザーは、新しいツールを学ぶことをためらう場合があります。しかし、サンプルの Excel ファイルをいくつか送り、スプレッドシートに質問を記入するように依頼すると、ほとんどのユーザーが気軽に記入することができます。

ExcelLexBot は、Excel を使ってチャットボットを簡単に構築するために役立ちます。IVE の教師は課題または評価を Word から Excel にコピーするだけで済み、その後私たちが Amazon AI サービスを導入して IVE 教育経験を強化することができます。

このプロジェクトは、クラウドおよびデータセンター管理の IT114115 副学士課程からの 4 人の生徒、Ka Wing LiTik Haang LauHo Yuk Hon、および Shi Sum Ma と共同で開発されました。また、生徒たちが AWS のサービスの使用方法を詳しく学ぶ助けとなる AWS Academy カリキュラムのおかげでもあります。


その他の参考資料

Amazon Lex を使った Bot の作成方法を学びましょう。


今回のブログの投稿者について

Cyrus Wong は、香港専業教育学院 (Lee Wai Lee) クラウドイノベーションセンターのデータサイエンティストであり、AWS コミュニティヒーローでもあります。Cyrus は、7 つの AWS 認定すべてに合格しており、オープンソースプロジェクト、ブログ記事、およびイベントを介して AWS 関連の知識を共有することを楽しんでいます。