はじめての Amazon Lex V2 として BankingBot 作成のハンズオンをやってみた

Amazon Lex をとりあえず触ってみたいなというあなたに。

コンバンハ、千葉(幸)です。

  • Amazon Lex なるチャットボットの構築が手軽にできるサービスがあるらしい
    • そして最新版は V2 らしい
  • とりあえずどんなものか手を動かして確かめてみたい
  • マネジメントコンソール上でポチポチやって完結すると嬉しい
  • かと言ってボリュームが少なすぎると学びが少ない気がするので適度にボリュームがあって欲しい

……そんな思考を連ねていたわたしにぴったりなハンズオンを見つけました。以下です。

全編英語ですが、ブラウザの翻訳機能を使えば特に問題にならないかと思います。90 分くらいかけて Amazon Lex のコンポーネントが大体理解できたので、ハンズオンの内容をご紹介します。

Amazon Lex V2 ハンズオンで何を作成するか

最初に全体像を押さえておきましょう。作成する Amazon Lex のリソースの関係性を図に起こしてみたものが以下です。

Amazon Lex での一番大きな括りのリソースとしてボットを作成します。今回は BankingBot という、銀行口座の取引を想定したボットを作成します。

ボットの中ではバージョンを定義でき、バージョンごとに使用する言語を管理できます。今回のハンズオンでは英語とスペイン語の言語を使用します。

言語ごとにインテントと呼ばれるリソースを作成します。インテントとは「意図」を意味し、ユーザーが実行したいアクションを表します。今回の Banking では、「残高をチェックする」「資金を移動する」といったインテントを作成します。

インテントではアクションの実行に必要な入力データをスロットとして定義します。BankingBot では操作を行う口座の対象を示す「accountType」や、本人認証のために使用する生年月日を表す「dateofBirth」といったスロットを使用します。スロットのデータの種類を表すスロットタイプは、事前定義された組み込みスロットタイプと独自に作成するカスタムスロットタイプがあります。

バージョンにはエイリアスを関連付けられ、エイリアス内の言語ごとに Lambda 関数を設定できます。Lambda 関数はインテントから初期化、検証、実行(フルフィルメント)のために呼び出されます。BankingBot では2つのインテントから「実行」のために呼び出されます。

(図ではバージョンとエイリアスが複数存在するように表現していますが、ハンズオンで作成するのはそれぞれひとつのみです。)

ハンズオンでは上記のリソースを一通り作成し、Lex コンソールから Bot のテストを行うところまでをスコープとします。英語、スペイン語それぞれでリソースを作成する内容となっているのですが、両者は特に関連しないためわたしは英語のみを試してみました。全体の所要時間は 90 分程度で、インテントの作成が大きな割合を占めました。

言語を日本語にしても試せる?

せっかくならボットの言語を日本語にして試したい、と思うかもしれません。わたしは思いました。

できないことはないのですが、いきなりそれで試すのはオススメしません。発話(ユーザーがインテントを呼び出す時のフレーズ)やプロンプト(ボットからの応答)、インテントが呼び出す Lambda 関数が英語/スペイン語でのみ用意されているので、そこを自前で変換してあげる必要があるためです。

ボットに後から言語を追加することもできるので、まずは手順通りに作ってみて、後から日本語の言語を追加する、という方が理解しやすいと思います。

Amazon Lex ハンズオンの注意点

概ねハンズオンの手順通りに進めていけば問題ないのですが、一点コンソールのデザインが変わっていた部分があるので注意が必要です。

インテントから Lambda 関数を呼び出すためのコードフックの設定を行う部分があり、ハンズオンの画像では以下のように示されています。(画像は引用したもの)

Module_3__Configure_the_bot_for_US_English

2022年4月時点では該当箇所が以下のように変わっており、フルフィルメントのための設定ができません。

Lex_Console-1227617

代わりに、「フルフィルメント」というセクションから指定が必要です。以下の「詳細オプション」を押下します。

Lex_Console-1227678

詳細オプションの設定画面に移るため、ここでチェックを入れることでコードフックの設定ができます。

Lex_Console-1227746

わたしは気づかず誤った設定で進めてしまって少しハマったので、試す時は念頭に置いていただければと思います。

Amazon Lex V2 ハンズオンやってみた

全体の構成は以下のようになっています。

  • モジュール1. ボットの基本的な概念
  • モジュール2. ボットの作成と言語サポートの追加
  • モジュール3. ボットの設定(英語)
  • モジュール4. ボットの設定(スペイン語)
  • モジュール5. ボットのテスト

先述の通りわたしはスペイン語の設定をスキップしたので、モジュール4は丸々割愛しました。順に説明していきます。

モジュール1. ボットの基本的な概念

特に手を動かす部分はありません。今回作成するボットの概要と、以下のAmazon Lex におけるコンポーネントの説明がなされます。

  • インテント
  • 発話
  • スロット
  • プロンプト
  • フルフィルメント

モジュール2. ボットの作成と言語サポートの追加

Amazon Lex のボット作成、Lambda 関数の作成、Lambda 関数の呼び出し設定までを行います。

ステップ1. AWSアカウントへのサインイン

詳細は割愛します。

