開源任務式問答機器人架構系列--Rasa
- Rasa
-
- data/nlu.md
- data/stories.md
- domain.yml
- config.yml
- 總結
Rasa
rasa是一個開源的問答機器人架構,rasa可用于建構基于上下文的AI助手,也可用于建構閑聊機器人。
Rasa有兩個主要子產品:Rasa NLU和Rasa Core,Rasa NLU 用于對使用者消息内容的語義了解,主要包括實體識别,意圖識别;Rasa Core 用于對話管理(Dialogue management),記錄多輪資訊,跟蹤對話狀态。Rasa官方還提供了一套互動工具 RasaX 幫助使用者提升和部署由Rasa架構建構的AI小助手和聊天機器人。
建立一個初始的Rasa項目。可在終端運作如下指令:
rasa init --no-prompt
init.py | an empty file that helps python find your actions |
---|---|
actions.py | an empty file that helps python find your actions |
config.yml ‘*’ | configuration of your NLU and Core models |
credentials.yml | details for connecting to other services |
data/nlu.md ‘*’ | your NLU training data |
data/stories.md ‘*’ | your stories |
domain.yml ‘*’ | your assistant’s domain |
endpoints.yml | details for connecting to channels like fb messenger |
models/.tar.gz | your initial model |
可以看到,一個完整的項目主要包括以上内容。最為重要的是帶*号的檔案,主要是需要我們定制的用以訓練NLU模型和對話管理模型的資料。
以下分别介紹上述檔案的主要内容。
data/nlu.md
Rasa NLU是一個開源的自然語言處理工具,其主要作用是識别使用者的意圖,以及使用者消息内容所涉及的實體:
“我想查詢廣州今天的天氣”
NLU将會解析成:
{
"intent": "search_weather",
"entities": {
"address" : "廣州",
"date_time" : "今天"
}
}
也就是,識别出使用者的意圖為查詢天氣,識别的兩個實體包括地點和時間,分别是廣州和今天。也就是我們常說的填槽。nlu的訓練資料在data/nlu.md檔案,是以markdown編寫的形式,易于了解,示例如下:
## intent:request_weather
- 幫我查下天氣
- 天氣怎麼樣
- 我想知道[明天](date_time)的天氣
- 請問[北京](address)[今天](date_time)的天氣如何?
- [後天](date_time)我去[南京](address),那裡的天氣如何?
## intent:greet
- hey
- hello
## synonym:上海
- 上海市
- 魔都
以上即為NLU子產品訓練所需的資料,其中##intent為使用者query的意圖,意圖底下為訓練資料。值得注意的是,該nlu.md檔案即是意圖分類模型的訓練資料,也是命名實體識别的訓練資料,例如以上天氣查詢助手主要實體包括時間和地點,均在訓練資料中進行了标注。“請問北京今天的天氣如何?”
另外我們還可在nlu.md檔案中定義同義詞表,比如上海市和魔都都指的是上海,通過定義synonym可以達到實體歸一化的目的。
當然訓練資料還可以是json檔案格式,具體可以查詢官網描述。
data/stories.md
story資料用于訓練對話管理器模型(Rasa Core),表示的是使用者的意圖與機器的響應。如下圖所示
## happy path
* request_weather
- weather_form
- form{"name": "weather_form"}
- form{"name": null}
## happy path
* great
- utter_answer_greet
* request_weather
- weather_form
- form{"name": "weather_form"}
- form{"name": null}
* thanks
- utter_noworries
## unhappy path
* greet
- utter_answer_greet
* request_weather
- weather_form
- form{"name": "weather_form"}
* chitchat
- utter_chitchat
- weather_form
- form{"name": null}
* thanks
- utter_noworries
上圖舉了三個對話執行個體,##可以了解為注釋,happy path表示使用者很配合機器,即機器人想要什麼資訊,使用者就給什麼資訊,*号表示的是使用者的意圖,-表示的是機器的響應action,比如上圖的第二個示例表示的是,使用者先跟機器人打招呼,意圖為great,此時機器人響應動作為utter_answer_great,然後使用者說了一句話,識别的意圖為我想查詢天氣(request_weather),此時機器人響應weather_form(定制的Form Policy),進入循環,直到機器人擷取到所有需要的實體資訊,然後将“name”置null,傳回查詢的天氣結果,使用者表示感謝(thanks),機器人響應utter_noworries,目前輪對話結束。
domain.yml
domain包含了目前機器人可以識别的意圖類型,實體類型,slots,以及機器人能夠執行的actions,同時機器人可執行的action對應的話術(NLG)一般也在該檔案進行指定。可以說該機器人能做什麼都可以在domain中一窺究竟。
intents:
- greet
- thanks
- whoareyou
- request_weather
-
slots:
date_time:
type: unfeaturized
auto_fill: false
address:
type: unfeaturized
auto_fill: false
entities:
- date_time
- address
actions:
- utter_answer_greet
- utter_answer_thanks
- utter_answer_whoareyou
- utter_ask_date_time
- utter_ask_address
- action_default_fallback
forms:
- weather_form
responses:
utter_answer_greet:
- text: "您好!請問我可以幫到您嗎?"
- text: "您好!很高興為您服務。請說出您要查詢的功能?"
utter_answer_thanks:
- text: "嗯呢。不用客氣~"
- text: "這是我應該做的,主人~"
- text: "嗯嗯,合作愉快!"
如上圖所示,從domain.yml中我們可以知道目前機器人支援的意圖,實體,slots,以及actions分别包括哪些,以及機器人不同action會回複對應的話術。
config.yml
除了nlu.md, stories.md, domain.yml這三個檔案,config.yml是另一個不可擷取的檔案,該配置檔案指定了機器人的運作方式,即處理流程,以及将會采取的政策。比如:
language: "zh"
pipeline:
- name: "JiebaTokenizer"
dictionary_path: "data/dict"
- name: "RegexFeaturizer"
- name: "CRFEntityExtractor"
- name: "EntitySynonymMapper"
- name: "CountVectorsFeaturizer"
- name: "CountVectorsFeaturizer"
analyzer: "char_wb"
min_ngram: 1
max_ngram: 4
- name: "EmbeddingIntentClassifier"
policies:
- name: EmbeddingPolicy
epochs: 100
max_history: 5
- name: FallbackPolicy
fallback_action_name: 'action_default_fallback'
- name: MemoizationPolicy
max_history: 5
- name: FormPolicy
從上圖我們可知道,進行中文的問答任務的流程大緻為,先用jieba對使用者query進行分詞,然後提取regex特征,并采用CRF進行實體識别。進行意圖識别采用的分類器為EmbeddingIntentClassifier,其網絡的輸入特征通過CountVectorsFeaturizer進行抽取。而Rasa Core的action決策采用的是EmbeddingPolicy(也是一種分類器),若對話中途停止則采取FallbackPolicy,MemoizationPolicy表示一個session最多存儲5輪對話,FormPolicy表示采用基于Form的政策,類似也有其他的基于深度學習的政策,需要自己實作。
定義了以上檔案之後,即可使用如下指令進行訓練:
rasa trian
訓練的模型存儲在model/檔案夾下,以.tar.gz結尾。
訓完可通過在終端中輸入如下指令進行互動式體驗:
rasa shell
示例如下:
總結
Rasa架構采用python語言編寫,将Rasa NLU及Rasa Core較好的進行解耦,對于使用者而言,需定義自己的nlu資料,及stories,指定pipeline,及policy。較為複雜的是,當需要定制不同的action,及policy時,我們需要實作其對應的方法。
Rasa架構可以結合現在流行的深度學習模型進行意圖的識别及action決策,還可以結合知識圖譜進行搭建。後續有時間将把相關的實踐進行文檔記錄。