Rasa對話系統(tǒng)--篇章1

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)題

*? 意圖

-? 動作

將該圖中的內(nèi)容保存到stories.md文件中

3.3.3搭建domain

domain可以理解為機(jī)器的知識庫,其中定義:意圖、動作、對應(yīng)動作反饋的內(nèi)容

intent? ? ? 意圖

action? ? ? 動作

templates? ? ? 回答模板

entities? ? ? 實體

slots? ? 詞槽

把該圖片的內(nèi)容保存到domain.yml文件中

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)算效率。

生成的dialogue模型

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

將該圖中的內(nèi)容存入nlu.md文件中

3.4.2添加nlu模塊,配置nlu_config.yml文件

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

將該圖片的內(nèi)容存入nlu_config.yml文件

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


重要參考資料:

【1】基于Rasa_NLU的微信chatbot

【2】https://terrifyzhao.github.io/2018/09/17/Rasa使用指南01.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容