ステップ2. ボットの作成

Amazon Lex コンソールからボットの作成画面に遷移し、以下のような設定で次に進みます。

言語の設定をして「完了」を押下します。言語は後からでも追加できます。

Amazon_Lex_Handson

ボットの作成が完了すると「インテント」の画面に遷移しますが、一旦次の手順に移ります。

ステップ3. Lambda 関数の作成

ハンズオンページからソースコードがダウンロードできるため、それを利用して以下の Lambda 関数を作成します。

  • BankingBotEnglish
  • BankingBotSpanish

ステップ4. Lambda 関数のボットへの追加

ステップ2 でボットを作成したことにより、ボットのデフォルトバージョンおよびそれに関連づくエイリアス TestBotAlias が作成されています。

エイリアスの画面から、作成した Lambda 関数の追加を行います。エイリアスの画面の「言語」から、言語ごとに設定します。

ソースとして、先ほど作成した Lambda 関数を選択します。

Lex_Console-0886277

スペイン語の設定を行う場合は同様の手順を繰り返します。

モジュール3. ボットの設定(英語)

作成したボットにインテントを割り当てていきます。使用するインテントは以下の通りです。

ステップ インテント名 作成方法
1 Welcome 既存のものをリネーム
2 CheckBalance 新規作成
3 FollowupBalance 新規作成
4 TransferFunds 新規作成
5 FallbackIntent 組み込みインテント

また、ステップ2 でカスタムスロットタイプとしてaccountTypeを作成します。

ステップ1. Welcome インテントの作成

ボットを作成した際にNewIntentというインテントが作成されているため、それをリネームしてWelcomeインテントにします。

サンプル発話、クロージングの際の応答を指定し、保存/ビルドを行います

Amazon_Lex_Intent

ビルドが済むとテストが可能となり、Lex コンソール上で対話可能になります。

サンプル発話で指定したキーワードを入力すると指定した応答が返ってきて、関係ないキーワードだと組み込みインテントFallbackIntentが呼び出されます。FallbackIntentはステップ5で設定します。

Lex_Console

ステップ2. CheckBalance インテントの作成

インテントを作成する前に、インテントで使用するカスタムスロットタイプaccountTypeを作成します。

こうして……

Lex_Console-0887555

こうして……

Lex_Console-0887606

こうです。

screencapture-ap-northeast-1-console-aws-amazon-lexv2-home-2022-04-25-20_55_48

続いてインテントCheckBalanceを作成していきます。

こうして……

Lex_Console-0887129

こうして……

Lex_Console-0887173

こうです。ここのインテントで、冒頭で述べたコードフックの設定の注意点を思い出してください。

Amazon_Lex_Intent-1234219

このインテントのサンプル発話では{accountType}という形式でスロットが指定されており、そのスロットでは事前作成済みのカスタムスロットタイプaccountTypeが使用されています。

スロットタイプ値として定義済みのChecking Savings Creditのみが使用できる状態です。

ステップ3. FollowupBalance インテントの作成

続いて 3 番目のインテントを作成します。ここでもコードフックの部分を注意してください。

Amazon_Lex_Intent-1234988

ステップ4. TransferFunds インテントの作成

4つ目のインテントを作成します。スロットが3つであったり拒否時のレスポンスを設定したりなど、これまでのインテントと異なる部分があります。

Amazon_Intent

ステップ5. FallbackIntent インテントの設定

組み込みインテントであるFallbackIntentの設定をします。

ここまでのインテントで呼び出されるものがなかった場合にこのインテントが呼び出されます。応答メッセージを返すように設定します。

Amazon_Lex_FallbackIntent

長かったモジュール3 が終了です。

モジュール4. ボットの設定(スペイン語)

言語:スペイン語で同様にインテント等の設定を行います。わたしはスキップしました。

モジュール5. ボットのテスト

作成したボットのテストを行います。ハンズオンに記載された通りのメッセージを順にタイプすることで、各インテントが呼び出される様子が確認できます。

テスト時に「検査」を押下することで、呼び出されているインテントや入力済みのスロット、アクティブなコンテキストなど、より詳細な情報が確認できます。

Lex_Console-1306640

インテントで設定したサンプル発話と完全一致していなくても、ある程度柔軟に解釈してくれる様子も見て取れます。

後片付け

今回作成したリソースとして以下があります。

  • Amazon Lex ボット
  • Lambda 関数
    • Lambda 関数実行ログの出力先の CloudWatch ロググループ

CloudWatch Logs ロググループ以外は呼び出しを行わない限り料金が発生しないため、今後のために残しておく、というのもありでしょう。

終わりに

Amazon Lex V2 のボットを作成するハンズオンを試してみました。

おさらいとして再掲すると、以下のリソースを作成しました。

ひとまず AWS マネジメントコンソール上でボットのテストまで行えるところまで試せました。こういったボットは Slack などのメッセージングプラットフォームや Amazon Connect と連携させたり、以下のような仕組みを利用して Web UI を通じて利用できるようです。

Amazon Lex についてもう少し網羅的に確認したい、という場合は以下もあわせてご参照ください。

これから Amazon Lex を試してみたい、という場合の参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。