Rasa的官網(wǎng)? ?項目的github地址:Rasa_wechat? ?視頻講解(正文+編程+QA):bilibili
本篇文章大量參考基于Rasa_NLU的微信chatbot、另一篇,并融入一些自己的理解和需求,可以結(jié)合在一起看。
對話系統(tǒng)==聊天盒子==chatbot? (一種是純聊天型;一種是針對特定商業(yè)型)
NLU(Natural Language?Understanding,自然語言理解),主要是意圖識別+實體識別
DM(Dialogue?Management,對話管理),主要是對話狀態(tài)維護(hù)+數(shù)據(jù)庫查詢
NLG(Natural Language?Generation,自然語言生成),主要是生成交互的自然語言
Rasa是rasa.ai提供的開源工具,支持Python 2和3,可以本地部署,自己針對實際需求訓(xùn)練和調(diào)整模型,在商業(yè)chatbot設(shè)計上應(yīng)用較多。Rasa既支持英文,又支持中文,甚至支持任何語言,主要包含兩大模塊:rasa_nlu和rasa_core。
rasa_nlu是負(fù)責(zé)自然語言理解的,包括意圖識別+實體識別;rasa_core是根據(jù)得到的意圖(intent)和實體(entity)進(jìn)行語言回復(fù)的(即,next_action)。
1.安裝Rasa
pip install rasa_core? (安裝)? ? ? ? ? ? ? ? ? ? ? ? ?pip install -U rasa_core? (更新)
pip install rasa_nlu[tensorflow]? (安裝)
2.對話流程的偽代碼
input_string=""? ?##輸入
intent_object=intent(input_string)? ##意圖識別
response=policy(intent_object)? ##回復(fù)生成
print(response)? ##返回用戶
3.以一個簡單的對話為例:
A:input_string="我餓了"
機(jī)器處理過程:intent_object=intent("我餓了")? ? ?response=policy(intent_object)="你想吃什么?"
機(jī)器人:print("你想吃什么?")
準(zhǔn)備兩種材料,一是NLU自然語言理解模塊需要的,二是DM對話管理模塊需要的
·訓(xùn)練數(shù)據(jù):nlu? examples + dialogue stories
·配置文件:nlu? config + dialogue domain
3.1)自然語言理解?Rasa_nlu
針對用戶的問題,NLU模塊的任務(wù)是:意圖識別+實體識別
意圖識別:在句子級別進(jìn)行分類(類似,文本分類),明確意圖;
實體識別:在詞級別找出用戶問題的關(guān)鍵實體,進(jìn)行實體槽填充(slot filling)
eg:用戶說:“我想吃漢堡”,NLU模塊首先識別出用戶的意圖“尋找餐館”,其次識別出關(guān)鍵實體“漢堡”。有了意圖和關(guān)鍵實體,就方便后面對話管理模塊進(jìn)行后端數(shù)據(jù)庫的查詢或是有缺失信息而來繼續(xù)多輪對話補(bǔ)全或其他缺失的實體槽?!究梢岳斫鉃?,我們要從用戶的輸入中,提出越多越精確的關(guān)鍵詞,將這些關(guān)鍵詞們作為我們回答的依據(jù),找到最匹配當(dāng)前場景,當(dāng)前狀態(tài)的話進(jìn)行回復(fù)。? 可以擴(kuò)展用戶的信息包括{意圖:尋找餐館,關(guān)鍵實體:漢堡,時間:22:28,地點(diǎn):北京中關(guān)村地鐵站,天氣:小雨,.......},后臺根據(jù)這些信息,為用戶提供一個恰當(dāng)?shù)幕貜?fù)?!?/p>
對用戶輸入語句進(jìn)行理解的NLU工具很多,大多都是以服務(wù)的方式提供,如Google的API.ai,Microsoft的Luis.ai,F(xiàn)acebook的Wit.ai等。事實上,申請到這類API的話用幾行代碼即可完成一個chatbot,亦可參考使用圖靈機(jī)器人和api.ai相關(guān)接口。如果想從零開始動手實現(xiàn)NLU,推薦閱讀Do-it-yourself NLP for bot developers。
3.2)Rasa_NLU的一個中文對話系統(tǒng)例子:rasa_nlu_chi
首先需要構(gòu)建示例,作為意圖識別和實體識別的訓(xùn)練數(shù)據(jù):放在/data/nlu.json里

實體還可以擴(kuò)展到多個詞, 而且value不一定要是你句子中的詞,這樣一來,就能將同義詞、誤拼映射到同一個值上,比如下面這個例子:

