5、上下文控制
* * * * *
5.1 什么是上下文控制?
上下文主要有三个作用,一是连接上下文,将原本孤立的意图串联成完整更符合逻辑的场景,二是在意图间传递参数,三是用来帮助机器人理解含义模糊或是说法相同但含义不同的短语。下面我们来讲解如何使用上下文
* * * * *
5.2 使用上下文控制连接串联意图
首先让我们看一个对灯进行开关操作例子

在这个例子中有一个逻辑“灯应该是在开了之后才可以关闭”。因此我们在此可以设置三个意图:1、开灯之前说关灯。2、开灯。3、开灯之后关灯。我们来看下如何设置这三个意图。
5.2.1 开灯之前说关灯。 意图解析规则很简单,就是“关灯”。此时因为灯本身就是关着的,因此这个关灯意图的响应设置为“灯已经是关闭的了”

5.2.2 开灯。这里解析规则也很简单,就是“开灯”,意图的响应就是“已经为您开灯”。但是为了让机器人知道已经开灯了,并且在用户再次说关灯的时候,要为用户执行关灯的操作,因此我们要通过上下文控制来把这个信息告诉机器人——具体的操作如下图在“输出条件”这里,我们设置一个输出条件,叫做“lightOn”。

5.2.3 开灯之后关灯。解析规则也很简单,就是“关灯”(解析规则与“开灯之前说关灯”是一模一样的),意图的响应就是“已为您关闭灯”。这时,因为“开灯之前说关灯”与“开灯之后关灯”的解析规则是一样的,当用户说“关灯”的时候,机器人就会很迷茫,到底用哪个意图的响应来回复用户呢?而我们知道这个意图,是在开灯之后接受用户关灯的指令,因此在这里的上下文控制里,我们设置一个进入条件为“lightOn”,也就是刚才在开灯之后输出的条件。到这里我们这个开关灯的场景就设置完毕了,可以去对话窗口中试一试了。

5.2.4 完成了这个场景的设置,让我们回过头来看,这个上下文控制具体是怎么工作的。首先来看“输出条件”,输出条件是指在这个意图被触发之后,需要向机器人传递什么信息。在开关灯这个场景里,在用户说了开灯之后,我们要告诉机器人灯已经是开着的了,所以我们设置了一个输出条件“lightOn”(注意,一个意图可以有最多5个输出条件)。再来看“输入条件”,输入条件是指,在满足什么样的条件下,这个意图可以参与解析用户说的话。在开关灯这个场景里,我们将“开灯之后关灯”这个意图的输入条件设置为“lightOn”,通过这个“lightOn”的条件,我们将“开灯”与“开灯之后关灯”两个意图串联起来,只有在开灯之后,系统中存在了“lightOn”这个条件,“开灯之后关灯”这个意图才会参与解析,在没有“lightOn”这个条件之前,机器人只会用“开灯之前说关灯”来响应用户。需要注意的是,一个意图可以有最多5个输入条件,且5个输入条件是“与”的关系,只有当所有的输入条件都被满足时,这个意图才可以参与解析。
* * * * *
5.3 在意图间传递参数
首先让我们来看一个听歌的例子。

在这个例子里,机器人准确的识别出了“他”就是上文中提到的歌手周杰伦。这是怎么做到的呢?首先和5.2中的上下文设置一样,我们先设置好两个意图“听歌手的歌”,听更多他的歌。

然后在“听歌手的歌”这个意图中,添加一个输出条件“singer”,在“更多他的歌”这个意图中选择一个输入条件“singer”。(需要注意的时,因为下文需要用到上文中“歌手”这个必须参数,所以在“听歌手的歌”这个意图解析规则中,我们需要将“歌手”设置为必须参数。)


在通过条件“singer”将这两个意图串联之后,我们来看如何在意图响应中调用上文的必须参数。如下图所示,在“更多他的歌”这个意图的“上下文关联意图返回参数中”,有一个“${听歌手的歌->歌手}”,也就是通过上下文控制传递过来的上文中的必须参数“歌手”,我们在当前意图的响应中调用这个参数,编写意图响应为“已将更多${听歌手的歌->歌手}的歌加入播放列表”。

至此,这个通过上下文控制传递参数的例子已经设置完毕了,快去测试窗口中试一试吧。
