管理对话状态
在多轮对话中,来访者和机器人对话的过程可以想像成来访者使用地图游览,每个时刻,来访者的位置都可以映射到地图上。地图有一定的行走路径,来访者下一步所能选择的方向是由当前状态提供的。
现在,来访者与机器人对话的状态会保持 30 分钟,比如来访者想要点餐,但是说了一句“我要点晚餐”,然后半个小时没有继续发送信息,那么等来访者再次发送信息时,机器人已经不记得上文了。
上下文状态和机器人记忆,都是让机器人有更强的对话处理能力:通过上下轮钩子和通配符取值,设计对话流程,满足各种定制化业务。
在实际应用中,对话状态按照匹配器、上下轮钩子和时间作用改变外,还有哪些办法影响对话状态呢?以下介绍几种方法,影响对话状态。
匹配器及回复复用
在机器人检索多轮对话时,会考虑到 30 分钟内的 100 轮对话(此处 30 分钟和 100 轮分别对应机器人设置界面参数:会话回溯最大时长,会话回溯最大轮次),我们称这样的一个限定条件是机器人的记忆。假如一个对话如下:
+ 你好
- 你好!
- 欢迎光临!
它使用了通配符匹配器,有两个回复:“你好!”和“欢迎光临!”。假设在记忆周期内,发送两次“你好”给机器人,得到的回复分别是“你好!”和“欢迎光临!”。这时,再次发送“你好”,机器人则会回复兜底回复。
这是因为,机器人对“你好”的回复都消耗尽了。如果想让机器人在记忆周期内,保证可以重复的使用某一个回复,就需要加上 {keep}
标记,使用方法如下。
通配符匹配器
+ 你好
- {keep} 你好!
- 欢迎光临!
也可以在匹配器前,使用 {keep}
,这样就相当于在每个回复前都加了 {keep}
,比如:
+ {keep} 你好
- 你好!
- 欢迎光临!
当匹配器的有多个回复时,会按照记忆过滤,再从后选中随机选择一个作为回复,如果在回复上使用了 {keep}
则起到了:保证该匹配器在记忆中重复使用,标记该回复作为默认回复。
注意: 此处 {
和 }
是半角符号。
模糊匹配器
模糊匹配器中,{keep}
的使用也有两种形式,形式与通配符匹配器一致。
+ {keep} ${0.6}{喜欢夏天还是冬天}
- 都喜欢
或者
+ ${0.6}{喜欢夏天还是冬天}
- {keep} 都喜欢
意图匹配器
意图匹配器在 intent
后添加 {keep}
,注意 {keep}
前后有空格。
// 预约机票
intent {keep} book_airplane_ticket
- ^handleAirplaneTicketOrder()
意图匹配器中,使用 {keep}
只有一种形式。
清除状态
所谓清除状态,就是在处理完某次回复,不再需要用户处于当前对话状态,而恢复默认对话状态。
解决办法:设置回复的文本以 {CLEAR}
开头。比如:
+ 再见
- {CLEAR} 感谢您选择我们,期待再次光临!
{CLEAR}
可以添加在 回复 或 函数返回值中。在 Chatopera 机器人平台返回给来访者时,文本内容会去掉这个前缀。
这个方法很实用,尤其是在全能匹配器,对话可能进入死循环,因为所有的输入都被全能匹配拦截,那么在对应的回复中使用{CLEAR}
就达到了下一次对话进入默认状态,不优先匹配全能匹配器的目的。
切换话题
在多轮对话中,开发者可以定义多个对话主题,对话主题的名字是字母组成的字符串,使用回复在不同对话主题间跳转。
跳转到通配符匹配器或模糊匹配器
+ 你好
- ^topicRedirect("greetings","你好")
topicRedirect 是内置的函数,第一个参数是目标主题名字,第二个参数是目标匹配器。
跳转到意图匹配器
在函数中,跳转到指定的意图匹配器有一点特殊,参考使用说明。
知识库路由
在知识库的答案或多轮对话的函数中设置回复时,可以用 routeDirectReply 来检索一个指定的话题和匹配器,直接路由到多轮对话的主题和匹配器。
routeDirectReply#["TOPIC_NAME", "TOPIC_GAMBIT_ID" [,INHERIT_PARAMS]]
TOPIC_NAME: 话题名称
TOPIC_GAMBIT_ID: 匹配器
其中,INHERIT_PARAMS 是可选参数,决定当前对话取得的 params
是否覆盖接下来对话的 params
,值为[true|false]
,默认为 false
。
另外,当 TOPIC_GAMBIT_ID
的值为 $ctx.textMessage$
时,则使用当前对话的用户输入,在 TOPIC_NAME
中进行检索。
比如
routeDirectReply#["class_001_pre", "__C1PRE_GAMBIT_003",true]
提示:routeDirectReply需要设定为知识库问答对里的第一个答案,答案类型为 纯文本plain
。