Amazon Lexのボットは、サンプル発話に存在しない発話でもインテントが誘発されるケースがある
はじめに
AWS公式ドキュメントには明記されていませんが、Amazon Lexのボットは、サンプル発話に存在しない発話でもインテントを誘発することが分かりました。本記事では、この現象について検証し、解説します。
Amazon Lexは、音声やテキストによるアプリケーションの会話型インターフェースが構築できるAWSサービスです。
Lexボットは、主に 「発話(Utterances)」 と 「インテント(意図/Intent)」 で構成されています。
Lexにおける 発話とは、インテントを誘発させるユーザーの言葉のことです。 例えば、「ピザを注文したい」という発話は、「ピザ注文」のインテントを誘発します。
インテントは、ユーザーが実行したいアクションを表します。 例えば、「ピザ注文」や「注文状況確認」などがインテントとなります。ボットには少なくとも1つのインテントが必要です。
インテント内では、サンプル発話と呼ばれるインテントを誘発させる発話のバリエーションを設定します。
つまり、ユーザーの発話にもとづいて、ボット内の複数のインテントのサンプル発話から、適切なインテントが誘発されます。
これはAWSドキュメントにも記載されています。
しかし、サンプル発話として登録されていない発話でもインテントが誘発されることが確認されたため、この現象について詳細に検証します。
検証
ボット作成
Amazon Lexのコンソールで[ボットの作成]をクリックし、ボット名を入力します。その後、以下の設定に従って進めていきます。
言語設定で日本語を選択し、ボットの作成を完了します。
インテント作成
以下のインテントを作成しました。
サンプル発話は、以下のワードを設定しました。
- はい
- はい。そうです。
- そうです。
スロットは、名前用のスロットタイプAmazon.FirstName
を追加しました。
確認では、ユーザーが入力した名前を復唱させます。
[応答を閉じる]では、「完了しました。」のメッセージを設定しました。
これでボットをビルドします。
検証
作成したボットを使用してテストを実施します。
まず、サンプル発話として登録したフレーズでインテントが正しく誘発されるか確認します。
「はい」と入力すると、想定通りインテントが誘発されました。
次に、サンプル発話として登録されていないフレーズ「こんにちは」を入力しました。この場合、ボットはユーザーの入力に適合するインテントがないと判断し、FallbackIntent
が誘発されました。
今回の検証の主目的である、サンプル発話に登録されていないフレーズかつスロット値として有効な「タロウ」を入力した場合、インテントが誘発されることが確認できました。
さらに「タロウ」と入力すると、この値がスロットに正しく埋め込まれました。
最後に、名字を受け付けるスロットを追加し、再度、サンプル発話に登録されていない「タロウ」を入力してテストを行います。
「タロウ」を入力すると、インテントが誘発され、同時にスロット値として「タロウ」が正しく設定される挙動が確認できました。
次に「ヤマダ」を入力すると、この値が名字のスロットに埋め込まれ、設定した確認プロンプトが表示されました。
検証の結果、以下の点が確認できました。2024年7月9日時点での挙動となります。
- サンプル発話として登録されていないフレーズであっても、スロット値として有効な入力の場合、インテントが誘発される。
- 複数のスロットが設定されている場合、スロット値として有効な入力は、該当するスロットに自動的に埋め込まれる。
本記事の結果は、今回の特定の検証条件下でのものです。他の条件や設定では異なる結果が得られる可能性があります。AWS公式ドキュメントにこの挙動に関する明確な記載がないため、実際の使用時には個別に確認することをお勧めします。
最後に
今回の検証結果から、サンプル発話に登録されていないフレーズでもインテントを誘発できるため、Amazon Lexのボットは予想以上に柔軟な対応が可能であることが分かりました。
一方で、この柔軟性は意図しないインテントの誘発につながる可能性もあります。そのため、ボットの設計時には考慮しつつテストが必要です。特に、複数のインテントが存在する場合は、それぞれのインテントの境界を明確に定義し、適切なサンプル発話とスロットの設定を行うことが重要です。
もし、サンプル発話に指定した入力値に一致しない入力でのインテントの誘発を抑制したい場合、Lex ボットのコードフックに Lambda 関数を指定し、関数内でユーザー入力の検証を行うことで実現可能です。