智能应用开放平台

平台在识别用户所说的语料时,能够从语料中提取到关键信息保存在参数(SlotEntity)中。参数关联实体,则是规定了此关键词的取值范围。

例如当用户通过语料“杭州今天天气”进入天气查询意图时,平台可以从这句话中提取到“地点:杭州”和“时间:今天”参数。


参数的创建方式

  • 例句式语料中关键词标注实体时自动创建的参数,此参数的参数名是自动生成的。
  • 模板式语料或语料批量导入前,需要先手动创建参数,指定参数名称和参数所关联的实体。


PS: 参数一旦创建成功,参数名称不可修改。


参数中的各项配置

必选:勾选了必选,则代表平台在请求开发者 Webhook 服务时一定会携带此参数。勾选后需要在以下两个选项中选择一个:1.关闭 精灵追问 按钮,并填写 系统默认实体值;2.点击 编辑,并配置至少一条 追问语句如果勾选了必选,没有填写默认值,也没有设置追问。就会出现对话出错或对话正确但没有任何回复内容。


参数名称:在模板式语料中可以使用 @{参数名称} 引用参数,当我们在后台发起对参数进行追问时,也要指定追问的参数名称。


关联实体:关联的实体代表了此参数的取值范围;但某些情况下参数的取值可以不是实体中定义的实体值。例如参数定义的默认值不在关联的实体中,在没有解析到时依旧使用定义的默认值传递。


前置意图参数:如果此意图有前置意图,在执行过前置意图后再来执行此意图时,可以将前置意图识别到的参数传递到此意图中,这需要两个意图中需要传递的参数关联的实体是相同的。点击 启用前置意图,选择前置意图和最大距离(在执行过前置意图后经过N轮对话后再执行此意图时就无法传递参数了);然后在参数的 前置意图参数 中填写前置意图的参数引用,格式为:前置意图标识.(前置意图中的)参数名称


前置意图参数.gif


精灵追问:此按钮控制 “系统默认实体值”和 “追问语句”二选一。因为默认值优先于精灵追问,同时配置会直接传递默认值而不是触发自动追问。


系统默认实体值:当语料中没有识别到此参数时就会将填写的默认值当做参数值传递。


追问语句:当参数没有取值时触发精灵追问,平台会自动选择随机一条追问语句回复用户。(需要注意:精灵追问属于平台自动进行,此时不会访问开发者 Webhook 服务。


回复语句:是面对参数追问时 用户可能回复 的语句。例如天气查询意图追问城市参数时,用户可能回答“北京”,也可能回答“我想查询北京的”。前面的回答平台可以直接抽取到 city 参数,后面的回答就需要开发者配置 用户可能的回复


如何配置精灵追问和默认值

以“查询天气”意图为例,意图中定义了一些语料,如下图所示:

意图语料.png


从图上可以看到:有的语料中包含了两个参数,如“杭州今天天气”。平台能够从这句语料中解析到时间地点的关键信息,这也是查询天气必要的两个参数。


但有的语料不包含或只包含部分关键信息,如“天气怎么样”。那么对于缺少的必要信息就需要通过其他方式获取到。获取的方式有三种:

  • 使用默认值,用户不说则参数默认是这个取值。
  • 使用精灵追问,由平台自动向用户追问参数;
  • 使用后台追问,后台追问参数的方法参考【响应数据】。


一.默认值

当用户说“天气小助手,天气”进入意图时,平台无法从这句语料中解析任何参数。时间参数我们可以设置默认值,如果用户不说,那么就默认是今天。

  1. “sys.date(公共实体)”参数配置中勾选必选
  2. 关闭精灵追问按钮;
  3. 系统默认实体值中填写“今天”;
  4. 点击保存。

参数默认值.gif


二.精灵追问

当用户说“天气小助手,今天天气”时,平台只能从语料中解析到时间参数,那么还需要向用户询问地点参数。

  1. “city”参数配置中勾选必选
  2. 然后点击追问和回复下的编辑
  3. 点击添加追问语句
  4. 精灵追问内输入追问用户时的话术:"请问您要查询哪个城市的天气?";
  5. 如果想设置多条追问,还可以继续添加追问语句;
  6. 最后点击保存。

精灵追问.gif


参数的取值顺序

一. 首次进入意图

用户首次进入意图时,参数的取值可能有以下几种结果(优先级前高后低):

  1. 从用户所说的语料中提取;
  2. 从前置意图中传递过来的参数取值;
  3. 参数设置必选并填写的默认值;
  4. 参数设置必选并配置了追问语句,会自动使用追问语句向用户询问;
  5. 参数没有设置必选,则此参数没有取值。


二. 在意图中连续对话

用户在一个意图中的连续对话,那么这些对话就有上下文关系。在上下文关系中,前边对话中识别的参数会一直存在。如果参数有新的取值,那么这个参数值就会刷新。(可以通过参数的 livetime 值判断参数是什么时候取到值的。本轮对话中新识别到的取值,参数的 livetime 为 0。如果继续在本意图下对话,但此参数没有刷新取值,每过一轮对话,参数的 livetime 值 +1。直到从用户的语料中再次识别到此参数,则参数的 livetime 值归 0。)


在连续对话中参数的取值可能有以下几种结果(优先级前高后低):

  1. 从用户所说的语料中提取;
  2. 参数设置必选并填写的默认值;
  3. 此参数前边已经识别过的取值;
  4. 参数没有设置必选,此参数没有取值;


PS:即使用户在这个意图的对话已经结束,但再次进入这个意图时也会被认为对话是连续的。即使参数设置了必选和追问语句,由于认为是在连续对话中,此参数就之前已经识别到了,也就不会再触发精灵追问。


如下图所示:

多轮对话演示.png


通过前两轮对话,天气查询意图已经执行完毕。但用户再次进入天气查询意图时,由于依旧在此意图中,会认为和之前的对话属于同一次对话,会将之前的 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实体的参数只会解析从语料中识别的时间,不会解析默认值中设置的时间。