平台在识别用户所说的语料时,能够从语料中提取到关键信息保存在参数(SlotEntity)中。参数关联实体,则是规定了此关键词的取值范围。
例如当用户通过语料“杭州今天天气”进入天气查询意图时,平台可以从这句话中提取到“地点:杭州”和“时间:今天”参数。
参数的创建方式
- 例句式语料中关键词标注实体时自动创建的参数,此参数的参数名是自动生成的。
- 模板式语料或语料批量导入前,需要先手动创建参数,指定参数名称和参数所关联的实体。
PS: 参数一旦创建成功,参数名称不可修改。
参数中的各项配置
必选:勾选了必选,则代表平台在请求开发者 Webhook 服务时一定会携带此参数。勾选后需要在以下两个选项中选择一个:1.关闭 精灵追问 按钮,并填写 系统默认实体值;2.点击 编辑,并配置至少一条 追问语句。如果勾选了必选,没有填写默认值,也没有设置追问。就会出现对话出错,或对话正确但没有任何回复内容。
参数名称:在模板式语料中可以使用 @{参数名称} 引用参数,当我们在后台发起对参数进行追问时,也要指定追问的参数名称。
关联实体:关联的实体代表了此参数的取值范围;但某些情况下参数的取值可以不是实体中定义的实体值。例如参数定义的默认值不在关联的实体中,在没有解析到时依旧使用定义的默认值传递。
前置意图参数:如果此意图有前置意图,在执行过前置意图后再来执行此意图时,可以将前置意图识别到的参数传递到此意图中,这需要两个意图中需要传递的参数关联的实体是相同的。点击 启用前置意图,选择前置意图和最大距离(在执行过前置意图后经过N轮对话后再执行此意图时就无法传递参数了);然后在参数的 前置意图参数 中填写前置意图的参数引用,格式为:前置意图标识.(前置意图中的)参数名称。
精灵追问:此按钮控制 “系统默认实体值”和 “追问语句”二选一。因为默认值优先于精灵追问,同时配置会直接传递默认值而不是触发自动追问。
系统默认实体值:当语料中没有识别到此参数时就会将填写的默认值当做参数值传递。
追问语句:当参数没有取值时触发精灵追问,平台会自动选择随机一条追问语句回复用户。(需要注意:精灵追问属于平台自动进行,此时不会访问开发者 Webhook 服务。)
回复语句:是面对参数追问时 用户可能回复 的语句。例如天气查询意图追问城市参数时,用户可能回答“北京”,也可能回答“我想查询北京的”。前面的回答平台可以直接抽取到 city 参数,后面的回答就需要开发者配置 用户可能的回复。
如何配置精灵追问和默认值
以“查询天气”意图为例,意图中定义了一些语料,如下图所示:
从图上可以看到:有的语料中包含了两个参数,如“杭州今天天气”。平台能够从这句语料中解析到时间和地点的关键信息,这也是查询天气必要的两个参数。
但有的语料不包含或只包含部分关键信息,如“天气怎么样”。那么对于缺少的必要信息就需要通过其他方式获取到。获取的方式有三种:
- 使用默认值,用户不说则参数默认是这个取值。
- 使用精灵追问,由平台自动向用户追问参数;
- 使用后台追问,后台追问参数的方法参考【响应数据】。
一.默认值
当用户说“天气小助手,天气”进入意图时,平台无法从这句语料中解析任何参数。时间参数我们可以设置默认值,如果用户不说,那么就默认是今天。
- “sys.date(公共实体)”参数配置中勾选必选;
- 关闭精灵追问按钮;
- 在系统默认实体值中填写“今天”;
- 点击保存。
二.精灵追问
当用户说“天气小助手,今天天气”时,平台只能从语料中解析到时间参数,那么还需要向用户询问地点参数。
- “city”参数配置中勾选必选;
- 然后点击追问和回复下的编辑;
- 点击添加追问语句;
- 在精灵追问内输入追问用户时的话术:"请问您要查询哪个城市的天气?";
- 如果想设置多条追问,还可以继续添加追问语句;
- 最后点击保存。
参数的取值顺序
一. 首次进入意图
用户首次进入意图时,参数的取值可能有以下几种结果(优先级前高后低):
- 从用户所说的语料中提取;
- 从前置意图中传递过来的参数取值;
- 参数设置必选并填写的默认值;
- 参数设置必选并配置了追问语句,会自动使用追问语句向用户询问;
- 参数没有设置必选,则此参数没有取值。
二. 在意图中连续对话
用户在一个意图中的连续对话,那么这些对话就有上下文关系。在上下文关系中,前边对话中识别的参数会一直存在。如果参数有新的取值,那么这个参数值就会刷新。(可以通过参数的 livetime 值判断参数是什么时候取到值的。本轮对话中新识别到的取值,参数的 livetime 为 0。如果继续在本意图下对话,但此参数没有刷新取值,每过一轮对话,参数的 livetime 值 +1。直到从用户的语料中再次识别到此参数,则参数的 livetime 值归 0。)
在连续对话中参数的取值可能有以下几种结果(优先级前高后低):
- 从用户所说的语料中提取;
- 参数设置必选并填写的默认值;
- 此参数前边已经识别过的取值;
- 参数没有设置必选,此参数没有取值;
PS:即使用户在这个意图的对话已经结束,但再次进入这个意图时也会被认为对话是连续的。即使参数设置了必选和追问语句,由于认为是在连续对话中,此参数就之前已经识别到了,也就不会再触发精灵追问。
如下图所示:
通过前两轮对话,天气查询意图已经执行完毕。但用户再次进入天气查询意图时,由于依旧在此意图中,会认为和之前的对话属于同一次对话,会将之前的 city 和 date 参数携带。由于 city 参数有携带取值,所以就不会触发精灵追问。
参数如何传递到开发者后台服务
用户在通过语料进入意图后,平台先解析语料中的参数取值等数据,然后将解析到的数据放在请求体中通过 http(s) 请求开发者后台服务。那么请求体中的数据格式如下:
{ "sessionId": "b112a091-1523-4d2d-8059-e09461dafd73", "utterance": "天气小助手魔都今天天气", "token": "BPFoozkYw9Y8*************lffDMzTWJtKHOt", "requestData": { "userOpenId": "XXXXXXXX==", "deviceOpenId": "YYYYYYYYY==", "city": "上海" }, "botId": 10, "domainId": 12345, "skillId": 23456, "skillName": "天气小助手", "intentId": 34567, "intentName": "weather", "slotEntities": [ { "intentParameterId": 45678, //参数id "intentParameterName": "city", //参数名称 "originalValue": "魔都", //语料中识别到的值 "standardValue": "上海", //无论识别的是实体值还是同义词,此处都是实体值内容 "liveTime": 0, //参数存活时间,参数刷新时值归 0,否则对话每过一轮值 +1 "createTimeStamp": 1564110905331, //参数创建时间,毫秒 "slotName": "city:city", "slotValue": "魔都" }, { "intentParameterId": 56789, "intentParameterName": "sys.date(公共实体)", "originalValue": "今天", "standardValue": {}, "liveTime": 0, "createTimeStamp": 1564110905331, "slotName": "sys.date(公共实体):sys.date", "slotValue": {} } ], "requestId": "20190726111511958-508551760", "device": {} }
如果时间实体引用的是 sys.date 公共实体,那么在传递参数时参数的归一化值(standardValue)是一个json数据,如果用户所说的是相对日期,如“今天/明天/昨天”。平台会自动换算出用户所说的绝对日期,并且还有此日期对应的时间戳、农历日期、时区等数据。
json数据如下:
{ "cycle": false, "description": "今天", "fuzzyYear": false, "iDateString": "2020-05-07", "lunarDate": 1586880000000, "lunarDateFormat": "2020-04-15", "solarDate": 1588780800000, "solarDateFormat": "2020-05-07", "startDate": "2020-05-07", "startLunarDate": "2020-04-15", "stats": "SUCCESS", "timeZone": "GMT+8:00", "type": "DATE" }
注意: sys.date实体的参数只会解析从语料中识别的时间,不会解析默认值中设置的时间。