[Amazon Lex] AMAZON.FallbackIntentを利用すると自由自在なエラー制御が可能になる

2019.10.05

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Lex(以下、Lex)では、一部(AMAZON.YesIntent、AMAZON.NoIntent)を除いて、Alexaの組み込みインテントが使用できます。今回は、無効な発話があった時に、それを受けとめることができるAMAZON.FallbackIntentの動作を確認してみました。

実は、昨日、AWS Machine Learning Blogで下記の記事を見つけ、試してみたくなったと言う感じです。

Managing conversation flow with a fallback intent on Amazon Lex

注:AMAZON.FallbackIntentは、2019/10現在、英語とドイツ語しか対応しておらず、日本語Alexaでは、利用できません。

動作確認のためのボットは、テンプレートで提供されているOrder Flowersを使用して作成しました。

2 Error handling

最初に、Error handlingの動作について再確認しておきます。

Error handlingは、用意されているインテントや、待ち受けているダイアログで、ユーザーから有効な発話が得られなかった時の動作を設定するものです。

下記は、Order Flowersで定義されているものです。

期待する発話が得られなかった時、最初にClarification promptsで設定された誘導のためのレスポンスが返されます。そして、それが2回(Maximum number of retries)繰り返された時、Hang-up phraseを返してセッションは切断されます。

ちなみに、Custom botで、一から作成した場合のError handlingは、以下のようになっています。

3 AMAZON.FallbackIntent

AMAZON.FallbackIntentを使用して、インテントを追加すると、通常のインテントの定義と同じような以下のような画面になります。

(1) Clarification prompts

注意書きにあるように、AMAZON.FallbackIntentは、Error handlingClarification promptsに定義されているプロンプトが発話された後に呼び出されます。

例えば、Maximum number of retriesを2と設定していれば、2回、Error handlingのレスポンスが返された後、やっと、AMAZON.FallbackIntentが呼ばれることになります。

このことから、Clarification promptsのチェックは、通常、外すべきでしょう。

(2) Hang-up phrase

AMAZON.FallbackIntentを追加すると、Error handlingの画面には、Hang-up phraseが無効になるとの記載が追加されます。こちらは、AMAZON.FallbackIntentのFullfillmentのレスポンスが上書きされるという事です。

(3) Lambda function

Fullfillmentでレスポンスを返すだけであれば、Error handlingとあまり大差無いのですが、ここでは、Lambdaファンクションが設定できるので、これを使用することで、Error handlingよりも格段に自由度が上がり、優れたUXを構築することが可能になると言えると思います。

4 強制的なインテントへの遷移

サンプルとして、FullfillmentでLambda functionを定義してみました。

コードは、下記のとおりです。元々唯一のインテントであった、OrderFlowersのダイアログに、ElicitSlotで強制的に入れています。

Alexa SDKを利用したことがある方は、比較的、馴染みやすいコードになっていると思うのですが、Lax用のLambdaをAlexa SDK風に書ける超便利なライブラリlex-sdkを使用しています。(ステマ)

furuya02/lex-sdk

import * as Lex from 'lex-sdk';

let bot: Lex.Bot;
exports.handler = async function (event: Lex.IntentRequest, context: any) {
if (!bot) {
bot = Lex.BotBuilder()
.addRequestHandler(
FallbackIntentHandler)
.create();
}
return bot.invoke(event, context);
}

const FallbackIntentHandler: Lex.RequestHandler = {
canHandle(h: Lex.HandlerInput) {
return (h.intentName == 'FallbackIntentSample')
},
handle(h: Lex.HandlerInput) {
// お花の注文しか受けられないことを告げ、OrderFlowersインテントのダイアログに遷移させる
const intentName = 'OrderFlowers';

const slotType = 'FlowerType';
const message = {
contentType: Lex.ContentType.PlainText,
content: `Sorry, I can only help with order flowers. What type of flowers would you like to order?`
};
return h.responseBuilder.getElicitSlotResponse(intentName, h.slots, slotType, message);
}
}

上のコードで、OrderFlowersで無効と判断されたセッションは、ElicitSlotdialogActionを受け取ることで、何事もなかったようにOrderFlowersのダイアログに巻き込まれます。

'dialogAction': {
'type': 'ElicitSlot',
'intentName': 'OrderFlowers',
'slots': {},
'slotToElicit': 'FlowerType',
'message': 'Sorry, I can only...'
}

そして、実行結果です。

5 最後に

今回は、AMAZON.FallbackIntentで、Lexのエラー制御を作成してみました。

AMAZON.FallbackIntentでは、Lambdaを使用することで、非常に自由度の高い設計が可能になります。 ボットの種類や内容、そして、利用される状況に合せて、色々検討すると面白いと思います。

6 参考リンク

Managing conversation flow with a fallback intent on Amazon Lex

[Amazon Lex] Alexa SDK V2 みたいに書けるSDKを雑に作ってみました