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

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

watsonx Assistant 式言語を使用すれば、ステップで収集されたりセッション変数に保管されたりする値に依存しない (または、その値から得られる) 値を指定できます。 式は、ステップ条件の定義、またはセッション変数の値の定義に使用できます。

watsonx Assistantは、Spring式言語 SpEL )をベースにしていますが、構文にいくつかの重要な違いがあります。 SpEL, の詳細な背景情報については 、Spring Expression Language SpEL )を参照してください。

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

アクション変数の参照

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

セッション変数の参照

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

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

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

式では、JSON の基本型( integerstringnumberboolean など)や複合データ型(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 になります。

出力ストリング・フォーマットの変更は、日付と時刻の計算方法にも適用されます。 例えば、使用される <date> ストリングの形式が yyyy-MM-dd HH:mm:ss の場合 (メソッド today() を使用する場合など)、出力は同じ形式 (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)

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

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

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

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

  • EEEE (火曜日)
  • E (Tue 用)
  • 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 に記録されます (これは、アシスタント・プレビューまたは 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 より小さい数値は、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 番目のグループです。 これは最初の groupIndex 正規表現グループです。これは、数字グループとテキストグループの両方を含む文字列に一致します。 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)

このメソッドは、1 つの配列を別の配列に追加し、 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}")

数値を比較する際には、フィルタメソッドがトリガーされる前に、比較に関わるコンテキスト変数を必ず有効な値に設定してください。 比較対象にする配列要素にヌルが含まれる可能性がある場合は、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'] の場合、この例は onetwo、または 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(', ')

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

JSONArray.joinToArray(template, retainDataType)

このメソッドは、配列内の各項目から情報を抽出し、指定したテンプレートに従ってフォーマットされた新規配列を作成します。 テンプレートは、ストリング、JSON オブジェクト、または配列にすることができます。 このメソッドは、テンプレートのタイプに応じて、ストリングの配列、オブジェクトの配列、または配列の配列を返します。

このメソッドは、ステップの出力の一部として返すことができるストリングとして情報をフォーマット設定する場合や、外部 API で使用できるようにデータを別の構造に変換する場合に役立ちます。

テンプレートでは、以下の構文を使用して、ソース配列の値を参照できます。

%e.{property}%

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

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

"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 パラメーターは、戻される配列内のすべての入力値のデータ・タイプをメソッドが保持するかどうかを指定します。 retainDataTypefalse に設定されているか、省略されている場合、状況によっては、入力配列内のストリングが、返される配列内の数値に変換されることがあります。 例えば、入力配列から選択された値が "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/>

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

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、4、5]
[「Banana」、「Orange」、「Apple」、「Mango」] [「Apple」、「Banana」、「Mango」、「Orange」]
[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} NA
${system_session_history}.transform("role", "user", "assistant") ${system_session_history}.transform("author", "USER", "AI") ${system_session_history}.transform("<your system prompt>")

currentAction が true の場合:

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

n : true フラグは、変換の出力に含まれません。