Amazon Lexのプレビューが通ったので使ってみた
こんにちは、せーのです。今日は現在限定プレビュー中の新サービス「Amazon Lex」の申請が通ったのでとりあえず触ってみたいと思います。
本サービスは現在Limited Previewのため、GA(General availability: 一般利用開始)時には内容が異なる場合があります。
Amazon Lexとは
Amazon Lexは、音声とテキストを使用するあらゆるアプリケーションの会話型インタフェースを構築するためのAWSサービスです。くだけて言うと「会話の揺れを吸収しながら音声、またはテキストで任意のサービスを提供できるBotサービス」という感じです。例えばホテルの予約サイトにLexを組み込むとテキストで「明日の空きはある?」と聞くと「何名様ですか?」「お好みの部屋タイプはありますか?」などを返し、「明日」が「1月10日」でも「今度の日曜日」でもLexが解釈して通してくれる、というものです。 BotはWebアプリやモバイルの他にもFacebook Messenger等のサードパーティのチャットプラットフォームにも組み込み可能です。またバックエンドはLambdaやDynamoDBなどAWSの様々なリソースに渡す事ができます。またLambdaを通じてSaaSアプリにもつなげることが出来るのでリクエストを処理しながら客層分析をする等さまざまなユースケースに適用することができます。
触ってみた
では触ってみましょう。今回は[FlowerOrders]というお花を注文するBotを作ってみたいと思います。
IAM Roleの作成
まずはIAM Roleを作成します。作成するのは「LexからLambda Functionを操作するRole」と「Lambda FunctionからCloudWatch Logsにログを吐くRole」の2つです。
最初にLexからLambda Functionを操作するRoleを作ります。
LexはまだプレビューのためIAMにAssumeRoleの選択肢がありません。なので一旦Lambdaを指定しておいて後で手で書き換えます。ポリシーもカスタムで書くので空のまま作ります。
Roleを作り終わったらまずAssumeRoleを書き換えます。信頼関係の編集をクリックします。
出てきたコードのLambdaの部分をlexに書き換えます。
次にポリシーをカスタムで書きます。Lambdaを操作するのでInvokeアクションを許可します。
次にLambda FunctionからCloudWatch Logsにログを吐くRoleを作成します。
これもポリシーは空のままで作ってしまった後でカスタムでポリシーを追加します。
Lambda Functionの作成
次にLambda Functionの作成です。BluePrintに今回作成するFlowerOrdersのサンプルがありますのでそちらを使います。
Triggerは一旦スキップして、名前をつけたらRoleには先程作成した「Lambda FunctionからCloudWatch Logsにログを吐くRole」を選択します。
このままCreateを押せば完成です。テストもサンプルがあるのでやってみましょう。Actionsから[Configure test event]を選択し、LexのFlowerOrderのテストJSONを選択します。
[Save and Test]を押してエラーがでなければ成功です。
Lexの作成
さて、最後にLexの作成です。
Get Startボタンを押すとカスタムBOTとサンプルを選択する画面が出てきます。OrderFlowersを選択し、上で作成した「LexからLambda Functionを操作するRole」を選択します。
これでCreateボタンを押せばサンプルは既に完成しています。右下にTest用のウィンドウがあるのでTestしてみましょう。
[I would like to order some flowers(お花を注文したいのですが)] [What type of flowers would you like to order?(どんなお花が宜しいですか?)] [roses(バラをお願いします)] [What day do you want the roses to be picked up?(お日にちはいつにしますか?)] [tomorrow(明日で)] [Deliver the roses at what time on 2017-01-06(2017/01/06の何時にお届けしましょうか?)] [6pm(午後6時で)] [Okay, your roses will be ready for pickup by 18:00 on 2017-01-06. Does this sound okay?(わかりました。2017/01/06 18:00にお届け致します。よろしいですか?)] [ok(はい)] [FlowerType:roses PickupDate:2017-01-06 PickupTime:18:00]
こんな感じでBOTを通じてお花の注文ができました。試しに言い方を少し変えてみます。
最初に「お花を注文」ではなく「百合を注文」と指定してみました。そうするとお花の種類を聞く質問をスキップして日付を直接聞いていますね。また「明日」ではなく「次の土曜日」というように少し複雑な言い方をしてもそれが2017/01/14を指す、と理解しているようです。これが自然言語理解(NLU)と言われるものです。
次に作ったLambdaを当ててみます。「Fulfillment」にてLambda Funcctionを指定して先程作ったLambdaを指定します。
[Save]にて設定を保存し[Build]ボタンでビルドします。Lexはバージョン管理が出来るので前の設定に戻ることも容易です。
ビルドが済んだら再び同じようにテストしてみます。
最後のメッセージが変わりました。これはLambda Functionにて指定されたメッセージです。
Fulfillmentとは「達成」「完遂」というような意味があります。つまりFulfillmentにLambda Functionを設定すると以前のやり取りにて得られたデータをLambda Functionになげ、Lambdaにて処理した後にレスポンスをコールバックとして返すことができます。ちなみに渡す情報はこのような形になります。
{ "currentIntent": { "slots": { "PickupDate": "2030-11-08", "PickupTime": "10:00", "FlowerType": "lilies" }, "name": "OrderFlowers", "confirmationStatus": "None" }, "bot": { "alias": "$LATEST", "version": "$LATEST", "name": "OrderFlowers" }, "userId": "John", "invocationSource": "DialogCodeHook", "outputDialogMode": "Text", "messageVersion": "1.0", "sessionAttributes": {} }
[slots]の部分がBOTとのやり取りで得られた情報で、後はLexの設定情報になりますね。
では最後に同じLambdaを使って入力値のチェックをしてみましょう。LexのバージョンからLatestを選ぶと再び編集できるようになりますのでOptionsの[Initialization and validation code hook]にチェックを入れて同じLambda Functionを指定します。
[Save]して[Build]したら同じようにテストしてみます。
6pmという時間指定に対して「営業時間内を指定して下さい」というチェックが入りました。これもLambdaの中に入っていたコードです。
このようにして入力値チェックも簡単に行うことができます。面白いですね。
まとめ
いかがでしたでしょうか。まずはサンプルをサクッと触ってみました。次はカスタムBOTを作ってみたいと思います。