Rasa也支持Markdown格式的訓(xùn)練語料
3.3)參考下面鏈接打一個簡單的中文單輪對話模型
https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html
3.3.1?安裝Rasa
pip install rasa_core
pip install rasa_nlu[tensorflow]
3.3.2搭建stories對話場景
stories可以理解為對話的場景流程,可以告訴機(jī)器多輪對話場景下怎么處理,例如:我們希望的流程:用戶問好--->機(jī)器人問用戶今天過得怎么樣--->用戶反饋情緒--->機(jī)器根據(jù)不同的情緒進(jìn)行回復(fù),這里包含兩個流程,一個是正面情緒的流程,一個是負(fù)面情緒的流程,因此需要寫兩個story,編寫story。
##? story標(biāo)題
*? 意圖
-? 動作

3.3.3搭建domain
domain可以理解為機(jī)器的知識庫,其中定義:意圖、動作、對應(yīng)動作反饋的內(nèi)容
intent? ? ? 意圖
action? ? ? 動作
templates? ? ? 回答模板
entities? ? ? 實體
slots? ? 詞槽

Rasa Core的任務(wù)是在獲得用戶的意圖后,選擇正確的action,這些action就定義在domain中以utter_開頭的內(nèi)容,每一個action會根據(jù)templates中的情況來返回對應(yīng)的內(nèi)容。(注,此例子中沒有定義詞槽與實體,所以domain中暫時沒有。)
3.3.4訓(xùn)練對話模型
下一步就是用神經(jīng)網(wǎng)絡(luò)去訓(xùn)練我們的Core模型了,我們可以直接執(zhí)行以下命令,訓(xùn)練的模型將會存儲在models/dialogue文件夾下。
python -m rasa_core.train -d domain.yml -s stories.md -o models/dialogue

可以看到,訓(xùn)練過程采用了一個神經(jīng)網(wǎng)絡(luò),結(jié)構(gòu)為:masking->lstm->dense->activation,這里簡單介紹下masking層,在nlp領(lǐng)域,輸入的內(nèi)容可能不是一樣長的,為了能統(tǒng)一處理數(shù)據(jù)需要定長,因此某些值需要補(bǔ)0或者截取多余內(nèi)容,但是補(bǔ)0的部分其實是沒有意義的,masking層能讓這些補(bǔ)0的部分不參與之后的計算,從而提升運(yùn)算效率。

3.3.5嘗試和機(jī)器人交流
用訓(xùn)練好的模型來運(yùn)行我們的機(jī)器人,執(zhí)行以下命令
python -m rasa_core.run -d models/dialogue


此時我們的機(jī)器人還無法判斷用戶的意圖,只能根據(jù)輸入的意圖返回特定的答案,所以我們只能輸入一些結(jié)構(gòu)化的數(shù)據(jù),例如輸入我們之前在domian中定義好的意圖,輸入的信息需要以 /開頭,我們可以直接輸入意圖 /greet,當(dāng)然,如果你想讓機(jī)器人回答更多的內(nèi)容,請在stories與domain中添加更多的內(nèi)容。
簡單總結(jié):
1]安裝rasa? ? 2]搭建stories對話場景,即編寫stories.md文件? ? 3]搭建domain,即編寫domain.yml文件
4]訓(xùn)練對話模型??python -m rasa_core.train -d domain.yml -s stories.md -o models/dialogue
5]嘗試和機(jī)器人交流??python -m rasa_core.run -d models/dialogue
以上是一個能夠運(yùn)行的簡單模型,未添加意圖識別。
3.4)參考下面鏈接打一個簡單的中文單輪對話模型(能夠進(jìn)行意圖識別)
https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html
3.4.1添加nlu模塊,配置nlu.md意圖文件
rasa_nlu理解用戶句子,輸出意圖、關(guān)鍵詞等
首先定義一個對應(yīng)的意圖可能會出現(xiàn)的文本內(nèi)容文件nlu.md

3.4.2添加nlu模塊,配置nlu_config.yml文件
我們還需要一個nlu的配置文件,nlu_config.yml,由于我們是中文系統(tǒng),所以language對應(yīng)的是zh,如果你需要英文的對話請修改為en。

3.4.3訓(xùn)練具有意圖識別的模型
準(zhǔn)備好之后就可以開始訓(xùn)練NLU模型了,執(zhí)行以下命令
python -m rasa_nlu.train -c nlu_config.yml --data nlu.md -o models --fixed_model_name nlu --project current --verbose

3.4.4嘗試和機(jī)器人對話
添加完NLU模型之后我們就能讓機(jī)器識別自然語言了,我們執(zhí)行下以下命令。
python -m rasa_core.run -d models/dialogue -u models/current/nlu

重要參考資料: