domian(翻譯官方文檔)

2021-10-9

Domian

domian定義了機(jī)器人助手可操作的領(lǐng)域腻贰。在domain中可指定意圖、實(shí)體巩搏、詞槽昨登、響應(yīng)、表單和機(jī)器人應(yīng)該知道的操作贯底。并且還定義了會(huì)話(huà)session的配置丰辣。

下面是一個(gè)完整的domain示例

intents:
 - affirm
 - deny
 - greet
 - thankyou
 - goodbye
 - search_concerts
 - search_venues
 - compare_reviews
 - bot_challenge
 - nlu_fallback
 - how_to_get_started

entities:
 - name

slots:
 concerts:
 type: list
 influence_conversation: false
 venues:
 type: list
 influence_conversation: false
 likes_music:
 type: bool
 influence_conversation: true

responses:
 utter_greet:
 - text: "Hey there!"
 utter_goodbye:
 - text: "Goodbye :("
 utter_default:
 - text: "Sorry, I didn't get that, can you rephrase?"
 utter_youarewelcome:
 - text: "You're very welcome."
 utter_iamabot:
 - text: "I am a bot, powered by Rasa."
 utter_get_started:
 - text: "I can help you find concerts and venues. Do you like music?"
 utter_awesome:
 - text: "Awesome! You can ask me things like \"Find me some concerts\" or \"What's a good venue\""

actions:
 - action_search_concerts
 - action_search_venues
 - action_show_concert_reviews
 - action_show_venue_reviews
 - action_set_music_preference

session_config:
 session_expiration_time: 60  # value in minutes
 carry_over_slots_to_new_session: true

Multiple Domian Files

domain可以定義為單個(gè)YAML文件,也可以跨目錄中的多個(gè)文件進(jìn)行分割丈甸。當(dāng)跨越多個(gè)文件時(shí)糯俗,域內(nèi)容將被讀取并自動(dòng)合并在一起。

使用命令行界面睦擂,你可以通過(guò)運(yùn)行以下命令來(lái)訓(xùn)練模型:

rasa train --domain path_to_domain_directory

Intents

domain中的intent鍵列出了在NLU數(shù)據(jù)和會(huì)話(huà)訓(xùn)練數(shù)據(jù)中使用的所有intent

Ignoring Entities for Certain Intents

為了忽略某些意圖的特定實(shí)體,可以增加use_entities:[]參數(shù)添加到你的domain文件的意圖中:

intents:
 - greet:
 use_entities: []

要忽略某些實(shí)體或顯式地只考慮某些實(shí)體杖玲,你可以使用下面的語(yǔ)法:

intents:
- greet:
 use_entities:
 - name
 - first_name
 ignore_entities:
 - location
 - age

被意圖排除的實(shí)體將不具有特征顿仇,因此不會(huì)影響下一個(gè)action預(yù)測(cè)。當(dāng)您有一個(gè)意圖摆马,而您并不關(guān)心抽取的實(shí)體時(shí)臼闻,這是非常有用的。

如果你列出你的意圖沒(méi)有這個(gè)參數(shù)囤采,實(shí)體將作為正常的特征述呐。

注意:如果希望這些實(shí)體不影響動(dòng)作預(yù)測(cè),請(qǐng)為同名的詞槽設(shè)置influence_conversation: false參數(shù)蕉毯。

Entities

實(shí)體部分列出了NLU pipline中任何實(shí)體提取器都可以提取的所有實(shí)體乓搬。

例如:

entities:
 - PERSON           # entity extracted by SpacyEntityExtractor
 - time             # entity extracted by DucklingEntityExtractor
 - membership_type  # custom entity extracted by DIETClassifier
 - priority         # custom entity extracted by DIETClassifier

如果您正在使用實(shí)體角色和組特性思犁,您還需要在本節(jié)中列出實(shí)體的角色和組。

例如:

entities:
 - city:            # custom entity extracted by DIETClassifier
 roles:
 - from
 - to
 - topping: # custom entity extracted by DIETClassifier
 groups:
 - 1
 - 2
 - size:            # custom entity extracted by DIETClassifier
 groups:
 - 1
 - 2

注意:實(shí)體角色和組需要在domain中列出

Slots

Slots是機(jī)器人的內(nèi)存进肯。存儲(chǔ)為鍵值對(duì)的形式激蹲,可用于存儲(chǔ)用戶(hù)提供的信息(例如他們所在的城市)以及收集的關(guān)于外部世界的信息(例如數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果)。

Slots在domian中定義江掩,包括它們的名稱(chēng)学辱、類(lèi)型以及它們是否以及如何影響助手的行為。下面的示例定義了一個(gè)名為“slot_name”和類(lèi)型text的槽环形。

slots:
 slot_name:
 type: text

Slots and Conversation Behavior

您可以使用influence_conversation屬性指定詞槽是否影響會(huì)話(huà)策泣。

如果希望在詞槽中存儲(chǔ)信息而不影響會(huì)話(huà),則在定義槽時(shí)設(shè)置influence_conversation: false抬吟。

下面的示例定義了一個(gè)詞槽age萨咕,它將存儲(chǔ)有關(guān)用戶(hù)年齡的信息,但不會(huì)影響對(duì)話(huà)流拗军。這意味著助手每次預(yù)測(cè)下一個(gè)動(dòng)作時(shí)都會(huì)忽略槽的值任洞。

slots:
 age:
 type: text
 # this slot will not influence the predictions
 # of the dialogue policies
 influence_conversation: false

在定義詞槽時(shí),如果您沒(méi)有設(shè)置influence_conversation或?qū)⑵湓O(shè)置為true发侵,該槽將影響下一個(gè)動(dòng)作預(yù)測(cè)交掏,除非它的槽類(lèi)型為any。詞槽影響對(duì)話(huà)的方式將取決于它的詞槽類(lèi)型刃鳄。

下面的示例定義了一個(gè)影響會(huì)話(huà)的詞槽home_city盅弛。文本槽將根據(jù)槽是否具有值影響助手的行為。文本槽的具體值(例如Bangalore or New York or Hong Kong)沒(méi)有任何影響叔锐。

slots:
 # this slot will influence the conversation depending on
 # whether the slot is set or not
 home_city:
 type: text
 influence_conversation: true

例如挪鹏,考慮兩個(gè)輸入“天氣怎么樣?”和“班加羅爾的天氣怎么樣?”根據(jù)NLU是否自動(dòng)設(shè)置home_city槽位,會(huì)話(huà)應(yīng)該會(huì)發(fā)生分歧愉烙。如果槽已經(jīng)設(shè)置讨盒,機(jī)器人可以預(yù)測(cè)action_forecast動(dòng)作。如果詞槽未設(shè)置步责,則需要獲取home_city信息返顺,然后才能預(yù)測(cè)天氣。

Slot 類(lèi)型

Text Slot

  • Type text

  • User For 保存文本值

  • 示例

slots:
     cuisine:
     type: text
     influence_conversation: true
  • 描述

如果influence_conversation 設(shè)置為true蔓肯,機(jī)器人會(huì)根據(jù)詞槽是否填充改變自身的行為遂鹊。不同的文本不會(huì)進(jìn)一步影響對(duì)話(huà)。

以下兩個(gè)故事是一致的

stories:
- story: French cuisine
 steps:
 - intent: inform
 - slot_was_set:
 - cuisine: french

- story: Vietnamese cuisine
 steps:
 - intent: inform
 - slot_was_set:
 - cuisine: vietnamese

Boolean Slot

  • Type bool

  • User For 保存true 或false值

  • 示例

slots:
     is_authenticated:
     type: bool
  • 描述

如果將influence_conversation設(shè)置為true蔗包,機(jī)器人的行為將根據(jù)詞槽是空秉扑,為true還是為false而改變。請(qǐng)注意调限,空的bool詞槽和設(shè)置為false的詞槽對(duì)會(huì)話(huà)的影響不同舟陆。

