アクションの式言語メソッド

AIアシスタントの式言語は、ステップで収集される値やセッション変数に格納される値とは独立した値や、そこから派生する値を指定するために使用できます。 式は、ステップ条件の定義、またはセッション変数の値の定義に使用できます。

AIアシスタントの表現言語は、Spring Expression LanguageSpEL)をベースにしているが、構文にいくつかの重要な違いがある。 SpEL,の詳細な背景情報については、Spring Expression Language (SpEL)を参照してください。

SpEL 式は、以下の 2 つのメソッドで使用できます。

アクション変数の参照

アクション変数は、顧客入力を予期するすべてのステップに対して暗黙的に作成され、その変数はそのステップにバインドされます。 式の中でアクション変数を参照するには、'${step_id}(例えば、'${step_771}. ステップのステップ ID を見つけるには、ステップを選択し、ブラウザーで URL の末尾を確認します。

セッション変数の参照

セッション変数は、ステップの「変数」セクションで明示的に作成されます。 式の中でセッション変数を参照するには、'${variable_id}(例えば、'${current_time}. 変数 ID は、変数のリストで見つけることができます。 (詳しくは、変数を使用して会話情報を管理を参照してください。)

式を編集しているときに「$入力すると、参照できる変数のリストが表示される。 ステップ ID または変数 ID を自動的に挿入するには、そのリストから変数を選択します。

サポート対象データ・タイプ

