スロット値の解決とLexによる機械学習

2018.05.29

聖闘士カースト上位の乙女座、渡辺です。

Lexでは、ユーザからの発話の一部をパラメータのように扱う場合、スロットを利用します。 スロットを利用することで、数量・地域名・サイズといった可変となる値を処理できます。 この時、値の解決方法が2つあり、適切に設定しなければなりません。

例えば、ある占いボットで12星座名(〜Pisces)をスロット値として持つとします。 このスロットはZodiacSignとして定義され、次のようなサンプル発話がインテントに登録されます。

Tell me the prediction for ​{Sign}​

ユーザが、「Tell me the prediction for Virgo​」と発話したならば、スロット値Signに、Virgoが入るイメージです。

スロットのvalueSelectionStrategy

PutSlotType APIを見ると、スロットには、valueSelectionStrategyというパラメータがあります。 このパラメータは、Lexがスロット値を解決するためのストラテジ(アルゴリズム)を指定します。 ストラテジとして設定可能なのは、ORIGINAL_VALUETOP_RESOLUTION です。

マネジメントコンソールでは、 valueSelectionStrategyは、Slot Resolutionの項目で設定します。 解りにくいですが、「Expand Values」を選択するとORIGINAL_VALUEとなり、「Restinct to Slot values and Synonyms」を選択するとTOP_RESOLUTIONです。

ORIGINAL_VALUE

valueSelectionStrategy が ORIGINAL_VALUE の場合、 スロット値の解決に機械学習が働きます 。 Lexは、スロット値が、スロットに定義されている値やシノニム以外の場合であっても、他の情報からスロットの値と認識することが可能です。 例えば、ZodiacSignには、「Earth」は含まれていません。 しかし、ユーザが「Tell me the prediction for Earth」と発話した場合、Lexは他の登録された12星座(Aries〜Pisces)からEarthがZodiacSignであると推論し、スロット値とします。

このため、スロット値には予想外の値が含まれる可能性が高いです。 その スロット値が有効な値かどうか、Lambdaで判定しなければならない でしょう。

TOP_RESOLUTION

valueSelectionStrategy が TOP_RESOLUTION の場合、 スロット値の解決に機械学習が働きません 。 スロットに定義されている値とシノニム以外をスロット値として認識しません。

例えば、ZodiacSignには、登録された12星座(Aries〜Pisces)以外を拾うことがありません。 他にもピザのサイズや、注文可能なメニューなど、Lex側が「これもスロットでは?」と推論されると困る場合、TOP_RESOLUTIONを指定すると良いでしょう。

まとめ

Lexのスロットタイプは、機械学習による推論を有効にするかどうかを設定できます。 スロットタイプやボットの性質によって、適切なストラテジを設定してください。

占いボットであれば、ZodiacSignはTOP_RESOLUTIONが良さそうです。 聖闘士をネタにしたボットであれば、ZodiacSignをORIGINAL_VALUEにして面白い応答を返すことができるでしょう(:p