Amazon Lex で Hello World

2018.01.05

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

渡辺です。

限定的ですが日本でもEchoが発売され、Alexaが日本語を喋るようになりました。 Lexにも期待が膨らむところです。 これまでもブログでLexの紹介がありましたが、今回はブループリント(設計図)を使用せず、カスタムボットを作成してみます。

なお、2018年1月時点で、Lexは東京リージョンで利用できません。

Hello Worldボットを設計する

今回作成するボットは、話しかけると「Hello World!」と答えるだけのボットです。 しかし、何を話しかけても「Hello World!」と答えるわけではありません。 「Hello」や「Hey」などボットに話しかけると、「Hello World!」と返します。

ボットを作成する

はじめにボットを作成します。

AWSのマネジメントコンソールからLexの画面を開き、ボットを作成します。 「Custom Bot」を選択し、Bot Nameに「HelloWorld」、Output voiceに「None」、Session timeoutに「5」min、COPPAに「No」と設定し、「Create」ボタンをクリックします。 現時点で言語設定(Language)はEnglish(us)固定です。

インテントを追加する

ボットには1つ以上のインテントを追加する必要があります。 インテントはユーザの目的を表し、ユーザからの入力をモデル化したサンプル発話とスロットで構成されます。 くだけて言うのであれば、ユーザが発言しそうな言い回しを登録し、インテントに一致すると処理が行われるようなイメージです。

ここでは、ユーザが挨拶をボットにするイメージで、Helloインテントを作成します。 インテントの名前を「Hello」とし、インテントを作成したならば、サンプル発話(Sample utterances)に「Hello」を追加してください。

これで、Lexに「Hello」と話しかけることで、HelloWorldボットが応答する設定が完成しました。 続けて応答メッセージを作成する実装を追加します。

Lambda関数を作成する

ボットの応答をプログラミングするにはLambdaが最適です。 LambdaではLexからイベントを受け取り、応答メッセージを返す処理を実装します。 必要に応じて、他のAWSリソースや外部APIを呼び出すことができるでしょう。

ここでは、単純に「Hello World」とメッセージを返すだけのシンプルなコードをNode.jsで作成しました。

'use strict';

exports.handler = function(event, context, callback) {
    console.log(JSON.stringify(event));
    var message = 'Hello World!';
    var response = {
        sessionAttributes: event.sessionAttributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState: 'Fulfilled',
            message: {
                contentType: 'PlainText',
                content: message
            }
        }
    };
    callback(null, response);
};

callback関数で、レスポンスとなるオブジェクトを返すだけの実装です。

このコードをLambda関数「hello-world」として作成します。 ランタイムは「Node.js 6.10」を選択し、ハンドラは「index.handler」としてください。

LexからLambdaをフックする

Lexではユーザからの入力がインテントを満たした時、Lambdaをフックすることができます。 Helloインテントが呼ばれたとき、すなわちユーザが挨拶をしたとき、Lambdaを実行するように設定します。

Helloインテントの FulfillmentにLambda関数「hello-world」を設定してください。

インテントの設定とLambdaの設定が完了したならば、ビルドを行います。

動作確認する

ボット画面右側のチャットウィンドウで動作確認をしてみましょう。 Helloインテントのサンプル発話に登録した「Hello」と入力すれば、「Hello World」と返ってきました。 Lambda関数が呼ばれ、適切なレスポンスが返ってきているからです。

しかし、「Hi」と入力した場合、「Sorry, can you please repeat that?」と返ってきます。 これはHelloインテントと判断されなかったため、Lexが応答を返しています。 サンプル発話を追加し、色々な挨拶を追加しなければなりません。

サンプル発話を追加する

幾つかのフレーズを追加してみましょう。 「Hey」「Hi」「Good morning」の3つを追加してみました。 追加したならばビルドしなおしてください。

ビルドが終わると、追加したフレーズでも「Hello World」と返ってきます。

次のステップへ

今回は、Lexを構成する最小限の構成でボットを作成してみました。 ポイントは、インテントで起動するLambda関数を作成することと、インテントを認識するためのサンプル発話を登録することです。 インテントのサンプル発話はDeep Learningが効いてくる部分です。 言いそうなフレーズを追加することで、似たようなフレーズも拾ってくれるのがLexの凄いところです。