(第三回)Amazon Lexを使ってチャットボットを作成する~Lambdaを使って動的に返答を作る~

(第三回)Amazon Lexを使ってチャットボットを作成する~Lambdaを使って動的に返答を作る~

目次

前回のおさらい
プロンプトとは?
固定のプロンプトを設定する
lambdaで動的にプロンプトを設定する
次回予告

前回のおさらい

前回は、情報の種類と値のセットであるスロットの設定を行い、例えばお花の本数やお花をあげるを相手を質問、回答するパターンを新規で追加するところまで作成しました。

スロットの中の設定で、プロンプトというものがありました。前回はさらっと流しましたが、このプロンプトというものがユーザへの質問の部分になります。
今回は、ボットからの質問の部分であるプロンプトの部分のカスタマイズをして、会話のバリエーションを増やしたいと思います。

プロンプトとは?

プロンプトとは、ボットからのユーザに投げかけられる質問の部分です。Amazon Lexの中では単純な文字列だけでなく、画像やマークアップでの表記、lambdaでの動的な指定ができるようで、今回はそれらを試してみようと思います。

固定のプロンプトを設定する

固定のプロンプト、つまりAという質問にBと回答していたものをCに変更、というものは比較的簡単にできます。
該当するスロットのセッティングの歯車をクリック

プロンプトの部分で変更や追加ができます。「What type of flowers would you like to buy?」を追加してみました。

画面上で追加したプロンプトが回答されました。プロンプトを単純に追加、というのは画面上で簡単にできました。

次に画像やボタンと組み合わせた表示も簡単なものであればGUIで設定できました。
プロンプトレスポンスカードという部分で以下のように入力します。分かりにくい部分のみ項目解説します。

  1. Image URL:表示した際にヘッダーに表示される画像です。URL指定が可能で、今回は商用利用可能なサイトからパスを取得して指定しました。
  2. Preview as :表示形式をどのようにするかを選択できます。フェイスブック、KIK※1、Slack、Twillio※2から選択、今回は見慣れているSlackを指定しました。(※1アメリカの若者の半数が使っているメッセージアプリのようです。日本では知名度かなり低い。※2電話やビデオ、テキストをWeb等のアプリケーションでやりとりするAPI)

✳︎がついている項目は必須です。空白のままsaveを押すと次のようなエラーが出ます。原因分かりにくく、リロードして再設定するまで解消しないのでご注意ください。
※どこかに鍵情報紛れていると嫌なのでマスクしますが、この赤枠の中にバイナリの情報がびっしり入ったエラーメッセージが出ます。

きちんと必須も入力されていれば、次のような形で表示されます。ボタンで選択肢が作れるのでモバイルで使うボットでは頻繁に使えそうです。

lambdaで動的にプロンプトを設定する

さて、プロンプトを固定で設定するのは比較的すんなりGUI上で設定できることが分かりましたが、やはりAWS上で動かしていることから、他のサービスを組み合わせてみたいと思います。lambdaと組み合わせることで動的にプロンプトを構成できるようなので試してみました。

よし!!Pythonでやってみるか!!と意気込んでいましたが、lambdaのテンプレをみてみると、すでにフラワーショップのパターンのテンプレがありましたので、一旦これを当ててみたいと思います。

lambdaのページに移り、設計図の部分にあるlex-order-flowers-pythonを選択。他のパターンもいくつかありました。

このように自動でPythonのコードが生成されるので一旦、このまま作成します。

再びAmazon Lexのページに戻って、lambda functionの部分に先ほど作成したラムダ関数をセットします。
それでは実際に動かしてみたいと思います。

さて、動いていますでしょうか。この流れは、

  1. お花が欲しい
  2. どんなお花が欲しいのですか?
  3. ギターです
  4. ギターという花は取り扱っていません、他のお花はいかがでしょうか。私のお店ではバラがもっとも人気があります

lambdaの関数を当てると、かなり回答が変わりました。Pythonの中ではどのあたりが効いているかみてみます。

def validate_order_flowers(flower_type, date, pickup_time):
    flower_types = ['lilies', 'roses', 'tulips']
    if flower_type is not None and flower_type.lower() not in flower_types:
        return build_validation_result(False,
                                       'FlowerType',
                                       'We do not have {}, would you like a different type of flower?  '
                                       'Our most popular flowers are roses'.format(flower_type))

該当の部分の処理がありました。このようにlambda関数を当てるとほとんど全ての回答をコードに任せられるので、実運用でボットを作る時は、GUIでの設定ではなく、lambdaでゴリゴリコードを書く形になりそうです。

次回予告

今回は、プロンプトをGUIで固定設定、lambdaを使って動的に設定、というところまで見ていきました。次回は、今回使用したテンプレのPythonを加工して、ボットの回答をもっと複雑にしてみたいと思います。