Amazon Lexのプレビューが通ったので使ってみた

2017.01.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、せーのです。今日は現在限定プレビュー中の新サービス「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_start_3

LexはまだプレビューのためIAMにAssumeRoleの選択肢がありません。なので一旦Lambdaを指定しておいて後で手で書き換えます。ポリシーもカスタムで書くので空のまま作ります。

lex_start_4

Roleを作り終わったらまずAssumeRoleを書き換えます。信頼関係の編集をクリックします。

lex_start_5

出てきたコードのLambdaの部分をlexに書き換えます。

lex_start_6

次にポリシーをカスタムで書きます。Lambdaを操作するのでInvokeアクションを許可します。

lex_start_7

次にLambda FunctionからCloudWatch Logsにログを吐くRoleを作成します。

lex_start_8

これもポリシーは空のままで作ってしまった後でカスタムでポリシーを追加します。

lex_start_10

Lambda Functionの作成

次にLambda Functionの作成です。BluePrintに今回作成するFlowerOrdersのサンプルがありますのでそちらを使います。

lex_start_17

Triggerは一旦スキップして、名前をつけたらRoleには先程作成した「Lambda FunctionからCloudWatch Logsにログを吐くRole」を選択します。

lex_start_18

lex_start_19

このままCreateを押せば完成です。テストもサンプルがあるのでやってみましょう。Actionsから[Configure test event]を選択し、LexのFlowerOrderのテストJSONを選択します。

lex_start_20

[Save and Test]を押してエラーがでなければ成功です。

lex_start_21

Lexの作成

さて、最後にLexの作成です。

lex_start_1

Get Startボタンを押すとカスタムBOTとサンプルを選択する画面が出てきます。OrderFlowersを選択し、上で作成した「LexからLambda Functionを操作するRole」を選択します。

lex_start_11

これでCreateボタンを押せばサンプルは既に完成しています。右下にTest用のウィンドウがあるのでTestしてみましょう。

lex_start_14

lex_start_15

[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を通じてお花の注文ができました。試しに言い方を少し変えてみます。

lex_start_16

最初に「お花を注文」ではなく「百合を注文」と指定してみました。そうするとお花の種類を聞く質問をスキップして日付を直接聞いていますね。また「明日」ではなく「次の土曜日」というように少し複雑な言い方をしてもそれが2017/01/14を指す、と理解しているようです。これが自然言語理解(NLU)と言われるものです。

次に作ったLambdaを当ててみます。「Fulfillment」にてLambda Funcctionを指定して先程作ったLambdaを指定します。

lex_start_22

[Save]にて設定を保存し[Build]ボタンでビルドします。Lexはバージョン管理が出来るので前の設定に戻ることも容易です。

lex_start_23

ビルドが済んだら再び同じようにテストしてみます。

lex_start_24

最後のメッセージが変わりました。これはLambda Functionにて指定されたメッセージです。

lex_start_27

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を指定します。

lex_start_25

[Save]して[Build]したら同じようにテストしてみます。

lex_start_26

6pmという時間指定に対して「営業時間内を指定して下さい」というチェックが入りました。これもLambdaの中に入っていたコードです。

lex_start_28

このようにして入力値チェックも簡単に行うことができます。面白いですね。

まとめ

いかがでしたでしょうか。まずはサンプルをサクッと触ってみました。次はカスタムBOTを作ってみたいと思います。

参考リンク