式では、アトミックなJSON型('integer、'string、'number、'booleanなど)や、複合データ型(JSON配列([])やオブジェクト({})など)を使用できます。文字列のリテラル値を指定する場合は、シングルクォーテーション(')またはダブルクォーテーション(")を使用します。

アクション・ステップで顧客から収集される値は、日付、時刻、通貨、パーセントなどの顧客応答タイプを使用します。 このような値は、次のフォーマットで JSON オブジェクトとして保管されます。

{
  "system_type": "{system_type}",
  "value": "{value}"
}

{system_type} は次のいずれかのタイプです。

  • time
  • percentage
  • currency

日付と時刻のメソッド

日付と時刻の値を処理するメソッドはいくつかあります。

now(String timezone)

now() メソッドは、指定されたタイム・ゾーンの現在日時を yyyy-MM-dd HH:mm:ss 'GMT'XXX フォーマットで返します。

now('Australia/Sydney').

この例では、現在の日付と時刻が'2021-11-26 11:41:00の場合、返される文字列はサマータイムに応じて'2021-11-26 21:41:00 GMT+10.00または'2021-11-26 21:41:00 GMT+11.00となる。

出力文字列フォーマットの変更は、日付と時刻の計算方法にも適用される。 例えば、'today() メソッドを使ったときのように、'<date>文字列が'yyyy-MM-dd HH:mm:ss 形式であれば、出力は同じ形式(yyyy-MM-dd HH:mm:ss )になる。しかし、'<date>文字列が'yyyy-MM-dd HH:mm:ss 'GMT'XXX形式の場合、例えば'now()メソッドを使用した場合、出力は'yyyy-MM-dd HH:mm:ss 'GMT'XXX形式になります。

.reformatDateTime(String format)

日時ストリングが出力用にフォーマット設定されます。 パラメータは、日付や時刻の値の書式を指定する書式文字列である。 フォーマット文字列は、JavaSimpleDateFormat構文を使用して指定する必要があります。

このメソッドは、指定されたフォーマットに従ってフォーマットされた文字列を返す:

  • MM/dd/yyyy (12/31/2016 とする場合)
  • h a (10pm とする場合)

曜日を返すには次を指定します。

  • 火曜日はEEEE
  • E火曜日
  • uは曜日インデックス(1=月曜日、...、 7 = 日曜日)

例えば、次の式は、値 17:30:00 を 5:30 PM として返します。

${system_current_date}.reformatDateTime('h:mm a')

入力ストリングに時刻のみが含まれている場合、出力ではデフォルト日付 1970-01-01 が使用されます。 入力ストリングに日付のみが含まれている場合は、デフォルト時刻 12 AM (00:00) が使用されます。

.before(String date/time)

  • この例のように、日付と時刻の値が指定された日付と時刻の引数より前にあるかどうかを判定する:
${system_current_date}.before('2021-11-19')

日付を別の日付と比較したり時刻を別の時刻と比較したりできます。 この場合、日付は無視され、時刻のみが比較される。 不一致の値の他の比較(例えば、日付と時刻の比較)は'falseを返し、例外は'output.debug.log_messagesで記録されます(AIアシスタントのプレビューまたはAPIレスポンスで見ることができます)。

.after(String date/time)

  • 日付と時刻の値が日付と時刻の引数の後にあるかどうかを判定する。

.sameMoment(String date/time)

  • 日付と時刻の値が、日付と時刻の引数と同じかどうかを判定する。

.sameOrAfter(String date/time)

  • 日付と時刻の値が、日付と時刻の引数より後か同じかを判断する。
  • .after() に似ています。

.sameOrBefore(String date/time)

  • 日付と時刻の値が、日付と時刻の引数より前か同じかを判断する。

日時の計算

日付を計算するには、以下のメソッドを使用します。

日付の計算
メソッド 説明
<date>.minusDays(_n_) 指定された日付の n 日前の日付が返されます。
<date>.minusMonths(_n_) 指定された日付の n カ月前の日付が返されます。
<date>.minusYears(_n_) 指定された日付の n 年前の日付が返されます。
<date>.plusDays(_n_) 指定された日付の n 日後の日付が返されます。
<date>.plusMonths(_n_) 指定された日付の n カ月後の日付が返されます。
<date>.plusYears(n) 指定された日付の n 年後の日付が返されます。

ここで、<date>yyyy-MM-dd または yyyy-MM-dd HH:mm:ssの形式で指定します。

例えば、明日の日付を取得するには、次の式を指定します。

${system_current_date}.plusDays(1)

時刻を計算するには、以下のメソッドを使用します。

時間計算
メソッド 説明
<time>.minusHours(_n_) 指定された時刻の n 時間前の時刻が返されます。
<time>.minusMinutes(_n_) 指定された時刻の n 分前の時刻が返されます。
<time>.minusSeconds(_n_) 指定された時刻の n 秒前の時刻が返されます。
<time>.plusHours(_n_) 指定された時刻の n 時間後の時刻が返されます。
<time>.plusMinutes(_n_) 指定された時刻の n 分後の時刻が返されます。
<time>.plusSeconds(_n_) 指定された時刻からn秒後の時刻を返します。

ここで、<time>HH:mm:ss の形式で指定します。

例えば、今から 1 時間後の時刻を取得するには、次の式を指定します。

 now().plusHours(1)  

期間の処理

今日の日付が特定の期間内にあるかどうかに基づいて応答を表示するには、時間関連のメソッドを組み合わせて使用します。 例えば、毎年の休暇シーズンに特別オファーを行う場合は、今日の日付が今年の 11 月 25 日から 12 月 24 日の間にあるかどうかを確認しなければならないとします。

最初に、対象の日付をセッション変数として定義します。 以下の開始日と終了日のセッション変数式では、日付は、動的な現在の年の値とハードコードされた月と日の値を連結して構築される:

start_date = now().reformatDateTime('Y') + '-12-24'
end_date = now().reformatDateTime('Y') + '-11-25'

次に、ステップ条件で、セッション変数として定義した開始日と終了日の間に現在日付がある場合にのみ応答を示すように指示できます。

now().after(${start_date}) && now().before(${end_date})

java.util.Date サポート

組み込みメソッドに加えて、java.util.Date クラスの標準メソッドを使用できます。

例えば、今日から 1 週間後の日付を取得するには、次の構文を使用できます。

new Date(new Date().getTime() + (7 * (24*60*60*1000L)))

この式は、最初に現在日付を 1970 年 1 月 1 日 00:00:00 GMT からのミリ秒として取得します。 また、7 日間のミリ秒数も計算されます ((24*60*60*1000L) は 1 日をミリ秒で表します)。 次に、現在日付に 7 日を加えます。 結果は、今日から 1 週間後の完全な日付になります (例えば、Fri Jan 26 16:30:37 UTC 2018)。

数値メソッド

これらのメソッドを使用して、数値を取得し、形式を再設定できます。

顧客応答において数値を認識することについては、応答タイプの選択を参照してください。

数値の小数点の位置を変更する場合 (例えば、数値を通貨値として再フォーマット設定する場合) は、 String format () メソッドを参照してください。

toDouble()

オブジェクトまたはフィールドを Double 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換が失敗すると、null が返されます。

toInt()

オブジェクトまたはフィールドを Integer 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換が失敗すると、null が返されます。

toLong()

オブジェクトまたはフィールドを Long 数値型に変換します。 任意のオブジェクトまたはフィールドに対してこのメソッドを呼び出すことができます。 変換が失敗すると、null が返されます。

SpEL 式で Long 数値タイプを指定するには、その数値を識別するためにその数値に L を追加する必要があります (例えば、5000000000L)。この構文は、32 ビットの Integer タイプに適合しないすべての数値に必要です。 2^31(2,147,483,648)より大きい数、または-2 (-2,147,483,648)より小さい数は、Long数型とみなされる。 Long 数値型の最小値は -2^63、最大値は 2^63-1 (または 9,223,372,036,854,775,807) です。

標準的な数式

SpEL 式を使用して、標準的な数式を定義できます。数式では演算子を以下の記号で表します。

標準的な数式
算術演算 記号
加算 +
ディビジョン /
乗算 *
減算 -

java.lang.Math()

java.lang.Math クラスの関数を使用すれば、基本的な数値演算を実行できます。

などのクラスメソッドを使うことができる:

  • max():

    T(Math).max(${step_297},${step_569})
    
  • min():

    T(Math).min(${step_297},${step_569})
    
  • pow():

    T(Math).pow(${step_297}.toDouble(),2.toDouble())
    

その他のメソッドについては、java.lang.Mathリファレンス・ドキュメントを参照してください。

java.util.Random()

乱数を返します。 以下のいずれかの構文オプションを使用します。

  • ランダム・ブール値 (true または false) を返すには、new Random().nextBoolean() を使用します。
  • 0 (包含) と 1 (除外) の間の乱数倍精度浮動小数点数を返すには、new Random().nextDouble() を使用します。
  • 0 (0 を含む) から指定の数値までのランダムな整数を返すには、new Random().nextInt(_n_) を使用します (n は、希望の数値範囲の上限より 1 大きい値です)。 例えば、0 から 10 までの乱数を返す場合は、new Random().nextInt(11) と指定します。
  • 整数値の範囲全体 (-2147483648 から 2147483648 まで) からランダムな整数を返すには、new Random().nextInt() を使用します。

例えば、ランダムに選択されたサブセットの顧客についてのみ実行されるステップを作成できます。 以下のステップ条件は、ステップが実行される可能性が 50% であることを意味します。

new Random().nextInt(2) == 1

その他のメソッドについては、java.util.Randomリファレンス・ドキュメントを参照してください。

以下のクラスの標準メソッドも使用できます。

  • java.lang.Byte
  • java.lang.Integer
  • java.lang.Long
  • java.lang.Double
  • java.lang.Short
  • java.lang.Float

ストリング・メソッド

これらのメソッドは、テキストの処理を支援します。

正規表現を含むメソッドで使用する構文の詳細については、RE2構文リファレンスを参照してください。

String.append(Object)

このメソッドは、入力オブジェクトを (ストリングとして) ストリングに追加し、変更されたストリングを返します。

${step_297}.append('next text')

String.contains(String)

このメソッドは、アクション変数やセッション変数に部分文字列が含まれている場合に'true返します。

${step_297}.contains('Yes')

String.endsWith(String)

このメソッドは、ストリングが入力サブストリングで終了する場合に true を返します。

${step_297}.endsWith('?')

String.equals(String)

このメソッドは、指定されたストリングがアクション変数またはセッション変数と等しい場合に true を返します。

${step_297}.equals('Yes')

String.equalsIgnoreCase(String)

このメソッドは、指定されたストリングが大/小文字に関係なくアクション変数またはセッション変数と等しい場合に true を返します。

${step_297}.equalsIgnoreCase('Yes')

String.extract(String regexp, Integer groupIndex)

このメソッドは、指定された正規表現グループ・パターンに一致する入力からストリングを返します。 一致が見つからない場合は、空ストリングを返します。

このメソッドは、単一の正規表現パターンに対する複数の異なる一致ではなく、複数の異なる正規表現パターン・グループに対する一致を抽出するように設計されています。 別のマッチを見つけるには、getMatch()メソッドを参照してください。

この例では、アクション変数は、指定された正規表現パターン・グループに一致するストリングを保存します。 この式では、2 つの正規表現パターン・グループをそれぞれ括弧で囲んで定義しています。 本来は、この2つのグループからなる第3のグループである。 これは最初のgroupIndex0)正規表現グループであり、完全な数字グループとテキストグループを含む文字列とマッチする。 2 番目の正規表現グループ (groupIndex 1) は、数値グループの最初のオカレンスと一致します。 3 番目のグループ (groupIndex 2) は、数値グループの後の最初のテキスト・グループのオカレンスと一致します。