Categorical Slot

  • Type categorical

  • User For 存儲(chǔ)槽误澳,可以取N個(gè)值中的一個(gè)。

  • 示例

slots:
    risk_level:
    type: categorical
    values:
    - low
    - medium
    - high
  • 描述

如果將influence_conversation設(shè)置為true吨娜,助理的行為將根據(jù)插槽的具體值而改變脓匿。這意味著根據(jù)上面示例中的槽的值是低、中還是高宦赠,助手的行為是不同的陪毡。

默認(rèn)值other會(huì)自動(dòng)添加到用戶(hù)定義的值中。所有遇到的沒(méi)有明確定義在槽值中的值都映射到other勾扭。other不應(yīng)該用作用戶(hù)定義的值;如果是毡琉,它仍將作為所有未見(jiàn)值映射到的默認(rèn)值行事。

Float Slot

  • Type float

  • User For 存儲(chǔ)數(shù)值

  • 示例

slots:
     temperature:
     type: float
     min_value: -100.0
     max_value:  100.0
  • 默認(rèn)
    max_value=1.0, min_value=0.0

  • 描述

如果influence_conversation設(shè)置為true妙色,助理的行為將根據(jù)詞槽的值而改變桅滋。如果值在min_value和max_value之間,則使用具體的數(shù)值身辨。所有低于min_value的值將被視為min_value丐谋,所有高于max_value的值將被視為max_value。因此煌珊,如果max_value設(shè)置為1号俐,則槽值2和3.5之間沒(méi)有區(qū)別。

List Slot

  • Type list

  • User For 保存列表

  • 示例

slots:
     shopping_items:
     type: list
  • 描述

如果將influence_conversation設(shè)置為true定庵,助理的行為將根據(jù)列表是否為空而改變吏饿。存儲(chǔ)在詞槽中的列表的長(zhǎng)度不會(huì)影響對(duì)話(huà)框。它只與列表長(zhǎng)度是否為零或非零有關(guān)蔬浙。

Any Slot

  • Type any

  • User For 存儲(chǔ)任意值(它們可以是任何類(lèi)型猪落,如字典或列表)

  • 示例

slots:
     shopping_items:
     type: any
  • 描述

任何類(lèi)型的槽在對(duì)話(huà)中總是被忽略。此詞槽類(lèi)型的屬性influence_conversation不能設(shè)置為true畴博。如果要存儲(chǔ)應(yīng)該影響會(huì)話(huà)的自定義數(shù)據(jù)結(jié)構(gòu)笨忌,請(qǐng)使用自定義槽類(lèi)型。

Custom Slot 類(lèi)型

也許你的餐廳預(yù)訂系統(tǒng)最多只能處理6個(gè)人的預(yù)訂俱病。在本例中蜜唾,您希望槽的值影響下一個(gè)選擇的操作(而不僅僅是是否指定了它)。您可以通過(guò)定義一個(gè)自定義槽類(lèi)來(lái)實(shí)現(xiàn)這一點(diǎn)庶艾。

下面的代碼定義了一個(gè)名為NumberOfPeopleSlot的自定義槽類(lèi)。特征定義如何將這個(gè)槽的值轉(zhuǎn)換為向量擎勘,以便Rasa開(kāi)源機(jī)器學(xué)習(xí)模型可以處理它咱揍。NumberOfPeopleSlot有三個(gè)可能的“值”,可以用長(zhǎng)度為2的向量表示棚饵。

(0,0) not yet set
(1,0) between 1 and 6
(0,1) more than 6
# my_custom_slots.py
from rasa.shared.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

您可以將自定義槽類(lèi)實(shí)現(xiàn)為獨(dú)立的python模塊煤裙,與自定義操作代碼分離掩完。將自定義槽的代碼保存在一個(gè)名為"init.py"的空文件旁邊的目錄中,以便它將被識(shí)別為python模塊硼砰。然后且蓬,您可以通過(guò)自定義槽類(lèi)的模塊路徑來(lái)引用它。

例如题翰,假設(shè)你將上面的代碼保存在"addons/my_custom_slots.py"中恶阴,這是一個(gè)相對(duì)于你的bot項(xiàng)目的目錄:

