(最終回)Amazon Lexを使ってチャットボットを作成する~Lambdaの処理をいろいろ変更してみる~

(最終回)Amazon Lexを使ってチャットボットを作成する~Lambdaの処理をいろいろ変更してみる~

目次

前回のおさらい
lambdaの中身を見てみる①注文の種類
lambdaの中身を見てみる②日付の判別
まとめ
最後に

前回のおさらい

前回は、テキストや音声での入力ではなく、ボタン入力のコントロールや、lambdaを使って動的に返答を返すようにする方法を試してみました。

やはり触ってみて感じることは、標準のGUIで操作できる部分は制限があり、かつ学習コストも高そうなので、結局はlambdaで最初から書いていくのが良いのかな、という印象です。

ということで、前回はさらっと流す程度でしか触らなかったlambdaとの連携ですが、今回はそこを中心で試してみたいと思います。

lambdaを見てみる①注文の種類

roseだとないと言われるけど、rosesだと「いつとりにくる?」と会話が進む。

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))

flower_types = [‘lilies’, ‘roses’, ‘tulips’]
この配列に入っているか否かで判別しているので、ここに好きなものを入れてみます。

前回から同様にAmazonLexがまだ日本語に対応していないので英語にします。

flower_types = [‘lilies’, ‘roses’,’rose’, ‘tulips’]
こんな風に追加すると次のようにroseでも会話が続くので候補は全て定義するか、部分一致にするのが良いと思います。

ただ、部分一致にするとかなり短い単語で回答された時に引っかかってしまうので、全て定義する方がよさそうです。例えば、「Rose」ではなく「Ro」とか言われた時も反応してしまうのはNGです。

lambdaを見てみる②日付の判別

次に日付の考慮の部分です。
以下の部分が、「いつ取りにくるの?」「今日」「明日以降にしてください」という部分です。

if date is not None:
    if not isvalid_date(date):
        return build_validation_result(False, 'PickupDate', 'I did not understand that, what date would you like to pick the flowers up?')
    elif datetime.datetime.strptime(date, '%Y-%m-%d').date() <= datetime.date.today():
        return build_validation_result(False, 'PickupDate', 'You can pick up the flowers from tomorrow onwards.  What day would you like to pick them up?')

  • 「今日行きます」「明日以降にして」
elif datetime.datetime.strptime(date, '%Y-%m-%d').date() <= datetime.date.today():
         return build_validation_result(False, 'PickupDate', 'You can pick up the flowers from tomorrow onwards.  What day would you like to pick them up?')

この部分を以下のように変えてみます。

elif datetime.datetime.strptime(date, '%Y-%m-%d').date() <= datetime.date.today() + datetime.timedelta(days=1):
         return build_validation_result(False, 'PickupDate', 'You can pick up the flowers from two day after onwards.  What day would you like to pick them up?')

これで「明日」と回答しても「2日後以降にして」という風にかわりました。

lambdaを触っていて気が付いたのですが、lambdaはデプロイの時間が一瞬なので、やはりlambdaに全て任せる方が効率がよさそうです。

Amazon Lex側は何か変更してビルドするまで結構時間がかかります。

まとめ

  • シンプルなチャットボットであれば、Amazon Lex側のGUIの操作で作成可能
  • 条件分岐など付けたいときは、全てをlamdbaに任せる方が効率が良い
  • lambdaのテンプレートが用意されているので、部分的に流用していけばPythonを一から書く必要はない

最後に

いかがでしたでしょうか。全四回でGUIでポチポチ作ってみる部分から全てPythonに任せる方法までやってみました。次は何か実運用で使えそうなものが出来たらご紹介したいと思います。
料金的には、最初の一年は試用が出来ますので是非気軽に試してみていただければと思います。(※以下の抜粋を参照)

Amazon Lex は無料で試用できます。Amazon Lex の使用を開始した日から最初の 1 年間は、1 か月あたり最大で 10,000 回のテキストリクエストと 5,000 回の音声リクエストまたは音声間隔を処理することができます。
※2021年5月6日時点