${step_297}.extract('([\d]+)(\b [A-Za-z]+)', <n>)

アクション変数に

Hello 123 this is 456.

結果は以下のようになります。

  • <n>=0場合、値は '123 this となる。
  • <n>=1場合、値は '123 となる。
  • <n>=2場合、値は 'this となる。

String.find(String regexp)

このメソッドは、いずれかのストリング・セグメントが、入力された正規表現と一致する場合に true を返します。 JSONArrayまたはJSONObject要素に対してこのメソッドを呼び出すと、比較を行う前に配列またはオブジェクトを文字列に変換します。

例えば、アクション変数'${step_297}が文字列'Hello 123456を集めた場合、次の式は'true返す:

${step_297}.find('^[^\d]*[\d]{6}[^\d]*$')

条件は true です。これは、入力テキストの数値部分が正規表現 ^[^\d]*[\d]{6}[^\d]*$ と一致するためです。

String.getMatch(String regexp, Integer matchIndex)

このメソッドは、指定された正規表現パターンのオカレンスと一致するストリングを返します。 一致が見つからない場合、このメソッドは空ストリングを返します。

検出された一致は、一致の配列と見なすことができるものに追加されます。 配列エレメント・カウントは 0 から始まるため、3 番目の一致を返す場合は、matchIndex 値として 2 を指定します。 例えば、指定したパターンと一致する単語が 3 つ含まれているテキスト・ストリングを入力した場合は、その添字の値を指定するだけで 1 番目の一致、2 番目の一致、または 3 番目の一致を返せます。

