Amazon Lex のインテントでカスタムコードなしの条件分岐機能がサポートされていました

2022.09.18

いわさです。

先日、以下の記事で Amazon Lex の新しいビジュアルビルダーを紹介しました。
その時にビルダー上で条件分岐に対応していることに気がつきました。

以前までは Lambda を統合し Lambda 上で分岐させる必要があったと思いますが、以下のアップデートでカスタムコードなしで条件分岐を実装出来るようになっていました。

基本的な利用方法

まず前提として 2022 年 8 月 17 日以降、Amazon Lex の対話管理方法が変更されており、それ以降作成された BOT の場合に利用可能です。

Condition ブロックを配置し、条件式を設定します。
分岐(Branch)ごとにメッセージを設定することもできます。

ここでは次のように、age スロットの値が 20 以上かどうかで分岐させてみます。

以下のように、年齢(age スロットの値)に応じてその後の処理を分岐させることができていますね。

比較演算子としては以下が利用可能です。

  • Equals (=)
  • Not equals (!=)
  • Less than (<)
  • Less than or equals ()
  • Greater than or equals (>=)

少し制限というかルールがあって、左辺が参照である必要があります。
先程の例だと以下の場合はインテントのビルド時にエラーとなります。

20 &lt;= {age}

また文字列は大文字小文字の区別がされません。
詳細なルールは以下をご確認ください。

論理演算子で複数条件を定義

&amp;&amp;||!などの基本的な論理演算子を組み合わせて複数の条件式を組み合わせることができます。
ここでは以下のように age と country の 2 つのスロットを用意します。

その上で、age が 20以上かつ country が「日本」以外のときのみメッセージを出力しましょう。

良いですね。

複数分岐

分岐は複数作成することができます。
Add conditional branchボタンを押すことで分岐を追加することができます。

先程は 20 歳以上で日本以外の場合にメッセージを表示していましたが、20 歳以上で日本の場合もメッセージを表示してみます。

ちなみに、分岐はデフォルトを除いて最大 4 つまで作成することができます。

複数分岐で複数条件に該当する場合

条件式によっては複数の条件式を満たす場合があります。
先程 4 つまで分岐を作成したものだと、10 歳以上、20 歳以上、30 歳以上、40 歳以上と分岐を作成しました。

この場合に 50 を入力すると全ての条件に該当しますがその場合は以下のようになります。

このように複数の分岐が処理されることはなく、条件式の定義順に優先されます。
これを制御するために、各分岐の位置は入れ替えることができます。

以下のように入れ替えてみました。

期待どおりの分岐処理が実行されるようになりましたね。

複数値スロットの場合に利用出来る条件式

本日時点で 英語 (US) のみサポートされていますが、スロットに複数の値をリスト形式で格納する機能があります。
カスタムスロットでのみ利用ができて、インテントでスロットを構成する際に「複数値スロット」を選択します。

以下のように複数値入力することで、slot.valuesにリスト形式で値が格納されます。

応答

:
    "slots": {
     "hoge": {
      "value": {
       "originalValue": "aaa and bbb",
       "interpretedValue": "aaa and bbb",
       "resolvedValues": [
        "aaa and bbb"
       ]
      },
      "shape": "List",
      "values": [
       {
        "value": {
         "originalValue": "aaa",
         "interpretedValue": "aaa",
         "resolvedValues": [
          "aaa"
         ]
        },
        "shape": "Scalar"
       },
       {
        "value": {
         "originalValue": "bbb",
         "interpretedValue": "bbb",
         "resolvedValues": [
          "bbb"
         ]
        },
        "shape": "Scalar"
       }
      ]
     }
    }
:

CONTAINS

1 つ目はCONTAINSです。
リストに特定の値が含まれているかを評価することができます。

fn.COUNT()

条件式では組み込みの関数が用意されています。
fn.から始まるもので、本日時点ではfn.COUNT()fn.IS_SET()の 2 つが提供されています。

前者のfn.COUNT()は複数値スロットの値の数をカウントし、評価式に利用することができます。

なお、後者のfn.IS_SET()については複数値でも利用ができます。
非必須スロットで値が取得されているかどうかを判定する際に利用できそうです。

さいごに

本日は Amazon Lex のインテントでカスタムコードなしの条件分岐機能がサポートされたので、いくつかパターンを試してみました。
先日のビジュアルビルダー機能とあわせて使うことで Amazon Connect のような直感的なフローを構築することが出来るようになったなと感じます。

なお、Condition ブロックでサポートされていなかったり複雑な条件については今までどおり Lambda との統合も可能なので、まずは今回の機能を使って分岐仕様を満たせるか検討し、難しければ Lambda を使うという形になるでしょうか。