功能概述
表达式配置进⼀步提升阿⾥云智能客服对话机器⼈平台的可扩展性,支持更为复杂的实际业务场景。
语法规范及说明
⽬前⽀持的表达式类型如下:
槽位:在填槽节点上配置的槽位,使⽤ 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']语法进⾏引⽤,在整通对话有效,分三⼤类:
获取当前的⽤户意图: sysVars['⽤户意图']
获取指定意图的触发次数,如:sysVars['查天⽓意图.intentHitTimes']
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 |
|
全局变量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
暂不⽀持场景
以#开头的表达式(意图),在变量赋值及回复话术暂不⽀持。
以@开头的表达式(实体),在回复话术中暂不⽀持。