└── rasa_bot
 ├── addons
 │   ├── __init__.py
 │   └── my_custom_slots.py
 ├── config.yml
 ├── credentials.yml
 ├── data
 ├── domain.yml
 ├── endpoints.yml

自定義槽類(lèi)型的模塊路徑是addons.my_custom_slots.NumberOfPeopleSlot。在domian文件中使用模塊路徑來(lái)引用自定義槽類(lèi)型:

slots:
 people:
 type: addons.my_custom_slots.NumberOfPeopleSlot
 influence_conversation: true

既然Rasa Open Source可以使用您的定制槽類(lèi)豹障,那么您可以根據(jù)people不同的值增加訓(xùn)練故事冯事。你可以為people的值在1到6之間的情景寫(xiě)一個(gè)故事,為值大于6的情景寫(xiě)一個(gè)故事血公。您可以在這些范圍內(nèi)選擇任何值放入您的故事中昵仅,因?yàn)樗鼈兊墓δ芏际窍嗤?參見(jiàn)上面的功能表)。

stories:
- story: collecting table info
 steps:
 # ... other story steps
 - intent: inform
 entities:
 - people: 3
 - slot_was_set:
 - people: 3
 - action: action_book_table

- story: too many people at the table
 steps:
 # ... other story steps
 - intent: inform
 entities:
 - people: 9
 - slot_was_set:
 - people: 9
 - action: action_explain_table_limit

Slot Auto-fill

如果NLU模型抽取了一個(gè)實(shí)體累魔,并且domian包含了一個(gè)同名的slot摔笤,那么這個(gè)slot將被自動(dòng)設(shè)置,前提是滿(mǎn)足以下條件:

1垦写、Store_entities_as_slots設(shè)置為true

2吕世、 槽的auto_fill屬性設(shè)置為true

示例

stories:
- story: entity slot-filling
 steps:
 - intent: greet
 entities:
 - name: Ali
 - slot_was_set:
 - name: Ali
 - action: utter_greet_by_name

在這種情況下,你不需要在故事中包含slot_was_set部分梯澜,因?yàn)樗亲詣?dòng)選取的:

stories:
- story: entity slot-filling
 steps:
 - intent: greet
 entities:
 - name: Ali
 - action: utter_greet_by_name

注意:AUTO-FILLED SLOTS & INFLUENCE_CONVERSATION 用influence_conversation: true定義的auto-filled slot將以與其他槽相同的方式影響會(huì)話(huà)寞冯。

在上面的例子中,如果 詞槽name的類(lèi)型是text晚伙,那么只需要檢測(cè)到某個(gè)名稱(chēng)就可以了吮龄,但是是哪個(gè)名稱(chēng)并不重要。如果詞槽name是categorical類(lèi)型咆疗,那么行為將根據(jù)您為槽定義的類(lèi)別而變化漓帚。

明確地在你的故事中包含slot_was_set步驟可以讓auto-filled slot的行為更清晰地影響對(duì)話(huà),而不會(huì)改變你的故事的行為午磁。

要禁用特定槽位的自動(dòng)填充尝抖,可以在domain文件中將auto_fill屬性設(shè)置為false:

slots:
 name:
 type: text
 auto_fill: false

Initial slot values

你可以在你的domain文件中提供一個(gè)槽的初始值:

slots:
 num_fallbacks:
 type: float
 initial_value: 0

Responses

Session 配置

一個(gè)會(huì)話(huà)session表示用戶(hù)和機(jī)器人之間的對(duì)話(huà)。會(huì)話(huà)重啟有以下三種方式:

  1. 用戶(hù)首次開(kāi)啟新的會(huì)話(huà)

  2. 用戶(hù)間隔一段時(shí)間(可配置的時(shí)間)之后開(kāi)啟新的會(huì)話(huà)

  3. 發(fā)送/session_start意圖

    可以通過(guò)在session_config中配置間隔時(shí)間

  • session_expiration_time

    定義了多長(zhǎng)時(shí)間不活躍就重啟新的session, 單位是分鐘

    原文: defines the time of inactivity in minutes after which a new session will begin

  • carry_over_slots_to_new_session

    決定了是否將詞槽傳遞到新的session

