Rasa教程系列-Core-6-Slots

什麼是槽位slots

所謂的槽位就是機器人的記憶。它們以key-value的形式存儲,可用於存儲用戶提供的信息(比如城市信息)以及收集到的關於外部世界的信息(例如,數據庫查詢的結果)。大多數時候,槽位會影響對話的進展。不同的行爲有不同的槽類型。比如,如果用戶提供了他們的家鄉城市,那麼可能有一個名爲home_city的文本槽。如果用戶詢問天氣,而你不知道他們的家鄉,你將不得不詢問他們。文本槽只告訴Rasa Core槽是否有值。文本槽的特定值(如班加羅爾、紐約或香港)沒有任何區別。

如果值本身很重要,那麼使用categoricalbool槽。還有floatlist列表槽。如果只是想存儲一些數據,但又不希望它影響對話的流程,那麼就使用unfeaturized槽。

Rasa中如何使用Slots

策略不能訪問槽的值。它接受一個featurized 表徵。如上所述,對於文本槽,值是不相關的。 根據是否設置,策略只看到1或0。

如何設置Slots

爲domain文件中的一個槽提供一個初始值的方式如下:

slots:
  name:
    type: text
    initial_value: "human"

槽有多種設置方式: 來自 NLU、來自點擊按鈕和Actions。

Slots Set from NLU

如果NLU模型選擇了一個實體,並且domain中包含一個具有相同名稱的槽,那麼這個槽將被自動設置。例如:

# story_01
* greet{"name": "Ali"}
  - slot{"name": "Ali"}
  - utter_greet

在這個示例中,其實沒有必要在story中包含-slot{}部分,因爲它會被自動選擇。要禁用特定槽位的這種action,可以在domain文件中將auto_fill屬性設置爲False:

slots:
  name:
    type: text
    auto_fill: False

Slots Set By Clicking Buttons

可以把button當做shortcut使用。rasa core將會發送以/開頭的消息給RegexInterpreter,它期望NLU輸入和story文件有相同的格式,比如/intent{entities}。舉個例子,如果想讓用戶通過點擊的方式選擇顏色,這個button的payloads可能是/choose{"color": "blue"}/choose{"color":"red"}。那麼可以在domain文件中給出定義:

utter_ask_color:
- text: "what color would you like?"
  buttons:
  - title: "blue"
    payload: '/choose{"color": "blue"}'
  - title: "red"
    payload: '/choose{"color": "red"}'

Slots Set by Actions

另一種方式是通過在自定義action中返回事件來設置槽位。在這種情況下,你的story需要包含slots。例如,有一個獲取用戶profile信息的自定義action,以及一個名爲account_typecategorical槽。當fetch_profile action運行時,它返回一個rasa.core.events.SlotSet事件:

slots:
   account_type:
      type: categorical
      values:
      - premium
      - basic


action實現:

from rasa_sdk.actions import Action
from rasa_sdk.events import SlotSet
import requests

class FetchProfileAction(Action):
    def name(self):
        return "fetch_profile"

    def run(self, dispatcher, tracker, domain):
        url = "http://myprofileurl.com"
        data = requests.get(url).json
        return [SlotSet("account_type", data["account_type"])]

story定義:

# story_01
* greet
  - action_fetch_profile
  - slot{"account_type" : "premium"}
  - utter_welcome_premium

# story_02
* greet
  - action_fetch_profile
  - slot{"account_type" : "basic"}
  - utter_welcome_basic

在這種情況下,必須在story中包含- slot{}部分。Rasa Core將學習使用這些信息來決定採取正確的action(在本例中是utter_welcome_premiumutter_welcome_basic)。

注意:
手寫story,很容易忘記slots。官方強烈建議使用表單的交互式學習來構建這些stories。

Slot Types

Text Slot

text類型slot。用戶首選項,只關心它們是否已被指定。示例如下:

slots:
   cuisine:
      type: text

描述:
如果設置了任何值,則導致槽的特徵值被設置爲1,否則特徵值將被設置爲0(未設置任何值)。

Boolean Slot

bool型slot示例:

slots:
   is_authenticated:
      type: bool

描述:檢查slot是否設置了,有的話,則爲true。

Categorical Slot

該類型槽可以有N個取值。示例:

slots:
   risk_level:
      type: categorical
      values:
      - low
      - medium
      - high

描述:創建一個獨熱編碼(one-hot encoding)以描述哪個值匹配到。

Float Slot

用以值是連續的。示例:

slots:
   temperature:
      type: float
      min_value: -100.0
      max_value:  100.0

默認情況,max_value=1.0, min_value=0.0
描述:
小於min_value的值會統一被當做是min_valuemax_value同理。因此,如果max_value=1,那麼特徵化爲2和3.5其實是一樣的。即兩種情況於對話的影響是相同的。

List Slot

示例:

slots:
   shopping_items:
      type: list

描述:
如果設置了帶有list的值,而列表不是空的,則此槽的特性設置爲1。如果沒有設置值,或者設置值是空列表,則該特性爲0。存儲在槽中的list的長度不影響對話。

Unfeaturized Slot

用途:要存儲的數據不影響對話流
示例:

slots:
   internal_user_id:
      type: unfeaturized

描述:
這個槽位不會有任何的featurization,因此,它的值不會影響對話流,並且在預測機器人應該運行的下一個action時被忽略。

Custom Slot Types

如果你的餐廳預訂系統最多隻能處理6個人的預訂。在這種情況下,你希望槽的值影響下一個選定的action(而不僅僅是它是否被指定)。此時可以通過定義一個定製的slot類來實現這一點。

在下面的代碼中,定義了一個名爲NumberOfPeopleSlot的槽類。特徵化定義如何將這個槽的值轉換爲向量,以使機器學習模型能夠處理。這裏的槽有三個可能的“值”,所以可以用長度爲2的向量來表示它們。
(0,0)表示還未設置;
(1,0)表示1~6之間;
(0,1)表示大於6;

from rasa.core.slots import Slot

class NumberOfPeopleSlot(Slot):

    def feature_dimensionality(self):
        return 2

    def as_feature(self):
        r = [0.0] * self.feature_dimensionality()
        if self.value:
            if self.value <= 6:
                r[0] = 1.0
            else:
                r[1] = 1.0
        return r

現在還需要一些訓練的stories,這樣Rasa Core可以從中學習如何處理不同的情況:

# story1
...
* inform{"people": "3"}
  - action_book_table
...
# story2
* inform{"people": "9"}
  - action_explain_table_limit
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章