填槽指在會話中從使用者處收集完成任務所需的資訊。
如果需要連續收集多條資訊,可以建立乙個formaction。formaction中含有乙個迴圈的邏輯來詢問使用者所需的槽值。
form在domain檔案中定義:
使用form則需要在config檔案中引入formpolicy。
formpolicy是memoizationpolicy的乙個擴充套件,負責填槽。
當formaction被呼叫後,formpolicy會繼續**後序應該採取的formaction,直至所有槽被填滿。
在上面的story配置中,意圖request_restaurant對應的動作是restaurant_form.
form啟用了定義好的表單,而form關閉了表單。
關於動作restaurant_form,需要定義三個方法:
(1)def name(...) -> text 用於get動作名稱;
(2)def required_slots(...) -> list[text] 用於get需要被填的槽名稱列表
(3)def submit(…) -> list[dist] 用於槽填滿後進行後續處理,比如呼叫查詢餐廳的api
在表單啟用期間formpolicy連續**formaction,每次formaction被呼叫都會通過utter_ask_詢問使用者乙個未填槽的資訊。
每個槽都應當在domain檔案中設定對應的utter_ask_。
在預設的情況下,槽只會被使用者輸入裡與其名稱相同的實體所填充。
從使用者輸入中提取到槽值後,會對值進行驗證。預設情況下驗證只發生在使用者輸入後執行form action的時候。
同時,可以通過定義validate_方法來實現自定義的槽值驗證,預設只會驗證槽值是否成功提取。
當我們不滿足於簡單的填槽邏輯時,可以借助required_slots()方法來實現自定義的條件邏輯,比如下圖中根據cuisine槽的值是否時greek做了條件邏輯。
前面我介紹了rasa1.x中的填槽處理,在rasa2.x中填槽處理則主要有以下幾點不同。
首先rasa2.x中填槽不再基於formpolicy,取而代之的是rulepolicy,我們需要在config檔案中啟用它。
在rasa1.x中,表單的啟用和關閉在story進行定義。而在rasa2.x中,還可以在rule中定義。
啟用:
關閉:
rasa2.x可以在表單定義中配置槽值對映的方法。
from_entity是通過將使用者輸入中的實體賦予同名的槽來實現填槽的。
當實體和槽的對應關係不唯一時,會放棄該實體。
如果需要避免這種情況,可以使用附加role資訊使若干重名的槽具有不同角色來加以區分。
除了按實體填槽的方法以外,還有按使用者輸入填槽(from_text)、按使用者意圖填槽(from_intent、from_trigger_intent)的方法。
rasa2.x的rulepolicy可以定義active_loop,在active_loop中我們可以處理打斷:
在上面的例子中展示了閒聊打斷的處理。
當使用者在填槽過程中意圖改變,不想再繼續下去,可以利用action_deactivate_loop動作來停止表單並重置槽值。
在2.x中一些1.x中需要通過函式定義的功能被簡化成配置,使用起來更加方便靈活。
簡介RASA中的TED Policy
簡單的會話中,可以直接根據意圖對映動作。但實際情況中,會話中會發生閒聊或場景切換,需要參考歷史來選擇動作。在tedpolicy中,rasa提取特徵,並通過特徵來決定採取何種動作。特徵包含使用者訊息中的意圖 實體 當前的槽值和之前所採取的動作。所有特徵向量拼接起來成為最終的feature t,tedp...
對話系統中的槽和槽位
1 槽可以理解為實體已明確定義的屬性,例如打車中的,出發地點槽,目的地槽,出發時間槽中的屬性分別是 出發地點 目的地 和 出發時間 2 語義槽是指nlu模組從句子中抽取出的特定概念 3 填槽指的是為了讓使用者意圖轉化為使用者明確的指令而補全資訊的過程 4 槽填充則可以看做是序列標註問題,即對於給定的...
QT中槽的使用
一 建立槽和按鈕之間的連線 connect 訊號傳送者,傳送的訊號,訊號接收者,訊號接收者的槽函式 1 例子 connect ui pushbutton,signal clicked bool this,slot showinfo 解釋 訊號反傳送者 pushbutton 這是乙個按鈕 傳送訊號 c...