默認(rèn)配置如下所示

session_config:
 session_expiration_time: 60  # value in minutes, 0 means infinitely long
 carry_over_slots_to_new_session: true  # set to false to forget slots between sessions

這個(gè)表示如果用戶(hù)60分鐘后發(fā)送消息迅皇,就會(huì)觸發(fā)新的會(huì)話(huà)session, 并且會(huì)將當(dāng)前的詞槽傳遞給新的session.

如果session_expiration_time to 0表示當(dāng)前會(huì)話(huà)session永遠(yuǎn)不會(huì)結(jié)束昧辽,只有在首次進(jìn)入會(huì)話(huà)是才會(huì)激活action_session_start

NOTE

一個(gè)新的會(huì)話(huà)會(huì)觸發(fā)默認(rèn)actionaction_session_start.

它默認(rèn)將所有已有的slots傳遞給新的session。需要注意的是所有的會(huì)話(huà)都需要以action_session_start開(kāi)始.

action_session_start可以自定義登颓。

系統(tǒng)內(nèi)建的一些Action

session_start

action_restart

此操作將重置整個(gè)對(duì)話(huà)歷史記錄搅荞,包括在此過(guò)程中設(shè)置的所有輪次饵逐,槽位等信息菇怀。

如果模型配置中包含RulePolicy煤墙,則可以由用戶(hù)在會(huì)話(huà)中通過(guò)發(fā)送“ /restart”消息來(lái)觸發(fā)它距误。如果您utter_restart在domain中定義了一個(gè)響應(yīng),則該響應(yīng)也將發(fā)送給用戶(hù)茉贡。

action_session_start

該操作將啟動(dòng)一個(gè)新的會(huì)話(huà)塞栅。在以下情況下該操作自動(dòng)執(zhí)行:

  • 在每次新對(duì)話(huà)開(kāi)始時(shí)

  • 用戶(hù)處于非活動(dòng)狀態(tài)超過(guò)session_expiration_time這個(gè)參數(shù)后

  • 當(dāng)用戶(hù)在對(duì)話(huà)期間發(fā)送“ / session_start”消息時(shí)

該操作將重置對(duì)話(huà)跟蹤器,但默認(rèn)情況下會(huì)清除已設(shè)置的任何插槽腔丧。

會(huì)話(huà)開(kāi)始操作的默認(rèn)行為是將所有現(xiàn)有的插槽帶入下一個(gè)會(huì)話(huà)放椰。假設(shè)不想保留所有插槽或者只保留一個(gè)部分插槽,可以重寫(xiě)action_session_start函數(shù)悔据。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庄敛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子科汗,更是在濱河造成了極大的恐慌藻烤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件头滔,死亡現(xiàn)場(chǎng)離奇詭異怖亭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坤检,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)兴猩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人早歇,你說(shuō)我怎么就攤上這事倾芝。” “怎么了箭跳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵晨另,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我谱姓,道長(zhǎng)借尿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任屉来,我火速辦了婚禮路翻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茄靠。我一直安慰自己茂契,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布慨绳。 她就那樣靜靜地躺著账嚎,像睡著了一般莫瞬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上郭蕉,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音喂江,去河邊找鬼召锈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛获询,可吹牛的內(nèi)容都是我干的涨岁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吉嚣,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梢薪!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起尝哆,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秉撇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后秋泄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體琐馆,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年恒序,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦麸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歧胁,死狀恐怖滋饲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情喊巍,我是刑警寧澤屠缭,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站玄糟,受9級(jí)特大地震影響勿她,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阵翎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一逢并、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧郭卫,春花似錦砍聊、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蟹肘。三九已至,卻和暖如春俯树,著一層夾襖步出監(jiān)牢的瞬間帘腹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工许饿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阳欲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓陋率,卻偏偏與公主長(zhǎng)得像球化,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓦糟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容