例えば、次の例では、アクション変数において数値のグループが検索されています。

${step_297}.getMatch('([\d]+)', 1)

アクション変数 ${step_297} にストリング hello 123 i said 456 and 8910 が含まれている場合、この式は 456 を返します。

String.isEmpty()

このメソッドは true を返します (ストリングが空ストリングであるが null ではない場合)。次の例を参照してください。

${step_297}.isEmpty()

String.length()

このメソッドは、次の例にあるように、ストリングの文字長を返します。

${step_297}.length()

アクション変数 ${step_297} にストリング Hello が含まれている場合、この式は 5 を返します。

String.matches(String regexp)

このメソッドは、例にあるように、ストリングが、入力された正規表現と一致する場合に true を返します。

${step_297}.matches('^Hello$')

アクション変数 ${step_297} にストリング Hello が含まれている場合、この式は true に評価されます。

String.startsWith(String)

このメソッドは、次の例にあるように、指定されたサブストリングでストリングが始まる場合に true を返します。

${step_297}.startsWith('What')

アクション変数 ${step_297} にストリング What is your name? が含まれている場合、この式は true を返します。

String.substring(Integer beginIndex, Integer endIndex)

このメソッドは、beginIndex の位置にある文字で始まり endIndex の前の文字で終わるサブストリングを返します。 (endIndex 文字自体はサブストリングには含まれません。) インデックスの値はゼロベースなので、文字列の最初の文字はインデックス0になる。

次の例では、索引 5 (6 番目の文字) で始まり文字列の末尾まで続くサブストリングが返されます。

${step_297}.substring(5, ${step_297}.length())

アクション変数 ${step_297} にストリング This is a string. が含まれている場合、この式は is a string. を返します。

String.toJson()

