AWSを活用してLINEチャットボットを作ってみた!②

こんにちは、宮内です。
前回は、LINEボットの作成とLambdaの連携まで説明しました。
今回は、Amazon Lexを利用したチャットボットの作成について説明します。

Amazon Lexとは

Amazon Lexは、音声やテキスト(自然言語)を使用した会話型インターフェースを構築するサービスです。
今回の通知サービスでは、利用者の登録機能で使用します。
利用者の登録処理では、ユーザから取得する画像や氏名といった情報を保持する必要がありますが、Lambdaだけではデータの保持ができないため、Amazon Lexを利用して管理します。

Amazon Lex 利用イメージ

Amazon Lexの概要は、以下のページを参照ください。

Amazon Lex – 会話型 AI で Chatbot を構築

aws.amazon.com

Amazon Lex V2でボット開発

Amazon Lexには、V1とV2の2つのバージョンが存在しており、どちらも日本語対応しています。
V1とV2では利用可能なAPIが異なっているなど、仕様の違いはありますが、どちらのバージョンでも開発可能です。
今回は、Amazon Lex V2を利用してチャットボットを作成します。

ボット作成

Amazon Lexのコンソール画面にある、「ボットを作成」をクリックします。
※V1でボットを作成する場合は、左側のメニューにある「V1コンソールに戻る」をクリックします。

Amazon Lex ボット作成

ボットの作成方法は、空のボットを選択します。

Amazon Lex ボットの作成方法

ボット名と作成するボットの説明を入力します。

Amazon Lex ボットの設定

今回、IAMロールは基本的なAmazon Lex権限を持つロールを作成します。

Amazon Lex IAMロールの設定

児童オンラインプライバシー保護法(COPPA)に関しては、ボットの利用者や扱う情報に応じて選択します。
セッションタイムアウトはそのままの設定(5分)とします。

Amazon Lex COPPA セッションタイムアウトの設定

タグは任意に設定して、次へをクリックします。

Amazon Lex タグ設定

次に、使用する言語を設定します。
言語は日本語(JP)を選択し、他の項目はデフォルト値のままでOKです。完了をクリックします。

Amazon Lex 言語設定

数秒待つと、ボットが作成されます。

Amazon Lex ボット作成完了

作成直後はボットの中身がない(=対話することができない)状態なので、次に対話フローを作成します。

対話フローの構成

今回は、通知サービスの利用者を登録する対話フローを作成します。
利用者登録用のインテントを作成し、スロット(対話を完了させるために必要なパラメータ)は、利用者の画像と利用者の名前の2つを設定します。

利用者の画像の情報は画像データそのものではなく、LINEから画像を送信した時のメッセージIDをスロットに設定します。
メッセージIDを控えておくことにより、LINEのMessaging APIを利用して画像データを取得します。
コンテンツ取得APIに関しては、以下のページを参照ください。

Messaging APIリファレンス – コンテンツを取得する

developers.line.biz

対話フローの構成は以下の通りです。
インテントはユーザの目的に応じて作成します。今回は利用者を登録することを目的としたインテントになります。
サンプル発話やスロットなど、他のキーワードについては後ほど説明します。

Amazon Lex 対話フロー

対話フローの作成

ボットを作成すると、「NewIntent」というインテントが自動作成されるので、このインテントを編集します。
まずは、インテント名とインテントの説明を変更します。

Amazon Lex インテント詳細

次に、サンプル発話(対話のトリガーとなるキーワード)を設定します。
今回は先ほどの構成通り、createUserを設定します。
この設定により、ユーザが「createUser」というメッセージをLINEで送信することでチャットボットが起動します。

Amazon Lex サンプル発話

次はスロットの編集です。
スロットを追加をクリックします。

Amazon Lex スロット

追加するスロットの設定を行います。
必須項目の場合は、「このインテントには必須」にチェックを入れておきましょう。
スロット名とスロットタイプ、プロンプト(値の入力を促すために、ボットが発言する内容)を入力して、追加をクリックします。

Amazon Lex 追加スロットの詳細

ちなみに、スロットタイプに設定している「Amazon.Number」ですが、組み込みスロットタイプと呼ばれており、入力した値が数値(Number)かどうかを自動的に判定してくれます。
数値でない場合(英字が含まれている場合など)は、プロンプトの内容を再び発話して、userImageIdを再入力するように促してくれます。

同様の手順で userName のスロットも追加します。
ちなみに、複数のスロットを設定した場合、上にあるものから順番にボットが入力を促します。
スロットの順番を変更したいときは、ドラッグ&ドロップで順番を入れ替えましょう。

Amazon Lex スロット追加

次に、スロットを全て埋め終わった後の登録確認メッセージと、登録を拒否した場合のメッセージを設定します。
確認プロンプトで設定している {userName} ですが、これは上で設定したスロット userName で入力された値を参照することを意味しています。

Amazon Lex 確認プロンプトと応答拒否

次に、フルフィルメント処理(スロットの値が全て埋まり、確認プロンプトで登録処理を許可した場合に実行される処理)が成功した場合と、失敗した場合のメッセージを設定します。
※フルフィルメント処理ではLambda処理を行いますが、実行するLambda処理をまだ作成していないため、次回の記事で設定を行います。

Amazon Lex フルフィルメント

次に、インテントの保存をクリックして、変更内容を保存します。

Amazon Lex インテントの保存

保存が完了したら、構築をクリックします。
ボットの構築には数十秒かかります。

Amazon Lex ボットの構築

対話フローのテスト

構築が完了したら、対話フローを確認するためにテストをクリックします。

Amazon Lex ボットのテスト

すると、画面の右側にチャットエリアが表示されます。
ここにテキストを入力していくことで、チャットボットとの対話を確認することができます。

Amazon Lex テストチャット

登録完了まで行ったチャットはこちらです。
画像データは送信できないので、代わりにダミーのメッセージIDを送っています。
画像を送信するところで数字以外を含んだメッセージを送ると、質問を聞き返していることが確認できます。

Amazon Lex 対話フローの確認

また、チャットエリアの上部にある検査をクリックすると、スロットの状態や、Amazon Lexに対するリクエストと応答(レスポンス)のJsonデータを確認することができます。
このJsonのデータを元に、次回の記事ではLambdaを作成します。

Amazon Lex 入出力データの検査

以上で、Amazon Lexによるボット開発は完了です!

さいごに

今回は、Amazon Lex V2を使用したチャットボットの開発を行いました。
対話フローを作成しただけのような印象を受けますが、LambdaからAPI処理を実行することで、チャットボットとして活躍するようになります。
次回は、チャットボットとLambdaを統合して、利用者の登録と到着通知をLINEで動かしてみたいと思います!

AWSLex

Posted by koukimiy