IBM Cloud Docs
用于操作的表达式语言方法

用于操作的表达式语言方法

watsonx Assistant 表达式语言可用于指定独立于或派生自步骤中收集的值或存储在会话变量中的值的值。 可以使用表达式来定义步骤条件或定义会话变量的值。

watsonx Assistant 表达式语言基于 Spring 表达式语言 (SpEL),但在语法上存在一些重要差异。 SpEL,详细背景信息,请参阅 Spring Expression Language SpEL )。

您可以通过两种方式使用 SpEL 表达式:

引用操作变量

将为期望客户输入的任何步骤隐式创建操作变量,并且该变量将绑定到该步骤。 要在表达式中引用操作变量,必须使用格式 ${step_id} (例如,${step_771}) 指定步骤标识。 要查找步骤的步骤标识,请选择该步骤,然后在浏览器中查看 URL 的末尾。

引用会话变量

将在步骤的 变量 部分中显式创建会话变量。 要在表达式中引用会话变量,必须使用格式 ${variable_id} (例如,${current_time}) 指定变量标识。 您可以在变量列表中找到变量标识。 (有关更多信息,请参阅 使用变量来管理对话信息。)

编辑表达式时,可以输入 $ 以查看可以引用的变量列表。 从列表中选择变量以自动插入步骤标识或变量标识。

支持的数据类型

表达式可以使用原子 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.002021-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-ddyyyy-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 的格式指定。

例如,要获取一小时后的时间,请使用以下表达式:

 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 类的标准方法。

例如,要获取从今天起一周后的日期,可以使用以下语法:

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

此表达式首先获取当前日期,以毫秒为单位(自 1970 年 1 月 1 日 00:00:00 GMT 起)。 它还计算以 7 天为单位的毫秒数 ((24*60*60*1000L) 表示以毫秒为单位的一天)。 然后,将当前日期加上 7 天。 结果是从今天算起一周的完整日期 (例如,Fri Jan 26 16:30:37 UTC 2018)。

Number 方法

这些方法可帮助您获取数字值并重新设置其格式。

有关识别客户响应中的数字的信息,请参阅 选择响应类型

如果您想更改数字的小数点位置(例如,将数字重新设置为货币值),请参阅 字符串格式()方法

toDouble()

将对象或字段转换为 Double 数字类型。 可以对任何对象或字段调用此方法。 如果转换失败,将返回 null

toInt()

将对象或字段转换为 Integer 数字类型。 可以对任何对象或字段调用此方法。 如果转换失败,将返回 null

toLong()

将对象或字段转换为 Long 数字类型。 可以对任何对象或字段调用此方法。 如果转换失败,将返回 null

要在 SpEL 表达式中指定长整型数字类型,必须将 L 附加到该数字以将其标识为长整型数字类型 (例如,5000000000L)。对于不适合 32 位整数类型的任何数字,都需要此语法。 大于2^31(2,147,483,648)或小于 -2 (-2 )的数字被视为长数字类型。 长整型数字类型的最小值为 -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()

返回一个随机数。 您可以使用以下任意语法选项:

  • 要返回一个随机的布尔值( truefalse ),请使用 new Random().nextBoolean()
  • 要返回一个介于0(含)和1(不含)之间的随机双数,请使用 new Random().nextDouble()
  • 要返回一个介于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(

在这个例子中,操作变量保存与您指定的正则表达式模式组匹配的字符串。 在表达式中,定义了两个正则表达式模式组,每个组都用括号括起。 固有是由两个组组成的第三组。 这是第一个 groupIndex )正则表达式组;它与包含数字组和文本组的字符串匹配。 第二个正则表达式组 (groupIndex 1) 与第一次出现的数字组相匹配。 第三个组 (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 开始,因此如果要返回第三个匹配项,请将 2 指定为 matchIndex 值。 例如,如果输入的文本字符串包含与指定模式匹配的三个词,那么只能通过指定其索引值来返回第一个、第二个或第三个匹配项。

例如,以下示例在操作变量中查找一组数字。

${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() 方法应用于文本。 有关要使用的语法的信息,请参阅 格式字符串语法

这个例子取三个十进制整数(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...)

此方法向数组添加一个或多个新值,并在操作成功时返回 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...)

此方法将一个或多个新值附加到数组,并将结果作为新数组返回。 未修改原始数组。

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

如果 Items['one', 'two', 'three'],那么此示例将返回新数组 ['one', 'two', 'three', 'four', 'five']

Array.clear()

此方法从数组中移除所有值并返回空值。

${Items}.clear()

对此表达式求值后,Items 是空数组 ([])。

Array.contains(value)

如果数组包含与输入值完全相同的项,那么此方法将返回 true。 指定的值可以是字符串或数字。

${Items}.contains(123)

如果 Items[123, 456, 789],那么此示例将返回 true

Array.containsIgnoreCase(value)

如果数组包含等于输入值的项,那么此方法将返回 true。 无论以大写字母还是小写字母指定值,都将匹配字符串。 指定的值可以是字符串或数字。

${Items}.contains('two')

如果 Items 数组包含字符串 two 的任何大写形式 (例如,TWOTwo 也将匹配),那么此示例将返回 true

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} 的变量中,那么以下表达式将返回一个较小的数组,该数组仅包含人口超过 5 百万的城市:

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

此表达式将返回以下过滤后的数组:

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

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

   }
]

您还可以根据存储在变量中的动态值进行过滤,而不是使用硬编码比较值。 此示例通过使用上一步中由客户响应指定的填充值进行过滤:

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

比较数值时,请务必在触发过滤方法之前将比较所涉及的上下文变量设置为有效值。 请注意,如果要与其进行比较的数组元素可能包含 null,那么 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'],那么此示例将随机返回 onetwothree

Array.indexOf(value)

此方法返回第一次出现的输入值在数组中的下标位置,如果数组不包含输入值,那么返回 -1。 指定的值可以是字符串或数字。

${Items}.indexOf(`two`)

如果 Items['one', 'two', 'three'],那么此示例将返回整数 1 (指示零索引数组中的第二个位置)。

Array.join(String delimiter)

此方法用于将此数组中的所有值连接成一个字符串。 值将转换为字符串,并由输入定界符进行定界。

例如,您可以使用名为 pizza_toppings 的变量,该变量包含数组 ["pepperoni", "ham", "mushrooms"]。 以下表达式将此数组转换为字符串 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 参数指定方法是否保留返回数组中所有输入值的数据类型。 如果 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/>

确保显示助手输出的通道集成支持您在模板中使用的任何格式。

如果创建名为 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 对象而不是字符串,这提供了一种方法来标准化来自不同系统的信息的格式,或者将数据转换为外部服务所需的格式。

在此示例中,模板定义为 JSON 对象,用于从存储在 Flight data 会话变量中的数组中指定的元素中抽取飞行详细信息:

{
  "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]
["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} 不适用
示例 ${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 标志不包含在变换的输出中。