このメソッドは、JSONデータを含む文字列を解析し、この例のようにJSONオブジェクトまたは配列を返します:

${json_var}.toJson()

セッション変数「${json_var}」に以下の文字列が含まれている場合:

"{ \"firstname\": \"John\", \"lastname\": \"Doe\" }"

toJson()メソッドは以下のオブジェクトを返す:

{
  "firstname": "John",
  "lastname": "Doe"
}

String.toLowerCase()

このメソッドは、指定された文字列をこの例のように小文字に変換して返す:

${step_297}.toLowerCase()

アクション変数 ${step_297} にストリング This is A DOG! が含まれている場合、この式はストリング this is a dog! を返します。

String.toUpperCase()

このメソッドは、この例のように大文字に変換された元の文字列を返す:

${step_297}.toUpperCase()

アクション変数 ${step_297} にストリング hi there が含まれている場合、このメソッドはストリング HI THERE を返します。

String.trim()

このメソッドは、次の例にあるように、ストリングの先頭と末尾にあるスペースをすべてトリミングし、変更されたストリングを返します。

${step_297}.trim()

アクション変数 ${step_297} にストリング something is here が含まれている場合、このメソッドはストリング something is here を返します。

java.lang.String サポート

組み込みメソッドに加えて、java.lang.String クラスの標準メソッドを使用できます。

java.lang.String.format()

標準の Java String format() メソッドをテキストに適用できます。 使用する構文については、「フォーマット文字列の構文」を参照のこと。

この例では、3 つの 10 進整数 (1、1、および 2) が使用されて文に追加されます。

T(java.lang.String).format('%d + %d equals %d', 1, 1, 2)

結果のストリングは 1 + 1 equals 2 です。

この例では、ステップによって収集される数値の小数部の配置を変更する:

T(String).format('%.2f',${step_297})

米ドルでフォーマット設定されなければならない ${step_297} 変数が 4.5 の場合、結果のストリングは 4.50 になります。

配列メソッド

これらのメソッドは、配列の操作に役立ちます。

Array.add(value...)

このメソッドは配列に1つ以上の新しい値を追加し、操作が成功したら 'true返す。

${Items}.add('four', 'five')

Itemsが'['one', 'two', 'three']場合、この例では'['one', 'two', 'three', 'four', 'five']に更新される。

Array.addAll(Array array)

このメソッドは配列を別の配列に追加し、'null返す。

${Items}.addAll(${New_items})

Itemsが '['one', 'two', 'three']で 'New_itemsが '['four', 'five', 'six']場合、この例では 'Items'['one', 'two', 'three', 'four', 'five', 'six'] に更新する。

Array.append(value...)

このメソッドは、1 つ以上の新しい値を配列に追加し、その結果を新しい配列として返します。 元の配列は変更されない。

${Items}.append('four', 'five')

Itemsが '['one', 'two', 'three']場合、この例は新しい配列 '['one', 'two', 'three', 'four', 'five'] を返す。

Array.clear()

このメソッドは、配列からすべての値を削除して null を返します。

${Items}.clear()

この式が評価された後、'Itemsは空の配列([])となる。

Array.contains(value)

このメソッドは、配列に入力値と正確に等しい項目があれば「true返す。 指定する値は文字列または数値である。

${Items}.contains(123)

Itemsが '[123, 456, 789]場合、この例は 'true を返す。

Array.containsIgnoreCase(value)

このメソッドは、配列に入力値と等しい項目があれば「true返す。 文字列は、値が大文字で指定されているか小文字で指定されているかに関係なくマッチする。 指定する値は文字列または数値である。

${Items}.contains('two')

この例では、'Items配列に文字列 'twoの大文字小文字のいずれかが含まれていれば、 'true返します (たとえば、'TWOや 'Twoもマッチします)。

Array.filter(temp_var, "temp_var.property operator comparison_value")

配列の各要素を指定した値と比較し、マッチした要素のみを含む新しい配列を返します。

フィルター式の値は、以下のとおりです。

  • temp_var: 配列の各要素が評価される際に保持される一時変数の任意の名前。 たとえば、元の配列に都市を表すオブジェクトが含まれている場合、一時変数名として「city使うことができる。

  • property: フィルタリングしたい要素のプロパティ。 これは、ソース配列の要素のプロパティでなければならない。 temp_var.property構文を使って、そのプロパティを 'temp_var のプロパティとして指定する。 例えば、'latitudeがソース要素の有効なプロパティ名である場合、プロパティを 'city.latitude と指定することができます。

  • operator: プロパティ値と比較値を比較するために使用する演算子。 以下のいずれかの演算子を使用できる:

    サポートされているフィルター演算子
    オペレーター 説明
    == 等しい
    > より大きい
    < より小さい
    >= より大きいかまたは等しい
    <= より小さいか等しい
    != 等しくない
  • comparison_value: 各配列要素のプロパティ値を比較したい値。 リテラル値を指定することも、変数を参照することもできる。

フィルターの例

例えば、都市名と人口数を含むオブジェクトの配列があるとする:

[
   {
      "name":"Tokyo",
      "population":13988129

   },
   {
      "name":"Rome",
      "population":2860009

   },
   {
      "name":"Beijing",
      "population":21893095

   },
   {
      "name":"Paris",
      "population":2165423

   }
]

ソース配列が「${cities}」という変数に格納されている場合、次の式は、人口が500万人を超える都市だけを含む、より小さな配列を返す:

${cities}.filter("city", "city.population > 5000000")

この式は、以下のフィルタリング済みの配列を戻します。

[
   {
      "name":"Tokyo",
      "population":13988129

   },
   {
      "name":"Beijing",
      "population":21893095

   }
]

ハードコードされた比較値の代わりに、変数に格納された動的な値に基づいてフィルタをかけることもできる。 この例では、前のステップで顧客の回答によって指定された母集団値を使用してフィルタリングを行う:

${cities}.filter("city", "city.population > ${step_123}")

数値の比較を行う場合は、filterメソッドがトリガーされる前に、必ず比較に関わるコンテキスト変数を有効な値に設定してください。 比較対象にする配列要素にヌルが含まれる可能性がある場合は、null も有効な値になり得ることに注意してください。

Array.get(Integer index)

このメソッドは、配列から指定されたインデックスの位置にある項目を返します。 つまり、配列の最初の項目はインデックスの位置 '0 にある。

${Items}.get(1)

Itemsが '['one', 'two', 'three']場合、この例は 'two を返す。

get()メソッドは、括弧 ([]) を使って配列から項目を取り出す方法の代替です。 次の例も有効で、同じ結果を返す:

${Items}[1]

顧客が配列から項目を選択するために指定した値を使用する場合、ゼロインデックス値に変換するために1を引く必要があるかもしれません。 例えば、'${Items}.get(${step_123} - 1)ような式を使って、意図した値を取り出すことができる。

Array.getRandomItem()

このメソッドは、配列からランダムに選ばれた項目を返します。

${Items}.getRandomItem()

もし'Itemsが'['one', 'two', 'three']なら、この例は'one、'two、'threeをランダムに返す。

Array.indexOf(value)

このメソッドは、配列内で最初に現れる入力値のインデックス位置を返し、配列内に入力値がない場合は '-1を返す。 指定する値は文字列または数値である。

${Items}.indexOf(`two`)

もし'Itemsが'['one', 'two', 'three']なら、この例は整数'1(ゼロインデックス配列の2番目の位置を示す)を返す。

Array.join(String delimiter)

このメソッドは、この配列内のすべての値をストリングに結合します。 値はストリングに変換され、入力区切り文字で区切られます。

例えば、配列'["pepperoni", "ham", "mushrooms"]含む'pizza_toppingsという名前の変数を使うかもしれない。 次の式は、この配列を文字列'pepperoni, ham, mushroomsに変換する:

${toppings_array}.join(', ')

その式を使って変数の値を定義すれば、AIアシスタントの出力でその変数を参照し、人間が読めるメッセージ(たとえば「You have selected the following toppings: pepperoni, ham, mushrooms)を作成することができる。

JSONArray.joinToArray(template, retainDataType)

このメソッドは、配列の各項目から情報を抽出し、指定したテンプレートに従ってフォーマットされた新しい配列を構築する。 テンプレートは文字列、JSONオブジェクト、配列のいずれかになります。 このメソッドは、テンプレートのタイプに応じて、文字列の配列、オブジェクトの配列、または配列の配列を返します。

