对话流程(FLOW)
本章节将讲解:什么是对话流程,以及如何在平台搭建对话流程。
很多时候,终端用户与机器人交互的目的并不只是获取一个常见问题的答案(这种简单任务可以通过一问一答来实现)。
终端用户的交互目的可能会很复杂。例如,用户通过机器人“查询订单状态”时,要想满足用户的这一目的,首先,机器人需要了解用户的”意图“;然后,机器人需要采取一些对话动作、获取完成这个意图所需的必要信息(比如,订单号,下单时间等);最后,用获取的信息完成任务。这往往需要多轮交互才能实现。
本平台的任务对话就提供了搭建多轮交互机器人的功能。
任务对话的核心能力
任务对话有三个重要能力:意图识别、实体抽取、对话管理。这每一个都由一个核心模块来完成:
- 意图识别:在用户发送第一句话后,机器人判断用户想表达的意图,并启动相应的任务流程。
比如:用户说“帮我定明天到上海的火车票”。机器人判断用户的意图为“订车票”。 在平台中,你可以通过设置意图的触发方式来教机器人进行意图识别。
- 实体抽取:从用户的每一句话中,机器人尝试收集完成任务所需要的信息。
比如:用户说“帮我定明天到上海的火车票”。机器人可抽取到关键信息“目的地=上海”,和“出发日期=明天”。 在平台中,你可以通过创建实体和词槽、并在意图的对话单元中关联词槽来教机器人进行实体抽取。
- 对话管理:根据抽取到的关键信息,机器人判断接下来应该执行什么操作。
比如:用户说“帮我定明天到上海的火车票”之后,机器人知道了目的地和出发日期,那么可以判断接下来只需要询问出发地和出发时间。 你可通过在意图流程中创建对话单元以及对话单元之间的跳转关系来教机器人如何进行对话管理。
询问填槽单元
机器人经常需要通过“询问”用户,并从用户回复的话中获取完成任务的必要信息。
比如,为了完成“订机票”这一任务意图,机器人会向用户询问“你要去哪里“、”你从哪里出发“、”你什么时候出发“。通过用户回答“从北京到上海,10点出发”这样的信息,机器人获取信息,推进对话。
这样的对话交互可以通过使用询问填槽单元来实现。
消息发送单元
在多轮对话中,经常需要机器人向用户发送一句通知,但不预期用户作出回应。
比如:在订机票的意图的结尾,机器人发送,“感谢您使用服务,祝您旅途愉快!”
这样的对话交互可以通过使用消息发送单元来实现。
词槽运算单元
很多时候,机器人从终端用户获取的信息并不是收集任务最终需要的数据,而需要进行加工。但如果只使用[询问填槽单元]的话,词槽中的数据是不能改变的。
例如,词槽中获得的数据需要进行如下更改:
无论这个词槽之前填入了什么值,只要用户流程走到这个单元,就需要将词槽里的值重置为一个定值或清空。 用户输入的信息分别存在两个词槽中,但是需要将另一个词槽的内容拼接到当前词槽。 以上这些需求,可以使用词槽运算单元来实现。
多槽接口单元
有时候在意图流程中,机器人需要从第三方接口获取多个信息,并在后续的流程中使用这些信息。
比如,在查询机票的意图中有以下步骤:
- 机器人询问用户出发地、到达地、出发时间。
- 机器人将出发地、到达地、出发时间传入第三方接口,接口根据这三个信息返回航班信息。
- 机器人将查询到的航班信息发送给用户。
- 机器人查询到的航班信息很可能包含了多个字段,比如,航班号、机票总额、转机信息等。
期望的理想效果可能是:
- 词槽“航班号”:SA1234;
- 词槽“机票总额”: ¥3000;
- 词槽“转机信息”: 直飞。
这时,你就可以通过使用多槽接口单元来实现。多槽接口单元与单槽接口单元的区别是它可以在一个单元内、通过一次对第三方接口的调用、获得多个词槽值。
接口请求格式
在发送请求时,多槽接口单元可以根据第三方接口的需要,拼接多个词槽值发送出去。
接口请求格式如下:
http://yourhttpserver:port?attr1_name={slot1_name}&attr2_name={_slot2_name}
其中,词槽名称有两种语法:
使用{slot1_name}
时,如果该值属于某个实体,会替换成实体归一化的值。
使用{_slot2_name}
会直接使用slot2的文本值。
比如,用户在2019年1月1日跟机器人说:“我要预定今天的会议室。”词槽“会议日期”获取到词槽值“今天”,并查询到“今天”属于实体“日期”。
如果用:
http://yourhttpserver:port?attr_name={会议日期}
那么,attr_name=“2019-01-01”。
如果用:
http://yourhttpserver:port?attr_name={_会议日期}
那么,attr_name=“今天”。
接口返回格式
在接收返回值时,多槽接口单元可以从第三方接口接收多个词槽的词槽值、以及待发送给用户的回复。其中:
接收词槽的值:通常需要返回。如果不返回,则词槽值为空,在判断跳转逻辑时会进入默认跳转。 发送给用户的回复:可选。
接口返回参数如下:
{
"slots": [{
"name":"new_slot_name",
"value":"new_slot_value"
},{
"name":"new_slot_name",
"value":"new_slot_value"
}
],
"msg_body": [{
"data":{
"content": "测试文本消息"
},
"type":"text"
}]
}
技能终点单元
技能终点单元作为技能流程的终点存在,建议为每一条技能的流程终点皆配置此单元。
当一个技能流程执行完成后,机器人可能需要跳转到其他流程。或者,机器人可能需要判断是立即终结流程,还是保留当前的会话、等待用户随时回到会话中来。
这时,就需要使用技能终点单元来进行设置。
技能终点单元的能力有:
- 通过本终点单元后清空已填槽内容:若选择清空,则通过该终点单元后所有已填槽内容都会被立刻清空。若不清空(默认),则所有已填词槽内容都会保留,直到触发其他词槽清空或更改的逻辑。
- 技能终点单元中的“通过本终点单元后清空已填槽内容”只控制这个单元的是否保留词槽。
- 技能设置中的“保留词槽”控制整个意图。
终点跳转:可选择通过本单元后是否跳转到其他技能,默认为空不跳转。
跳转后的技能从头运行:若关闭此功能,则技能跳转后会优先寻找断点,并从断点处继续进行流程。若开启后,则跳转后的技能从头开始运行。