如何從頭開始用rasa根據自己的任務設計一個任務型對話機器人

以訂電影票爲例子。

我們首先要列出所有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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章