模糊匹配


假设技能语料是:“空调怎么卖”,以下用户说法可以用模糊匹配命中技能
礼貌用语:“请问一下空调怎么卖”
语气助词:“空调怎么卖的”
部分近义词:“空调怎么出售”

模糊匹配阈值

阈值越低,用户说法越容易命中技能,但是误触发也越高 每个技能可设置不同阈值。取值范围【0.50,0.99】,默认值0.82。 如果产品使用场景单一,可以开启模糊匹配,降低阈值提高命中率。
如果产品配置了多个技能,建议丰富语料提高命中率,而不是降低阈值。

模糊匹配开关

自定义技能的模糊匹配默认开启,可在自定义技能以下位置查看修改模糊匹配开启状态

匹配 - 图1

模糊匹配设置

  1. 在应用配置中,点击管理技能配置
    匹配 - 图2
  2. 点击需要调整的技能右下角小齿轮
    匹配 - 图3
  3. 调整阈值后确定保存
    匹配 - 图4

填槽对话


多轮对话

多轮对话分为意图内多轮对话意图间多轮对话

意图内多轮对话(填槽对话)

填槽对话:用户表述信息不完整,引导用户补充缺失的信息 示例
  • 用户:我要订闹钟
  • 系统:您要订几点的闹钟 (填槽对话:追问语句)
  • 用户:明早六点

意图间多轮对话

示例
  • 用户:订1间房
  • 系统:预约成功,请问还需要一份早餐吗?
  • 用户:来3份
  • 系统:预定成功
上述示例包含「定房间」和「定早餐」2个意图。意图间的多轮对话,需要开发者自己实现,具体参考技能云函数。

填槽对话概念

  1. 槽值和追问语句
    例如订闹钟技能,槽值是时间(time),是必须信息。
    缺少必须信息会触发追问语句:您要订几点的闹钟
  2. 槽位确认
    槽位可设置为需用户确认。请谨慎使用,避免繁琐。示例:
  • 用户:订2间房
  • 系统:是2间房吗? (槽位确认)
  1. 意图确认
    意图可设置为需用户确认,例如在购物技能中,当用户选购完商品后,你可以要求对意图进行确认,“你购买了一副墨镜,确认下单吗?”。

图示

填槽对话流程图:
  • 如果使用 Delegate(托管)或者关闭云函数,系统会依次遍历每一个环节(每次请求都是从第一个环节开始遍历)。当系统发现该环节被开发者在平台上标记为必选或者开启,且该环节的值为 null 或者 none,就会触发该环节,否则会跳过该环节直至流程结束。
  • 如果开发者调用了ElicitSlotDirective(槽追问)、ConfirmSlotDirective(槽位确认)、ConfirmIntentDirective(意图确认),则以开发者指定的环节为准。

匹配 - 图5

示例

以”订票”技能举例,飞机票(buyPlaneTicket)意图的语义槽分别是fromCity(出发城市)、toCity(到达城市)、time(出发时间),其中 fromCity 通过 GPS 信息获取,toCity和time为用户必须回答的槽位。 示例对话:
槽追问
  • 用户:买一张周三的飞机票
  • 系统:你想到哪个城市?
    ```json
    {
“name”: “buyPlaneTicket”,
“confirmationStatus”: “NONE”
“slots”: [
{
  1. "name": "fromCity",
  2. "value": "",//开发者通过获取 GPS 信息,通过代码填写为合肥
  3. "confirmationStatus": "NONE"
},
{
  1. "name": "toCity",
  2. "value": "",
  3. "confirmationStatus": "NONE"
},
{
  1. "name": "time",
  2. "value": "周三",★★★
  3. "confirmationStatus": "NONE"
}
], }
  1. 槽确认
  2. - 用户:我想去北京
  3. - 系统:你确认目的地是北京吗 槽位确认
  4. ```json
  5. {
  6. "name": "buyPlaneTicket",
  7. "slots": [
  8. {
  9. "name": "fromCity",
  10. "value": "合肥",
  11. "confirmationStatus": "NONE"
  12. },
  13. {
  14. "name": "toCity",
  15. "value": "北京",★★★
  16. "confirmationStatus": "NONE"
  17. },
  18. {
  19. "name": "time",
  20. "value": "周三",
  21. "confirmationStatus": "NONE"
  22. }
  23. ],
  24. "confirmationStatus": "NONE"
  25. }