このメソッドは、情報を文字列としてフォーマットしてステップの出力の一部として返したり、データを別の構造に変換して外部APIで使えるようにしたりするのに便利です。

テンプレートでは、以下の構文を使ってソース配列から値を参照することができます:

%e.{property}%

ここで、'{property}はソース配列のプロパティ名を表す。

例えば、AIアシスタントがフライトの詳細を含む配列をセッション変数に格納するとします。 保存されたデータは次のようになる:

"flights": [
      {
        "flight": "AZ1040",
        "origin": "JFK",
        "carrier": "Alitalia",
        "duration": 485,
        "destination": "FCO",
        "arrival_date": "2019-02-03",
        "arrival_time": "07:00",
        "departure_date": "2019-02-02",
        "departure_time": "16:45"
      },
      {
        "flight": "DL1710",
        "origin": "JFK",
        "carrier": "Delta",
        "duration": 379,
        "destination": "LAX",
        "arrival_date": "2019-02-02",
        "arrival_time": "10:19",
        "departure_date": "2019-02-02",
        "departure_time": "07:00"
      },
      {
        "flight": "VS4379",
        "origin": "BOS",
        "carrier": "Virgin Atlantic",
        "duration": 385,
        "destination": "LHR",
        "arrival_date": "2019-02-03",
        "arrival_time": "09:05",
        "departure_date": "2019-02-02",
        "departure_time": "21:40"
      }
    ]

これらのフライトをユーザーが読める形で記述した文字列の配列を作るには、次のような式を使う:

${Flight_data}.joinToArray("Flight %e.flight% to %e.destination%", true)

この式は次のような文字列の配列を返すことになる: ["Flight AZ1040 to FCO","Flight DL1710 to LAX","Flight VS4379 to LHR"].

オプションの 'retainDataTypeパラメータは、このメソッドが返される配列内のすべての入力値のデータ型を保持するかどうかを指定します。 retainDataTypeを'falseに設定したり省略したりすると、状況によっては、入力配列の文字列が戻り配列の数値に変換されることがある。 例えば、入力配列から選択された値が'"1"、'"2"、'"3"場合、返される配列は'[ 1, 2, 3 ]となる。 予期せぬ型変換を避けるため、このパラメータには'trueを指定する。

複雑なテンプレート

より複雑なテンプレートには、情報を読みやすいレイアウトで表示する書式が含まれているかもしれない。 複雑なテンプレートの場合は、テンプレートをセッション変数に格納し、それを文字列の代わりに'joinToArrayメソッドに渡すことができます。

例えば、この複雑なテンプレートは、配列要素のサブセットを含み、ラベルとフォーマットを追加する:

<br/>Flight number: %e.flight% <br/> Airline: %e.carrier% <br/> Departure date: %e.departure_date% <br/> Departure time: %e.departure_time% <br/> Arrival time: %e.arrival_time% <br/>

テンプレートで使用するフォーマットが、AIアシスタントの出力を表示するチャネル統合でサポートされていることを確認してください。

Templateという名前のセッション変数を作成し、その値としてこのテンプレートを代入すると、その変数を式の中で使うことができます:

${Flight_data}.joinToArray(${Template})

実行時の応答は次のようになる:

Flight number: AZ1040
Airline: Alitalia
Departure date: 2019-02-02
Departure time: 16:45
Arrival time: 07:00

Flight number: DL1710
Airline: Delta
Departure date: 2019-02-02
Departure time: 07:00
Arrival time: 10:19

Flight number: VS4379
Airline: Virgin Atlantic
Departure date: 2019-02-02
Departure time: 21:40
Arrival time: 09:05

JSONテンプレート

文字列の代わりに、JSONオブジェクトとしてテンプレートを定義することができます。これは、異なるシステムからの情報のフォーマットを標準化したり、外部サービスに必要なフォーマットにデータを変換する方法を提供します。

この例では、テンプレートは、'Flight dataセッション変数に格納されている配列で指定された要素からフライトの詳細を抽出するJSONオブジェクトとして定義されている:

