表达式配置

功能概述

表达式配置进⼀步提升阿⾥云智能客服对话机器⼈平台的可扩展性,支持更为复杂的实际业务场景。

语法规范及说明

⽬前⽀持的表达式类型如下:

  • 槽位:在填槽节点上配置的槽位,使⽤ slotVars['完整槽位名'] 或slotVars['完整槽位名.origin']语法

进⾏引⽤,求值结果为对应的槽位值,该值在当前开启意图内有效,如:

sysVars['查天⽓意图.地点'] 或sysVars['查天⽓意图.地点.origin'],求值结果为对应的槽位值

或对应的归⼀化值

  • 变量:客户⾃⼰在平台机器⼈内定义的变量,使⽤ botVars['变量名称']语法进⾏引⽤,求值结果为对应的变量值,该值在整通对话有效,如:botVars['城市名称'];返回值为⾃定义变量“城市名称”对应的值(如:北京)

  • 服务返回参数:全局服务/⾃定义函数内返回的参数,使⽤ svcVars['xxx']语法进⾏引⽤,该值在整通对话有效,如:svcVars['全局服务名称.返回参数名']:返回值为引⽤的全局服务对应的某个返回参数值

  • 对话环境参数:上游系统随路传⼊的变量,使⽤ envVars['环境参数名称']语法进⾏引⽤,求值结果为对应的变量值,该值仅当前轮对话有效,如:envVars['VENDOR_PARAM']:返回值为环境参数VENDOR_PARAM对应的值

    • 常⽤的环境参数有:VENDOR_PARAM、SENDER_ID、SENDER_NICK、TAG、EMOTION_POLARITY、EMOTION_NAME、CURRENT_QUERY

    • 举例:envVars['VENDOR_PARAM']['key1']:返回VENDOR_PARAM中key1对应的值

  • 系统参数:云⼩蜜机器⼈问答过程中,DS内⾃动维护的变量,使⽤ sysVars['xxx']语法进⾏引⽤,在整通对话有效,分三⼤类:

    1. 获取当前的⽤户意图: sysVars['⽤户意图']

    2. 获取指定意图的触发次数,如:sysVars['查天⽓意图.intentHitTimes']

    3. Start节点或交互节点中的分⽀触发计数,如:sysVars['节点名称.分⽀名称.hitTimes']

  • 内置变量:系统内部提供的⼀些⼩⼯具,通常以sys开头,⽬前⽀持的如下:

    • sysTurn:当前对话轮数

    • sysDate:当前系统⽇期,格式为yyyy-MM-dd

    • sysTime:当前系统时间,格式为HH:mm:ss

    • sysQuery:获取当前⽤户query,等效于:envVars['CURRENT_QUERY']

    • sysGetRandom(n):返回指定范围[1,n]内的随机数字,如:sysGetRandom(10),求值后为7

  • 实体:使⽤@符号作为实体名称前缀进⾏输⼊,通常⽤于DS画布中条件判断,仅当前轮对话有效,如:

@⽤户编号:求值结果为识别到的“⽤户编号”实体对应的某个实体成员(当为系统实体时,结果为对应的识别值,如:北京)。其中,当⽤于条件判断时,其求值结果为true(识别到该实体)/false(未识别到该实体)

  • 意图:使⽤#符号作为意图名称前缀进⾏输⼊,通常⽤于DS画布中条件判断,仅当前轮对话有效,如:

#查天⽓意图:求值结果为该意图置信度值(如:0.95)。其中,当⽤于条件判断时,其求值结果为true(识别到该意图)/false(未识别到该意图)

使用举例

  • 条件判断类

条件判断类表达式求值结果只能是true/false,逻辑操作符(not,and, or)的操作数的类型必须为String、Integer、Boolean、null。常⽤举例如下:

表达式内容

表达式含义

#查天⽓意图

判断用户问句是否包含“查天气意图”;

@sys.date

判断用户问句是否包含“yyyy-MM-dd”格式的时间;

sysDate>='2022-01-01'

判断当前日期是否在'2022-01-01'之后;

botVars['⽤户编号'] =='123456789'

判断自定义变量“⽤户编号”是否等于“123456789”;

sysQuery matches'.*奖牌.*'

判断用户问句中是否包含“奖牌”二字;

说明

matches为内置关键字,⽤于严格匹配,使⽤标准正则表达式。

botVars['地点'].contains('北京')

判断自定义变量“地点”返回的值是否包含“北京”;

(new java.util.Date().getTime() - new java.text.SimpleDateFormat("yyyy-MM-dd").parse(@sys_date).getTime())/1000>=1 * 30 * 24 * 3600

判断⽤户输⼊的时间是否为1个⽉前。

  • 变量赋值及回复话术类

可选槽:旧DS画布需要配置可选槽位时,在新画布中只需在⽤户分⽀添加变量赋值即可,如:

表达式内容

描述

全局变量1=entityVars['地址实体'][0].normalizedValue

  • 将地址实体的归⼀化值赋值给全局变量1;

    • entityVars为系统内置关键字

    • .normalizedValue 表示实体的归⼀化值

    • entityValue表示实体的原始值。

全局变量2=sysDate

将当前⽇期赋值给全局变量2;

全局变量3=sysGetRandom(5)

在[1,5]范围内⽣成⼀个随机数,并赋值给全局变量3。

高级用法举例

  • 列表型回复话术配置

    • 场景:有些业务场景,三⽅服务返回的结果为列表型,且列表⻓度不定(如:库存列表),如何通过表达式,⽀持运营⼈员在画布上灵活配置回复话术。

    • ⽅案:引⼊函数类的表达式求值语法,可直接配置到机器⼈说的⽂本框,格式为:<f:⽅法名 input=输⼊表达式 output=输出表达式/> ,其中元素说明如下:

      • ⽅法名,⽀持的有:list(表示枚举)

      • 输⼊表达式:⽀持所有可求值的表达式,返回类型需与函数标识(list)⼀致

      • 输出表达式:⽀持所有可求值的模板表达式(与回复话术⼀致)。

      • 内置的变量有:&list_index表示list的下标、&list_element表示list中的元素。

      • 如果list中每个元素为Map,则Map中key的取法为:&list_[key]。

    • 举例:

      • Json数组型:

        • svcVars['查明细服务.result']值为:{"ret":[{"category":"⼥装","detail":"⽆货"},{"category":"玩具","detail":"有货"}]}

        • 表达式为:<f:list input=svcVars['查明细服务.result']['ret'] output=明细-第${&list_index+1}项:品类${&list_category }, 状态:${ &list_detail},/>

        • 对应的求值结果为:明细-第1项:品类 ⼥装, 状态:⽆货;第2项:品类 玩具, 状态:有货,

      • 简单数组型:

        • vcVars['查列表服务.result']值为:["⼥装","玩具"]

        • 表达式为:<f:list input=svcVars['查列表服务.result'] output=第${&list_index+1}项:${&list_element},/>

        • 对应的求值结果为:第1项:⼥装,第2项:玩具,

      • 其他

        • 获取当前指定实体的原值:rawEntities['实体名'][0].entityValue

暂不⽀持场景

  • 以#开头的表达式(意图),在变量赋值及回复话术暂不⽀持。

  • 以@开头的表达式(实体),在回复话术中暂不⽀持。