意图确认
  • 用户:确认
  • 系统:好的,周三从合肥去北京的机票确认下单吗 ( 意图确认 )
  1. {
  2. "name": "buyPlaneTicket",
  3. "slots": [
  4. {
  5. "name": "fromCity",
  6. "value": "合肥",
  7. "confirmationStatus": "NONE"
  8. },
  9. {
  10. "name": "toCity",
  11. "value": "北京",
  12. "confirmationStatus": "CONFIRMED"
  13. },
  14. {
  15. "name": "time",
  16. "value": "周三",
  17. "confirmationStatus": "NONE"
  18. }
  19. ],
  20. "confirmationStatus": "NONE"
  21. }
Copy 填槽对话结束
  • 用户:确认下单
  • 系统:好的,已下单 (填槽对话结束)
  1. {
  2. "name": "buyPlaneTicket",
  3. "slots": [
  4. {
  5. "name": "fromCity",
  6. "value": "",
  7. "confirmationStatus": "NONE"
  8. },
  9. {
  10. "name": "toCity",
  11. "value": "北京",
  12. "confirmationStatus": "CONFIRMED"
  13. },
  14. {
  15. "name": "time",
  16. "value": "周三",
  17. "confirmationStatus": "NONE"
  18. }
  19. ],
  20. "confirmationStatus": "CONFIRMED"
  21. }
Copy

系统配置与云函数的相互配合

以快递查询技能举例,2个槽位是 express_number 和 express_company。假如我们现在拥有一个快递查询 API,99%的快递单号,可以自动判断属于哪一家快递公司,1%的快递单号需要用户人工选择。 我们应当把 express_number 和 express_company 勾选为必选槽(如下图)

匹配 - 图6

实际使用中云函数中的伪代码如下:
  1. if(express_number.value==null){
  2. if(express_company.value==null){
  3. //如果用户没有标明快递公司,则使用自动识别
  4. express_company.value="自动识别"
  5. }
  6. //如果快递单号为空,因为在平台上配置了必选槽,可以直接托管给系统
  7. //此时使用ElicitSlotDirective效果相同
  8. DelegateDirective()
  9. return
  10. }
  11. // 调用 API 获取快递信息
  12. express_result = express_api(express_number.value)
  13. if(express_result=='无法自动判断快递公司'){
  14. // 如果无法自动判断快递公司,使用ElicitSlot追问用户
  15. ElicitSlotDirective(express_company,'请问你的快递公司是什么')
  16. }else{
  17. // 可以自动判断快递公司,直接播报查询结果给用户
  18. speak(express_result)
  19. }
Copy

注意事项

填槽对话只是准确理解需求的一个技术手段,但不鼓励设计过多的多轮对话。 反例
  • 用户:清华大学的录取分数线是多少
  • 系统:请问你想查询的省份是哪一个?
  • 用户:安徽
  • 系统:请问你是文科还是理科?
  • 用户:理科
  • 系统:请问你想查询哪一年的分数?
  • 用户:2017年
  • 系统:请问你想查询的是提前批还是本科一批?
  • 用户:本科一批
  • 系统:2017年清华大学在安徽的本科一批理科投档线是670分
正例
  • 用户:清华大学的录取分数线是多少
  • 系统:清华大学2017年在安徽的本科一批投档线是理科670分、文科648分。你还可以问我往年和提前批的分数线。
开发者可以通过GPS 获取设备位置,默认返回最近一年的分数,多数情况下用户想要知道的是本科一批的信息,文科理科分数线可以同时返回,在返回了关键信息后,提醒用户可以通过进一步的对话,获取更多信息。