更新时间:2023-09-20 GMT+08:00

配置场景

场景

某医院需要使用智能语音导航完成一个简单的机器人预约挂号流程,流程如下:

图1 机器人预约挂号流程

注:蓝底部分表示智能语音导航执行的步骤。

  1. 客户致电医院客服电话123456。
  2. 初始化语言,设置为中文或英文。
  3. 致欢迎语。
  4. 客户说话。
  5. 将客户的说话与现有意图匹配,如果未匹配到指定意图,则告知未知意图。
  6. 如果匹配到指定意图(其意图设置四个必选槽位:预约科室、预约医生、预约日期、预约时间点),将一一询问客户预约的科室、预约的医生、预约的日期、预约的时间点。
  7. 如果客户回答出以上四个信息,告知客户刚刚回复的预约挂号信息,并询问客户是否确认挂号。
  8. 客户回答。
  9. 将客户的说话与现有意图(其意图设置为是否确认)匹配。
    1. 如果匹配到确定意图,则进行下一步,告知客户预约成功。
    2. 如果匹配到否定意图,则系统携带之前客户的预约挂号信息再次返回到5的意图识别。
    3. 如果匹配到客户说日期错误。
      1. 询问客户是否需要修改预约日期。
      2. 客户回答。
      3. 将客户的说话与现有意图(其意图设置为是否确认)匹配
      4. 如果匹配到不修改,则进行下一步,告知客户预约成功。如果匹配到需要修改日期,询问客户修改为哪一天。
      5. 客户回答。
      6. 系统携带客户的回答和之前的预约挂号信息再次返回到5的意图识别。
    4. 如果未匹配到意图,则告知未知意图。
  10. 告知客户预定成功。
  11. 客户挂机。

需求分析

根据上述流程,我们可以分析出整个流程需要如下资源和配置:

表1 需求分析

步骤

资源

图元

节点属性设置

备注

开始

-

-

-

初始化语言

业务接口:初始化语言

缓存变量名:GLOBAL.language

响应中的属性名:"zh_CN"

实际应用场景可通过使用真实的接口调用确认语言,本节的机器人配置演示使用该图元赋值,无需选择调用接口,直接添加缓存变量名,将其赋值来初始化语言。

例如英文对应的响应中属性名为:

"en_US"

欢迎语

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.welcome

应答模式:支持播放后再识别

添加流程变量,例如:

变量名称:welcome

数据类型:字符型

缺省值:欢迎使用自助挂号系统

获取客户回答

业务接口:缓存对话交互结果

缓存变量名:FLOW.ask

响应中的属性名:IVRREQUEST.input

无需选择调用接口,直接添加缓存变量名。

添加流程变量,例如:

变量名称:ask

数据类型:字符型

缺省值:预约${FLOW.dateSlot}的${FLOW.timeSlot}的{FLOW.docSlot}的${FLOW.roomSlot}。

语义识别(含意图是否匹配)

意图模板:挂号

语义识别内容:FLOW.ask

设置变量:

  • 获取意图匹配到的科室
    • 缓存变量名:FLOW.roomSlot
    • 响应中的属性名:TOC.ChatBotroom
  • 获取意图匹配到的医生
    • 缓存变量名:FLOW.docSlot
    • 响应中的属性名:TOC.ChatBotdoctor
  • 获取意图匹配到的日期
    • 缓存变量名:FLOW.dateSlot
    • 响应中的属性名:TOC.ChatBotdate
  • 获取意图匹配到的时间点
    • 缓存变量名:FLOW.timeSlot
    • 响应中的属性名:TOC.ChatBottime

判断条件列表

  • 匹配到了配置的挂号意图
    • 条件名:finish
    • 条件表达式:TOC.ChatBotIntentCode=='finish'
  • 匹配到了配置的挂号意图的必选科室槽位的命令字
    • 条件名:room
    • 条件表达式:TOC.ChatBotIntentCode=='room'
  • 匹配到了配置的挂号意图的必选医生槽位的命令字
    • 条件名:doctor
    • 条件表达式:TOC.ChatBotIntentCode=='doctor'

添加流程变量,例如:

变量名称:roomSlot

数据类型:字符型

变量名称:docSlot

数据类型:字符型

变量名称:dateSlot

数据类型:字符型

变量名称:timeSlot

数据类型:字符型

获取客户需要预约的科室

(匹配到条件名:room)

业务接口:调用查询科室的接口

缓存变量名:FLOW.answer

响应中的属性名:FLOW.room + TOC.ChatBotRespContent

无需选择调用接口,直接添加缓存变量名。

添加流程变量,例如:

变量名称:answer

数据类型:字符型

变量名称:room

数据类型:字符型

缺省值:当前可以选择的科室为内科和外科

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.answer

应答模式:支持播放后再识别

