天天看點

開源任務式問答機器人系列之rasa篇Rasa

開源任務式問答機器人架構系列--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篇Rasa

總結

Rasa架構采用python語言編寫,将Rasa NLU及Rasa Core較好的進行解耦,對于使用者而言,需定義自己的nlu資料,及stories,指定pipeline,及policy。較為複雜的是,當需要定制不同的action,及policy時,我們需要實作其對應的方法。

Rasa架構可以結合現在流行的深度學習模型進行意圖的識别及action決策,還可以結合知識圖譜進行搭建。後續有時間将把相關的實踐進行文檔記錄。