Amazon Lex V2 のスロットタイプで Composite スロットタイプが追加されました

2022.09.11

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

いわさです。

Amazon Lex V2 ではインテントを通してスロットという仕組みを使ってユーザーから必要な情報を受け取ります。
スロットにはいくつか種類があるのですが、今までは一度のやり取りでひとつづつのスロット情報を入手する形でしたが、今回のアップデートで Composite スロットタイプが追加されました。

この機能を使うと一つのスロットに複数のサブスロットを定義し、一度のやり取りで複数のスロットの値を受け取ることが出来るようになりました。
Lex V2 が利用出来る全リージョンで利用出来ますが、英語 (US) のみで利用が出来ます。

従来

以下は日本語になるのですが、スロットタイプとしては空のスロットタイプか組み込み型スロットタイプが選択出来ました。
組み込み型スロットタイプに用意されている Country と City を使った単純なインテントを作ってみます。

この場合、従来では以下のようにひとつづつ情報を取得していました。

なお、スロットごとに順序を設定することなどは出来ていました。

Composite スロットタイプ

新しいスロットタイプは以下から利用が可能です。

スロット設定画面ではサブスロットとして複数のスロットを定義することが出来ます。

サブスロットで定義出来るスロットは独自で定義したものも組み込み型のものも利用することが出来ます。
ただし、Composite スロットをサブスロットに設定して入れ子の構造にすることは出来ません。

また、サポートされているスロットタイプだとしてもサブスロットへ設定出来るスロットは 6 つまでです。
ここでは組み込みの AMAZON.Country と AMAZON.City をサブスロットに設定した hoge というスロットを定義しています。

インテントでの利用

早速インテントで作成したスロットを使ってみましょう。
いくつか設定オプションはあるのですが、ここではまずシンプルにスロットだけ設定してみましょう。

テスト実行すると以下のようなやり取りを行うことが出来ます。
ここではユーザーからの入力にjapan, sapporoと入力してみました。(sapporo, japan でも良い)

上記だとオウム返しになっているだけのようにも見えます。
そこで、テストコンソールの検査機能を使ってリクエストとレスポンスの詳細情報が JSON 形式で確認することでスロットとサブスロットがどのように取得されているのかを確認してみます。

レスポンス

{
:
 "interpretations": [
  {
   "nluConfidence": {
    "score": 1
   },
   "intent": {
    "name": "hogeintent",
    "slots": {
     "hogeslot": {
      "value": {
       "originalValue": "japan sapporo",
       "interpretedValue": "japan sapporo",
       "resolvedValues": [
        "japan sapporo"
       ]
      },
      "subSlots": {
       "city": {
        "value": {
         "originalValue": "sapporo",
         "interpretedValue": "sapporo",
         "resolvedValues": [
          "sapporo"
         ]
        },
        "shape": "Scalar"
       },
       "country": {
        "value": {
         "originalValue": "japan",
         "interpretedValue": "japan",
         "resolvedValues": [
          "japan"
         ]
        },
        "shape": "Scalar"
       }
      }
     }
    },
:
}

上記ハイライト部分を見てみると、それぞれ country と city とそれぞれのサブスロットごとに解釈されていますね。

サブスロットをレスポンス値に使ってみる

さて、ここで取得した値を使ってみたいのでレスポンス値として使ってみようと思います。
{hogeslot}でスロットの値にアクセスすることが出来ます。

ドキュメントに明記されているところが見つからなかったのですが、サブスロットの場合は以下のように指定することでパス的にアクセスすることが出来ました。

実行してみると、一度のやり取りで入力した内容がそれぞれのサブスロットに入力されレスポンスとして利用することが出来ています。

サブスロットごとにスロットプロンプトを定義する

次にスロットプロンプトについてです。
サブスロットごとに追加のスロットプロンプトを設定することが出来ます。

このケースでいうと Lex が hoge(country & city) を問い合わせて一部のサブスロットだけ取得出来た場合、足りないサブスロット情報を取得するためのプロンプトを設定しています。

city のみ回答すると、追加で country について訊ねられていますね。

Slot Expression を定義する

先程は作成したスロットが必須になっておりデフォルトでサブスロットは全て必要となっています。
ここではスロットオプションの Slot Expression を定義することで必要なサブスロットを定義してみます。

この機能を使うことで、最大 6 件までのサブスロットの中で必須の組み合わせを複数用意することが出来ます。
ここでは city か country のどちらがあれば良いということにしましょう。

設定後に試してみると、先程は city だけ回答した後に country について質問されましたが、今回はスロット値のレスポンスのみでした。

ちなみに上記に関連してレスポンス値を少し変えています。

以下のように取得出来ていないサブスロットを参照しようとするとテストコンソールではエラーとなったためです。

さいごに

本日は Amazon Lex V2 のスロットタイプで Composite スロットタイプが追加されたので試してみました。

インテントを構築していてスロットの数はそれほど問題にならない気がするので、どちらかというとこの機能の一番のメリットは UX で差が出る感じでしょうか。

ただ、今回テストコンソールで試した限りだといくつかエラーになるケースがありました。
サブスロットという形で少しデータ構造が複雑になるためにインテント作成時に考慮が足りてないとエラーが発生する場合があります。
今までよりもインテント構築時に気をつけたほうが良さそうという所感です。よく検証のうえご利用ください。