以訂電影票爲例子。
我們首先要列出所有intent的名稱,rasa的intent的粒度較細,任何用戶輸入都可以被看做一個intent。因此我們需要枚舉出在一個場景下所有可能的用戶輸入的意圖。如我要訂電影票的intent是訂電影票,我要看鋼鐵俠的intent是報告電影名,我要兩張票的intent是報告票數
用戶輸入 intent意圖
我要訂電影票 訂電影票
我要看鋼鐵俠 報告電影名字
我要兩張票 報告票數
我要明天下午2點的票 報告時間
對應的實際數據爲:
## intent:inform_movie_name
- [Xman1](movie_name)
- I want to see [Xman1](movie_name)
- [Xman2](movie_name)
- I want to see movie [Xman2](movie_name)
- [Xman3](movie_name) please
- book movie [Xman3](movie_name)
- [Xman4](movie_name) plz
- I want to see [Xman4](movie_name)
## intent:book_movie_name
- I want to see [Xman1](movie_name)
- I want to book [Xman1](movie_name)
- help me book [Xman1](movie_name)
- help me book [Xman2](movie_name)
- help me book [Xman3](movie_name)
- help me book [Xman4](movie_name)
- [Iron Man](movie_name)
- book movie [Iron Man](movie_name)
- [The Incredible Hulk](movie_name)
- book movie [The Incredible Hulk](movie_name)
- [Iron Man 2](movie_name)
- book movie [Iron Man 2](movie_name)
- [Thor](movie_name)
- book movie [Thor](movie_name)
- [Captain America](movie_name)
- book movie [Captain America](movie_name)
- [The Avengers](movie_name)
- book movie [The Avengers](movie_name)
- [Iron Man 3](movie_name)
- book movie [Iron Man 3](movie_name)
- [Thor:The Dark World](movie_name)
- book movie [Thor:The Dark World](movie_name)
## intent:inform_weekday
- I want [monday](weekday)
- [monday](weekday)
- It is [monday](weekday)
- [wednesday](weekday)
- It is [wednesday](weekday)
- [thursday](weekday)
- It is [thursday](weekday)
- [friday](weekday)
- It is [friday](weekday)
- [today](weekday)
- It is [today](weekday)
- [tomorrow](weekday)
- It is [tomorrow](weekday)
- [tonight](weekday)
- It is [tonight](weekday)
- [this morning](weekday)
- It is [this morning](weekday)
- [this noon](weekday)
- It is [this noon](weekday)
## intent:inform_ticket_number
- book [two](ticket_number) tickets
- for [two](ticket_number) people
- [one](ticket_number) people
- [one](ticket_number)
- I want [one](ticket_number) tickets
- [two](ticket_number)
- I want [two](ticket_number) tickets
- [three](ticket_number)
- I want [three](ticket_number) tickets
- [1](ticket_number)
- I want [1](ticket_number) tickets
- [2](ticket_number)
- I want [2](ticket_number) tickets
- [3](ticket_number)
- I want [3](ticket_number) tickets
- [single](ticket_number)
- I want [single](ticket_number) tickets
## intent:inform_time
- [9 am](time)
- book movie at [9 am](time)
- [afternoon](time)
- book movie at [afternoon](time)
- [3pm](time)
- book movie at [3pm](time)
- [night](time)
- book movie at [night](time)
- [4pm](time)
- book movie at [4pm](time)
- [afternoon](time)
- book movie at [afternoon](time)
intents:
- greet
- goodbye
- thanks
- deny
- joke
- name
- inform_item
- inform_package
- inform_time
- request_management
- request_search
- inform_current_phone
- inform_other_phone
- book_movie_name
- inform_time
- inform_weekday
- inform_ticket_number
- inform_movie_name
接着列出所有action的名稱。action是rasa中bot根據用戶輸入做出的動作,回覆。在任務型場景下,bot大多數action就是詢問信息(槽位,實體)。
模板、自定義函數 action動作
你要做什麼? 問意圖
你要看什麼電影 問電影名字
你要幾張票 問票數
你要什麼時間的 問時間
函數 完成訂票
actions:
- utter_name
- utter_thanks
- utter_greet
- utter_goodbye
- action_joke
- utter_ask_morehelp
- utter_ask_package
- utter_ack_management
- action_searchconsume
- utter_help
- utter_ask_month
- utter_givevolumn
- utter_ask_ticket_number
- utter_ask_weekday
- utter_ask_time
- utter_ask_movie_name
- utter_book_ticket
- action_book_ticket
templates:
utter_name:
- text: "Hey there! Tell me your name."
utter_greet:
- text: "Nice to you meet you {name}. How can I help?"
utter_goodbye:
- text: "Talk to you later!"
utter_thanks:
- text: "My pleasure."
utter_help:
- text: " Hi,How can I help?"
utter_givevolumn:
- text: "The volume used in {time} is 200mb/1024mb"
utter_ask_ticket_number:
- text: "Can you tell me the ticket_number?"
utter_ask_weekday:
- text: "Can you tell me the weekday?"
utter_ask_time:
- text: "Can you tell me the time?"
utter_ask_movie_name:
- text: "Can you tell me the movie_name?"
utter_book_ticket:
- text: "I finish booking of {movie_name} at{time} {weekday}"
然後定義slot 的名稱,類型。entity的名稱,類型。slot原則上應該是entity的子集,sara的nlu模塊提取出entity然後tracker決定需不需要填入slot。
entities:
- name
- item
- time
- phone_number
- price
- movie_name
- ticket_number
- weekday
slots:
name:
type: text
item:
type: text
time:
type: text
phone_number:
type: text
price:
type: text
ticket_number:
type: text
weekday:
type: text
movie_name:
type: text
上面的數據都填入domain.yml中。
然後在story.md中輸入任務流程,格式如下
## 訂電影票
* 訂電影票
- 問電影名字
* 報告電影名字
- 問票數
* 報告票數
- 問時間
* 報告時間
- 完成訂票
或者加入不同的流程
## 問意圖 + 訂電影票
* 問好
- 問意圖
* 訂電影票
- 問電影名字
* 報告電影名字
- 問票數
* 報告票數
- 問時間
* 報告時間
- 完成訂票
## story_book_ticket
* greet
- utter_help
* book_movie_name
- utter_ask_time
* inform_time
- utter_ask_weekday
* inform_weekday
- utter_ask_ticket_number
* inform_ticket_number
- utter_ask_movie_name
* inform_movie_name
- utter_book_ticket
## story_book_ticket2
* book_movie_name
- action_book_ticket
* inform_ticket_number
- action_book_ticket
* inform_weekday
- action_book_ticket
* inform_time
- action_book_ticket
根據這兩個文件可以訓練RASA core模型,用於決定action。
train-core:
python -m rasa_core.train -d domain.yml -s data/stories.md -o models/current/dialogue -c policies.yml
然後準備intent語料文件 nlu.md
裏面放入每個intent對應的文本,並且標明entity和entity名稱。
如
## intent:訂電影票
-我想看 [Xman1](movie_name)
- 我想看 [Xman1](movie_name)
- 幫我訂 [Xman1](movie_name)
- 幫我訂 [Xman2](movie_name)
用nlu.md來訓練nlu模型。
train-nlu:
python -m rasa_nlu.train -c nlu_config.yml --data data/nlu_data.md -o models --fixed_model_name nlu --project current --verbose