Amazon Lex で組み込みインテントを利用する

2018.01.09

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

渡辺です。

LexではAlexaと同様に組み込みインテントを利用することができます。 今日は、前回のHello Worldボットにインテントを追加し、機能追加を行ってみましょう。

ユーザの目的を表すインテント

Alexaでもインテントと呼ばれる概念が出てきます。 ひとつのボットにはひとつ以上のインテントを追加します。 多くのインテントがあるということは、そのボットが多くの機能を持っているということです。

インテントは、ユーザの目的を表します。 Hello WorldボットのHelloインテントは「Hello World!」と返すことを目的としています。 この時、「Hello」「Hey」といった挨拶がインテントを起動させる言葉です。

今回、同様に「OK」と返すことを目的としたインテントを作成してみます。 ここでは返す文字列が異なるだけですが、例えば、「お店の開店時間を返す」インテント、「お店の場所を返す」インテント、「予約を行うインテント」など、目的が明確な方がイメージしやすいでしょう。 「OK」と返す時の言葉は「Help」とします。

組み込みテント

インテントではサンプル発話(Sample utterances)を登録することで、ユーザが言いそうな言葉と、似た言葉に反応させることができます。 これはカスタムインテントと呼ばれます。 一方、よくある発話のセットは、組み込みインテントとして提供されています。

今回はAMAZON.HelpIntentを利用します。 このインテントは、利用方法などをユーザが求めているときに使う言葉、例えば「Help」などに反応するインテントです。 「Help me」「can you help me」といったフレーズにも反応します。

インテントを追加する

Hello Worldボットを開き、インテントを追加します。

Build-in IntentからAMAZON.HelpIntentを選択してください。 インテント名は「Help」とします。

Helpインテント追加後、Helloインテントと同様にLambdaを設定し、ビルドします。

ボットが「help」に対して反応するようになりました。

ただ、「Hello World!」と返してます。 これはLambdaが「Hello World!」のみを返す実装だからです。

Lambda関数を更新する

Lambdaには、どのIntentで呼び出されたかをイベントオブジェクトから取得できます。 event.currentIntent.nameからインテント名を判定し、返すメッセージを変更するようにLambdaのコードを修正してみます。

'use strict';

const getMessage = function(event) {
    switch (event.currentIntent.name) {
        case 'Help':
        return 'OK';
        default:
        return 'Hello World!';
    }
}

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

Lambdaを更新すると、「Help」や「Help me」で「OK」と返ってくるようになりました。

まとめ

Lexで作成するボットには、ユーザの目的毎に作成した複数のインテントを追加できます。 Lexでは、インテントが認識されると対応する処理(ここではLambda関数)が実行され、応答が返されるという仕組みです。

なお、Lambda関数は、インテント毎に設定できます。 ひとつのLambda関数で、インテントを判定し処理を分岐することも、インテント毎にLambda関数を定義することもできます。 ただ、共通処理が含まれる可能性が高いため、イベントでインテント名を判定して分岐する方が自然になるでしょう。