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”將這兩個意圖串聯之后,我們來看如何在意圖響應中調用上文的必須參數。如下圖所示,在“更多他的歌”這個意圖的“上下文關聯意圖返回參數中”,有一個“${聽歌手的歌->歌手}”,也就是通過上下文控制傳遞過來的上文中的必須參數“歌手”,我們在當前意圖的響應中調用這個參數,編寫意圖響應為“已將更多${聽歌手的歌->歌手}的歌加入播放列表”。

至此,這個通過上下文控制傳遞參數的例子已經設置完畢了,快去測試窗口中試一試吧。