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à)重啟有以下三種方式:
用戶(hù)首次開(kāi)啟新的會(huì)話(huà)
用戶(hù)間隔一段時(shí)間(可配置的時(shí)間)之后開(kāi)啟新的會(huì)話(huà)
-
發(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ù)悔据。