0. 背景
事先說明:本系列Rasa教程基於Rasa 1.6.1版本。
Rasa是一個開源機器學習框架,可用於構建具有上下文理解能力的AI助手(assistant)。
Rasa有兩個主要模塊:
- Rasa NLU :用於理解用戶消息,包括意圖識別和實體識別,把用戶的輸入語句轉換爲結構化的數據。
- Rasa Core:是一個對話管理平臺,用於決定對話和下一步做什麼。
- Channels 和 integrations:將assistant連接到用戶和後端系統。
Rasa X 是一個用以改進Rasa構建的上下文助理的工具,包括用戶界面和 REST API。
1. 安裝
rasa 安裝:
pip install rasa
如果想要同時安裝rasa 和 rasa x:
pip install rasa-x --extra-index-url https://pypi.rasa.com/simple
2. 創建新項目
在當前目錄創建Rasa project:
rasa init
如果使用如下命令:
rasa init --no-prompt
該命令創建Rasa項目需要的文件,以及訓練一個簡單對話機器人需要的數據。如果命令不使用--no-prompt
標識,那麼在創建過程中需要回答幾個關於項目創建的問題。
使用rasa init --no-prompt
創建項目後目錄下的文件:
創建的文件如下,其中*
標記的爲最重要的部分:
- _init_.py,用來幫助Python找到action的空文件
- actions.py,用來自定義actions的文件
- config.yml *,NLU和Core模型的配置文件
- credentials.yml,用來連接到其他服務(services)
- data/nlu.md *,用於NLU訓練的數據
- data/stories.md *,用於訓練Core模型的故事數據集
- domain.yml *,assistant的領域(assistant’s domain)配置文件
- endpoints.yml,連接到類似於Facebook的messenger的詳細配置(即可以配置到其他類似Facebook的平臺)
- models/.tar.gz,初始化模型
3. 查看NLU訓練數據集
Rasa的NLU(即自然語言理解)模塊,用來將用戶消息轉換成結構數據。在Rasa中,可以通過提供訓練示例,告訴Rasa如何理解用戶消息,然後訓練獲得模型。可以看一下上述初始化的項目下的nlu.md
文件內容:
## intent:greet
- hey
- hello
- hi
- good morning
- good evening
- hey there
## intent:goodbye
- bye
- goodbye
- see you around
- see you later
## intent:affirm
- yes
- indeed
- of course
- that sounds good
- correct
## intent:deny
- no
- never
- I don't think so
- don't like that
- no way
- not really
## intent:mood_great
- perfect
- very good
- great
- amazing
- wonderful
- I am feeling very good
- I am great
- I'm good
## intent:mood_unhappy
- sad
- very sad
- unhappy
- bad
- very bad
- awful
- terrible
- not very good
- extremely sad
- so sad
## intent:bot_challenge
- are you a bot?
- are you a human?
- am I talking to a bot?
- am I talking to a human?
其中以**##**開始的行定義了意圖(intents),是具有相同含義消息的集合。Rasa中NLU模塊的任務是,預測用戶輸入的消息的正確意圖。具體數據格式可以參見NLU Training Data Format。
4. 定義模型的配置
config.yml
配置文件將會在NLU和Core中用到。上述項目中的config.ml文件的內容爲:
# Configuration for Rasa NLU.
# https://rasa.com/docs/rasa/nlu/components/
language: en
pipeline: supervised_embeddings
# Configuration for Rasa Core.
# https://rasa.com/docs/rasa/core/policies/
policies:
- name: MemoizationPolicy
- name: KerasPolicy
- name: MappingPolicy
在上述例子中,NLU模型會使用supervised_embeddings
流水線。不同NUL模型的流水線可以在這裏查看。
其中language
和pipeline
這兩個關鍵詞,用來定義NLU模型應該如何構建。policies
關鍵詞定義核心模型中使用到的policies,更多關於policies的可以查看這裏。
5. 書寫自己的Stories
在這個階段,通過Stories將教Rasa assistant 如何響應用戶的消息,這個叫做對話管理,由於Core model所決定。
Core model以訓練"stories"的形式從真實對話中進行學習。一個story是用戶和assistant之間的真實的一次對話。帶有意圖和實體的行反應了用戶的輸入和assistant將響應的action名。上述項目的stories.md
內容如下:
## happy path
* greet
- utter_greet
* mood_great
- utter_happy
## sad path 1
* greet
- utter_greet
* mood_unhappy
- utter_cheer_up
- utter_did_that_help
* affirm
- utter_happy
## sad path 2
* greet
- utter_greet
* mood_unhappy
- utter_cheer_up
- utter_did_that_help
* deny
- utter_goodbye
## say goodbye
* goodbye
- utter_goodbye
## bot challenge
* bot_challenge
- utter_iamabot
用戶說hello 時候,意圖分類爲greet
,assistant 根據utter_greet
進行回覆。以-
爲起始的句子表示 assistant 所做出的 action。本系列教程中所有的actions都是發送給用戶的,比如utter_greet
。需要注意的是,一個action是可以做任務事情的,包括調用 API 或者與外部世界進行交互。更多關於Stories的具體格式可以參考這裏。
6. 定義 Domain
下一個事情需要處理的是定義一個領域(Domain)。Domain定義了 assistant 所處的世界:期望從用戶那邊獲取什麼輸入,assistant 能夠預測什麼行爲,如何做出響應,存儲什麼消息。domain 相關的內容存儲在domain.yml
文件中。上述上面的domain.yml
內容如下:
intents:
- greet
- goodbye
- affirm
- deny
- mood_great
- mood_unhappy
- bot_challenge
actions:
- utter_greet
- utter_cheer_up
- utter_did_that_help
- utter_happy
- utter_goodbye
- utter_iamabot
templates:
utter_greet:
- text: "Hey! How are you?"
utter_cheer_up:
- text: "Here is something to cheer you up:"
image: "https://i.imgur.com/nGF1K8f.jpg"
utter_did_that_help:
- text: "Did that help you?"
utter_happy:
- text: "Great, carry on!"
utter_goodbye:
- text: "Bye"
utter_iamabot:
- text: "I am a bot, powered by Rasa."
session_config:
session_expiration_time: 60
carry_over_slots_to_new_session: true
其中intents
:定義了期望用戶的輸入,即意圖分類的詳情;
actions:定義了 assistant 能夠說什麼和做什麼;
templates:定義了 assistant 相應的消息模板。
這些是如何一起協調工作的呢?Rasa核心的任務是針對每個對話選擇合正確的響應。在這個例子中,我們的響應是簡單的發送消息給用戶,這裏面的響應都用utter_
開頭。assistant 根據模板進行響應。可以參見 Custom Actions 創建更復雜的響應。
7. 訓練模型
一旦添加了新的NLU或Core數據,或更新 domain 或配置文件的時候,就需要重新訓練模型。執行下面的命令rasa train
。這個命令會調用Rasa Core 和NLU的訓練函數,並將訓練得到的模型存儲到models/目錄下面。這個命令會自動重新訓練更新的部分。
8. 與助手進行對話
到目前爲止就建立了一個基於機器學習的對話助手。下一步通過執行下面的命令和assistant進行對話:
rasa shell