-

获取客户需要预约的医生

(匹配到条件名:doctor)

业务接口:调用查询对应科室医生的接口

缓存变量名:FLOW.answer

响应中的属性名:FLOW.doctor + TOC.ChatBotRespContent

无需选择调用接口,直接添加缓存变量名。

添加流程变量,例如:

变量名称:answer

数据类型:字符型

变量名称:doctor

数据类型:字符型

缺省值:当前科室值班医生有刘医生和李医生

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.answer

应答模式:支持播放后再识别

-

告知客户已预约的挂号信息

(匹配到条件名:finish)

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:TOC.ChatBotRespContent

应答模式:只播放不支持识别和按键

-

默认应答

(未匹配到任何条件名)

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:TOC.ChatBotRespContent

应答模式:只播放不支持识别和按键

说明:

连线上不匹配任何条件名,即为默认分支。

询问是否确认挂号信息

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.check

应答模式:支持识别打断

添加流程变量,例如:

变量名称:check

数据类型:字符型

缺省值:确定上面的信息吗?

语义识别(含意图是否匹配)

意图模板:确认

判断条件列表

  • 匹配到了确认的意图
    • 条件名:yes
    • 条件表达式:TOC.ChatBotconfirm=='是'
  • 匹配到了不确认的意图
    • 条件名:no
    • 条件表达式:TOC.ChatBotconfirm=='否'
  • 匹配到了日期错误
    • 条件名:part
    • 条件表达式:TOC.ChatBotconfirm=='日期错误'

-

使用缓存变量缓存数据再进行语义识别确认客户挂号信息

(匹配到条件名:no)

-

缓存变量名:FLOW.ask

响应中的属性名:'预约挂号'

无需选择调用接口,直接添加缓存变量名。

再次确认客户是否要修改日期

(匹配到条件名:part)

应答模板:是否要修改日期

应答类型:回复文本

应答来源:应答模板

(TTS会根据变量返回的值动态播放语音)

应答模板:redate

应答模式:支持识别打断

需添加应答模板

意图模板:确认

判断条件列表

  • 匹配到了确认不修改日期的意图
    • 条件名:yes
    • 条件表达式:TOC.ChatBotconfirm=='是'
  • 匹配到了确认修改日期的意图
    • 条件名:no
    • 条件表达式:TOC.ChatBotconfirm=='否'

-

询问修改日期,再进行语义识别确认挂号信息

(匹配到条件名:no)

缓存变量名:FLOW.dateSlot

响应中的属性名:''

缓存变量名:FLOW.answer

响应中的属性名:'请问你要改为哪一天?'

无需选择调用接口,直接添加缓存变量名。

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.answer

应答模式:支持识别打断

-

缓存变量名:FLOW.dateSlot

响应中的属性名:IVRREQUEST.input

缓存变量名:FLOW.ask

响应中的属性名:'预约挂号'+FLOW.dateSlot+'的'+FLOW.timeSlot +FLOW.docSlot +'的' +FLOW.roomSlot

无需选择调用接口,直接添加缓存变量名。

告知客户挂号信息并表示感谢

(匹配到条件名:yes)

-

应答类型:回复文本

应答来源:应答变量

(TTS会根据变量返回的值动态播放语音)

应答变量:FLOW.thanks

应答模式:只播放不支持识别和按键

添加流程变量,例如:

变量名称:thanks

数据类型:字符型

缺省值:已经预订成功,谢谢您的使用,再见。

结束

-

-

-

为确保容错性,您还需要配置一个未知意图,用于识别意图匹配不到的情况。

其中涉及到意图的部分,还需要继续细化分析如下信息,此处以挂号这个意图为例介绍,其他方法类似。

  • 客户回答预约挂号的时候有多种说法 (语料)
    • 我想看个医生
    • 挂号
    • 预约挂号
    • 我要挂一个明天下午16:00点李医生的内科

    您需要尽量多的考虑回答场景,才能确保意图匹配的精确。

  • 客户回答的信息中哪个是我们需要的信息?(槽位&实体)

    例如客户回答挂号16.00点,那么16.00点是我们需要获取的槽位信息,您需要在意图中添加该槽位信息,而槽位信息需要有对应的实体关联,因此还需要确认实体配置中是否有类似的实体。本例中可以使用系统实体@system.time。

    如果客户回答挂号李医生,那么李医生是我们需要获取的槽位信息,您需要在意图中添加该槽位信息,而槽位信息需要有对应的实体关联,系统实体中没有这个实体,那我们需手动添加医生这个实体。

  • 意图匹配的命令字,即语义识别图元所需的TOC.ChatBotIntentCode的值。请全局保持唯一(响应)

    由于意图中的响应是可以设置分支条件的,可以直接添加分支,回复不同的TOC.ChatBotIntentCode。