本章介绍 UNIT企业版产品表达式配置使用规范。 表达式可以用在会话树节点配置中,节点触发条件和节点执行回复内容的配置
平台使用的表达式标识
- 无前缀:表示内置DialogState对象的属性(welcome, conversation_start, anything_else, true, false, query等)
- #:表示引用意图
- @:表示引用实体
- &:表示引用上下文context中的某个key
- {%:模板标识前缀
- %}:模板标识后缀
触发/回复条件表达式举例
Condition类型的表达式必须合法,且在创建此类表达式时需保证引用的意图或实体已存在,其求值结果只能是true/false,逻辑操作符(not, and, or, !, &&, ||)的操作数的类型必须为String、Integer、Boolean、null。如:
- welcome(首轮会话,且用户输入的query为空时,结果为true)
- conversation_start(首轮会话,则为true)
- anything_else(query非空时,结果为true)
- not query(用户输入的文本数据为空时,结果为true)
- not @sys_date(sys_开头的表示系统实体,若命中,因取反,故结果为false)
- @car_type(若命中自定义实体car_type,则结果为true)
- &channel(context中包含key: channel,且对应的value非空,则为true)
- #get_weather(自定义意图识别,若命中此意图,则为true)
- &name == "baidu"(若context中,name对应的value为字符串"baidu",则为true)
- @location?.indexOf('北京') > 0(建议使用?.)
- &month and &month >= 1(若context中month对应的value非空且大于等于1,则为true)
- {12,24,36}.contains(&month)(若context中month对应的value值为12,24,36中一个,则为true)
Context 对象及包含的表达式举例
context为json对象(key-value结构),其value为表达式字符串;在进行求值时,正常返回各子表达式结果用于填充context各value,若因对象不存在或解析异常,则原样返回表达式串,如:
- {"ques":"@ques","quenum":"12"}(对于数字,直接写在json串的双引号中即可)
- {"user":"'张女士'"}(对于常量字符串,需显式用单引号'或者\"括起来)
- {"date":"@sys_date"}(sys_date为系统实体,系统实体见2.4节)
- {"month":"@sys_number"}
- {"sex":"@sex"}
- {"car":"@car_type"}
- {"location":"{% @location %}"}
- {"date":"entities['sys_date'][1].value"}(entities为map,按key取值;entities['sys_date']结果为List,故按下标取其中第2个元素;entities['sys_date']``[1]结果为RecognizedEntity对象,使用.value获取其value属性的值)
- {"entity":"entities.toString()"}(输出整个map对象)
- entities['sys_date'].![value] ,遍历所有实体值
回复内容表达式
Output 为字符串表达式,其所有需要解析的表达式必须用模板标识包含起来,表达式用法同上;在进行求值时,若出现不能解析的情形,原样返回表达式串,如:
- intent={% &intent %}, entitySize={% &entities?.size() %}(为更好可读性,{%之后,%}之前各加一个空格)
不支持及特殊Case
- ==操作符的使用,在对实体值进行==判断时,须保证左右操作数为字符串,如:(若@month实体值为"8") "@month == '8'"的值为true,而"@month == 8"的值为false。其它比较操作符>,>=,<,<=不受此约束。
常用配置举例
日期常用表达式
- 获取当前年:T(java.util.Calendar).getInstance().get(T(java.util.Calendar).YEAR)
- 获取当前月:T(java.util.Calendar).getInstance().get(T(java.util.Calendar).MONTH)+1
- 获取当前日:T(java.util.Calendar).getInstance().get(T(java.util.Calendar).DAY_OF_MONTH)
- 获取指定的年:T(Integer).parseInt(@sys_date.substring(0,4))或者@sys_year
- 获取指定的月:T(Integer).parseInt(@sys_date.substring(5,7))或者@sys_month
- 获取指定的日:T(Integer).parseInt(@sys_date.substring(8,10))
- 指定日期的7天后:new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date(new java.text.SimpleDateFormat("yyyy-MM-dd").parse(@sys_date).getTime()+7 * 24 * 60 * 60 * 1000))
- 判断用户输入的时间是否为6个月前: (new java.util.Date().getTime() - new java.text.SimpleDateFormat("yyyy-MM-dd").parse(@sys_date).getTime()) / 1000 >= 6 * 30 * 24 * 3600
- 将@sys_date的日期格式(yyyy-MM-dd)转化为更友好的,如:yyyy年MM月dd日 new java.text.SimpleDateFormat("yyyy年MM月dd日").format(new java.text.SimpleDateFormat("yyyy-MM-dd").parse(@sys_date)) 注:其它格式只需要自己修改表达式中的yyyy年MM月dd日即可
- 将@sys_month的日期格式(yyyy-MM)转化为更友好的,如:yyyy年MM月 new java.text.SimpleDateFormat("yyyy年MM月").format(new java.text.SimpleDateFormat("yyyy-MM").parse(@sys_month))
注:同例9,其它格式只需要自己修改表达式中的yyyy年MM月即可;另外,格式上也支持时间,例如HH时mm分ss秒
- 获取当前日期 new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());其中"yyyy-MM-dd"可替换成自己需要的格式,同上
获取实体的值及原始值
- @entity返回实体entity的识别值;举例:用户query为:”我的户号是123456789012345678“,表达式@sys_number的求值结果为1.23456789012345678E18
- @entity.original返回实体entity的原始值;举例:用户query为:“我的户号是123456789012345678”,表达式@sys_number.original的求值结果为123456789012345678,该表达式在收集原始数字时经常用到。
数字运算&计数
- @sys_number加1:T(Integer).parseInt(@sys_number) + 1
- 在会话树中进行计数:可以使用变量在会话过程中进行计数,在会话树变量赋值依次配置:number、表达式 、&number ? &number+1 : 1,表示对number变量进行计数累加,初始值为1
- 会话树节点访问计数:sys_counter为系统内置变量名,其可自动对会话过程中节点访问次数进行计数,使用方法:sys_counter['会话树节点名称'],该表达式返回指定定节点的访问次数。
- 获取@sys_number实体识别到的原始数值(以0开头的数字除外):@sys_number.indexOf('E') > -1 ? @sys_number.substring(0, @sys_number.indexOf('E')).replace(".", "") : @sys_number
- 获取@sys_number识别到的数字的长度(以0开头的数字除外) @sys_number.indexOf('E') > -1 ? T(Integer).parseInt(@sys_number.substring(@sys_number.indexOf('E') + 1))+1 : @sys_number.length()
- 货币实体sys_money默认返回的value单位为“分”,为了获取“元”,表达式为: T(Float).parseFloat(@sys_money) / 100 (需要确保sys_money实体存在)
- 数字格式转换,如想将某个变量xxx(数值),保留2位小数: new java.text.DecimalFormat("0.00").format(new Double(&xxx))
- 数字格式转换,如想将@sys_number的结果,保留2位小数: new java.text.DecimalFormat("0.00").format(T(Double).parseDouble(@sys_number))
多实体值收集
UNIT企业版支持多实体值收集,可以通过entities['实体名']获取实体对象列表,下面以sys_number实体进行举例,其它实体类似:
- 收集用户query中的所有数值,如收集“我可以接受的价格范围是1000到2000元”中的所有数值,可以配置表达式:entities['sys_number'].![value]进行收集,该表达式的值为:[1000, 2000]
- 若要收集用户query中原始的数字(如用户query中包含的是身份证号,直接使用1的办法,可能收集到的是精度丢失的科学计数法;或者数字前的0可能被丢弃),可以配置表达式:entities['sys_number'].![original],如用户query为“我的编号是01234和123456789”,该表达式的值为:[01234, 123456789]
节点条件及回复使用正则表达式
会话树节点条件中“高级模式”,支持使用正则表达式作为条件,语法为:query matches '正则表达式',注意:query必须完全命中正则表达式(从头到尾),如:
- 需要在某个节点收集户号(户号规则为10位数字),用户query为“我的户号是1234567890”,条件表达式query matches '.*(?
相似文档
- 在意图、问答和复合实体中,允许通过配置规则模板的方式来定义可以匹配的用户表述(query)的内容,从而可以实现通过规则的方式快速建立识别能力,对于一些特殊的case有比较好的针对性处理效果。 【百度智能云】智能客服
- 本产品除了提供通过枚举方式实现的普通实体和预置的系统实体以外,还为高级用户提供了规则实体和复合实体的功能。本文将介绍这两类实体的使用方法和注意事项。 【百度智能云】智能客服
- 第一步:服务层搭建。 说明: 本平台支持第三方会话引擎可插拔方式接入集成。调用ngd core/query接口时,UNIT企业版作为客户端会去第三方会话引擎进行查询,获取响应,根据优先级规则处理,返回用户;支持第三方会话引擎session管理。具体介绍如下:
- 在对话过程中,往往需要用户表达相关的实体信息来决定对话流程的分支;用户表达的过程由于方言、表达方式的不同,或者是建设时语料预计不足或泛化能力不够,容易造成无法识别导致流程异常结束,用户流失。因此推出此功能,希望尽量引导用户完成流程。 【百度智能云】智能客服
- 多语义识别与处理 当前版本新增了多语义识别能力,在基本设置中开启多语义识别设置即可使用该功能。多语义识别即一句多问,用户在一句话中表达多个意图或问答,系统也能依次识别并按照顺序进行处理。 【百度智能云】智能客服