{
  "departure": "Flight %e.flight% departs on %e.departure_date% at %e.departure_time%.",
  "arrival": "Flight %e.flight% arrives on %e.arrival_date% at %e.arrival_time%."
}

このテンプレートを使って、'joinToArray()メソッドは指定された構造を持つオブジェクトの新しい配列を返す。

Array.remove(Integer index)

このメソッドは、配列から指定されたインデックスの位置にある項目を削除し、更新された配列を返します。

${Items}.remove(1)

Itemsが '['one', 'two', 'three']場合、この例は '['one', 'three'] を返す。 元の'Items配列もその場で修正される。

Array.removeValue(value)

このメソッドは、配列から指定された値の最初の出現回数を削除し、更新された配列を返します。 指定する値は文字列または数値である。

${Items}.removeValue('two')

Itemsが '['one', 'two', 'three']場合、この例は '['one', 'three'] を返す。 元の'Items配列もその場で修正される。

Array.set(Integer index, value)

このメソッドは、指定されたインデックスの位置の項目を指定された値で置換し、更新された配列を返します。

${Items}.set(2,'five')

Itemsが '['one', 'two', 'three']場合、この例は '['one', 'two', 'five'] を返す。 元の'Items配列もその場で修正される。

Array.size()

このメソッドは、配列の項目数を整数で返します。

${Items}.size()

Itemsが '['one', 'two', 'three']場合、この例は '3 を返す。

Array.sort()

このメソッドはインプレースソートを行い、ソートされた配列を返します。 デフォルトのパラメータは「ascendingである。 descending指定すると、ソート順を変更できる。 それ以外のパラメータ入力は無視され、ログエラーが表示される。

${Items}.sort("ascending")

このメソッドは数値と文字列を比較する。 数値は常に文字列より小さい。 それ以外の型は、デフォルトで文字列に変換されて比較される。

例:

ソートの例
オリジナル配列 並べ替えられた配列
[2,1,3,5,4,3,2] [1,2,2,3,3,4,5]
[バナナ」、「オレンジ」、「アップル」、「マンゴー」] [アップル」、「バナナ」、「マンゴー」、「オレンジ」]
[3, 2, 4, "1", "10", "12", "Banana", "Orange", 0, "Apple", "Mango"] [0, 2, 3, 4, "1", "10", "12", "Apple", "Banana", "Mango", "Orange"]

Array.transform()

Array.transform()メソッドは'session_history変数のみに使用される。 特定の生成AIシステムに合わせて変数の出力を変換することができる。

表チャットフォーマット用の署名は、異なるチャットフォーマットで使用できる署名を示しています:

表:チャット形式の署名
詳細 OpenAI Google PaLM2 Llama2
署名 transform(String rolePrefix, String userPrefix, String assistantPrefix, optional Boolean currentAction=false) transform(String rolePrefix, String userPrefix, String assistantPrefix, optional Boolean currentAction=false) transform(optional String systemPrompt, optional Boolean currentAction=false)
カスタマー・メッセージのフォーマット {$rolePrefix: $userPrefix, "content": $content} {$rolePrefix: $userPrefix, "content": $content} <s>[INST] <<SYS>>{{ $systemPrompt }} <</SYS>>{{ $user_content }} [/INST] {{ $assistant_content }} </s><s>[INST] {{ $user_content }} [/INST]
アシスタント・メッセージのフォーマット {$rolePrefix: $assistantPrefix, "content": $content} {$rolePrefix: $assistantPrefix, "content": $content} 該当なし
${system_session_history}.transform("role", "user", "assistant") ${system_session_history}.transform("author", "USER", "AI") ${system_session_history}.transform("<your system prompt>")

もし'currentActionが真なら:

currentActionがtrueの場合
AIアシスタントの用途 説明
行動のみ この変換では、「ntrueであるすべてのメッセージを除外します。これは、顧客の質問によって新しい基本アクションがトリガーされたことを示します。
ダイアログのみ currentActionは無視され、変換は'session history変数の内容全体を含む。
対話と行動 この変換は、ダイアログノードがトリガーされたかどうかに関係なく、アクションが開始された直後から'session_history変数にあるすべてのものを含む。

n : trueフラグはtransformの出力には含まれない。