目錄
前言
一、傳統(tǒng)對(duì)話機(jī)器人架構(gòu)
二、對(duì)話系統(tǒng)流程
2.1 ASR語(yǔ)音識(shí)別
2.2 NLU自然語(yǔ)言理解
2.3 DM對(duì)話管理
2.4 NLG自然語(yǔ)言生成
2.5?TTS語(yǔ)音合成
三、Rasa組件介紹
3.1?Rasa簡(jiǎn)介
3.2?Rasa安裝
3.3?Rasa項(xiàng)目基本流程
3.4?Rasa常用命令
3.4?Rasa常用命令
???????
前言
????????人機(jī)對(duì)話是一個(gè)很難的問(wèn)題,在商業(yè)與技術(shù)上都沒(méi)有固定的套路,被稱為NLP領(lǐng)域中“王冠上的鉆石”。
一、傳統(tǒng)對(duì)話機(jī)器人架構(gòu)
????????早期的對(duì)話機(jī)器人架構(gòu)主要基于模板和規(guī)則,如AIML(Artifical Intelligence Maekup Language)。這里以AIML的查詢天氣模板為例講述規(guī)則系統(tǒng)。
<?xml version="1.0" encoding="utf-8"?>
<aiml version="1.0">
<category>
<pattern>*</pattern>
<that>你現(xiàn)在在什么地方</that>
<template>
<think><set name="where"><formal><star/></formal></set></think>
<random>
<li><get name="where"/>是個(gè)好地方.</li>
<li>真希望我也在<get name="where"/>, 陪你.</li>
<li>我剛剛看了下<get name="where"/>的天氣哦.</li>
</random>
</template>
</category>
<category>
<pattern>外面熱嗎</pattern>
<template>
你現(xiàn)在在<get name="where"/>,
<system>python getweather.py reltime <get name="where"></system>
</template>
</category>
</aiml>
? ? ? ? 規(guī)則的描述主要基于正則表達(dá)式。將用戶的問(wèn)題匹配到類似模板,可以取得預(yù)定義好的答案。事實(shí)上,像AliceBot這樣基于AIML的對(duì)話機(jī)器人,擁有4萬(wàn)多個(gè)不同的類別數(shù)據(jù),是一個(gè)海量的規(guī)則數(shù)據(jù)庫(kù)。
? ? ? ? 使用規(guī)則的優(yōu)點(diǎn)是:準(zhǔn)確率高,但缺點(diǎn)明顯:規(guī)則只能覆蓋較少部分,且隨著時(shí)間推移,規(guī)則越寫越多,難以維護(hù)。此外,對(duì)話機(jī)器人還需要維護(hù)一個(gè)龐大的問(wèn)答知識(shí)庫(kù),對(duì)用戶的問(wèn)題通過(guò)計(jì)算句子之間的相似度來(lái)尋找數(shù)據(jù)庫(kù)中已有的最相近的問(wèn)題,從而給出相應(yīng)答案。
? ? ? ? 知乎和Quora等問(wèn)答網(wǎng)站不希望用戶提問(wèn)很多重復(fù)的問(wèn)題,因此對(duì)用戶的每一個(gè)新的問(wèn)題,這些網(wǎng)站都會(huì)和已有的問(wèn)題進(jìn)行匹配,從而產(chǎn)生一些skip-thought計(jì)算句向量等方法。
二、對(duì)話系統(tǒng)流程
? ? ? ? 當(dāng)前人機(jī)對(duì)話按流程主要分為5個(gè)部分:
- ASR:語(yǔ)音識(shí)別模塊;
- NLU:自然語(yǔ)言理解模塊;
- DM:對(duì)話管理模塊;
- NLG:自然語(yǔ)言生成模塊;
- TTS:語(yǔ)音合成模塊;
2.1 ASR語(yǔ)音識(shí)別
? ? ? ? 語(yǔ)音識(shí)別(Automatic Speech Recognition, ASR)也稱語(yǔ)音轉(zhuǎn)文字,是將人類的語(yǔ)音內(nèi)容轉(zhuǎn)換成相應(yīng)文字的技術(shù)。這方面已經(jīng)有比較多的商業(yè)解決方案(科大訊飛、百度等)和開(kāi)源項(xiàng)目(Kaldi、DeepSpeech等),技術(shù)已經(jīng)相對(duì)成熟。
2.2 NLU自然語(yǔ)言理解
? ? ? ? 自然語(yǔ)言理解(Natural Language Understanding, NLU)是一個(gè)比較寬泛的領(lǐng)域。這里的NLU是指分析用戶語(yǔ)言中表達(dá)的意圖(intent)和相關(guān)實(shí)體(entity)的技術(shù)。
? ? ? ? NLU模塊主要對(duì)用戶的就問(wèn)題在句子級(jí)別進(jìn)行分類和意圖識(shí)別,同時(shí)在詞級(jí)別找出用戶問(wèn)題中的關(guān)鍵實(shí)體,并且進(jìn)行實(shí)體槽填充。舉個(gè)例子:用戶說(shuō)"我想吃羊肉泡饃",NLU要識(shí)別出用戶的意圖是"尋找餐館",而關(guān)鍵實(shí)體是"羊肉泡饃"。有了意圖和關(guān)鍵實(shí)體,就方便DM模塊對(duì)后端數(shù)據(jù)庫(kù)進(jìn)行查詢。
? ? ? ? 從NLP和機(jī)器學(xué)習(xí)角度看,意圖識(shí)別是一個(gè)文本分類問(wèn)題,實(shí)體槽填充是一個(gè)傳統(tǒng)的命名實(shí)體識(shí)別問(wèn)題。兩者都需要標(biāo)注數(shù)據(jù)。下面是Rasa中NLU數(shù)據(jù)的格式:
nlu:
- intent: greet
examples: |
- 你好!
- 早上好!
- intent: restaurant_search
examples: |
- 找個(gè)吃[拉面](food)的店。
- 這附近哪里有吃[麻辣燙](food)的地方。
? ? ? ? 這看上去和AIML數(shù)據(jù)非常像。然而NLU數(shù)據(jù)實(shí)際用到了以這些標(biāo)注數(shù)據(jù)訓(xùn)練出的復(fù)雜的機(jī)器學(xué)習(xí)模型,表現(xiàn)能力和泛化能力大大增強(qiáng)。只要列出了"拉面"和"麻辣燙",如果出現(xiàn)"涼皮"、"糖葫蘆"等詞,Rasa良好的NLU系統(tǒng)依舊會(huì)把它們標(biāo)注為食物。
? ? ? ? 一種常見(jiàn)的NLU架構(gòu)方案如下圖所示,對(duì)輸入的文本首先經(jīng)過(guò)分句、分詞、詞性標(biāo)注等基礎(chǔ)自然語(yǔ)言預(yù)處理。對(duì)某些應(yīng)用來(lái)講,指代消解是非常重要的步驟。將原有的指代詞甚至零指代補(bǔ)全成完整名稱,可以消除很多NLU數(shù)據(jù)的歧義。之后通過(guò)機(jī)器學(xué)習(xí)、深度學(xué)習(xí)、規(guī)則等方式進(jìn)行意圖識(shí)別和實(shí)體標(biāo)注。
2.3 DM對(duì)話管理
? ? ? ? 對(duì)話管理(Dialog Management, DM)是指根據(jù)對(duì)話歷史狀態(tài)決定當(dāng)前的動(dòng)作或?qū)τ脩舻姆磻?yīng)。DM模塊是對(duì)話系統(tǒng)流程的控制中心,有著至關(guān)重要的作用。其首要任務(wù)是負(fù)責(zé)管理整個(gè)對(duì)話的流程。通過(guò)對(duì)上下文的維護(hù)和解析,DM模塊要決定用戶提供的意圖是否明確,以及實(shí)體槽的信息是否足夠,以進(jìn)行數(shù)據(jù)庫(kù)查詢或開(kāi)始執(zhí)行相應(yīng)的任務(wù)。
? ? ? ? 當(dāng)DM模塊認(rèn)為用戶提供的信息不全或模棱兩可時(shí),就要維護(hù)一個(gè)多輪對(duì)話的語(yǔ)境,不斷引導(dǎo)式地詢問(wèn)用戶以得到更多的信息,或者提供不同的可能選項(xiàng)讓用戶選擇。DM模塊要存儲(chǔ)和維護(hù)當(dāng)前對(duì)話的狀態(tài)、用戶的歷史行為、系統(tǒng)的歷史行為、知識(shí)庫(kù)中的可能結(jié)果等。當(dāng)DM模塊認(rèn)為已經(jīng)清楚得到了全部需要的信息后,就會(huì)將用戶的查詢變成數(shù)據(jù)庫(kù)查詢語(yǔ)句去知識(shí)庫(kù)(或知識(shí)圖譜)中查詢響應(yīng)資料,或者實(shí)現(xiàn)和完成相應(yīng)的任務(wù)(如購(gòu)物下單,或者類似撥打電話等)。
? ? ? ? 一個(gè)DM例子如下圖所示:
? ? ? ? 在實(shí)際中,DM模塊肩負(fù)著大量雜活,是與使用需求強(qiáng)綁定的,大部分使用規(guī)則系統(tǒng),實(shí)現(xiàn)和維護(hù)都比較繁瑣。因此,在新的研究中,將DM模塊的狀態(tài)建模成一個(gè)序列標(biāo)注的監(jiān)督學(xué)習(xí)問(wèn)題,甚至用強(qiáng)化學(xué)習(xí)加入一個(gè)用戶模擬器來(lái)將DM模塊訓(xùn)練成一個(gè)深度學(xué)習(xí)模型。我們后面會(huì)看到Rasa在其Core模塊中是如何簡(jiǎn)潔又巧妙地實(shí)現(xiàn)DM的。
2.4 NLG自然語(yǔ)言生成
? ? ? ? 自然語(yǔ)言生成(natural Language Generation, NLG)是將意圖和相應(yīng)的實(shí)體轉(zhuǎn)換成人類用戶可以理解的文本的過(guò)程。當(dāng)前主要的方案有模板法和神經(jīng)網(wǎng)絡(luò)序列生成法。模板法比較單一,然而是人工設(shè)計(jì)的,所以可讀性最好。神經(jīng)網(wǎng)絡(luò)序列生成法的形式變化多樣,類似千人千面,響應(yīng)的質(zhì)量和穩(wěn)定性難以控制。目前在實(shí)際應(yīng)用中,多以模板法為主,對(duì)模板法稍加改造(如隨機(jī)選擇一組模板中的一個(gè))以克服其過(guò)于呆板的缺點(diǎn)。
? ? ? ? NLG模塊是機(jī)器與用戶交互的"最后一公里"。閑聊機(jī)器人往往在大量語(yǔ)料上用一個(gè)seq2seq的生成模型,直接生成反饋給用戶的自然語(yǔ)言。然而在垂直領(lǐng)域的任務(wù)型機(jī)器人中并不適用,用戶需要的是解決問(wèn)題的準(zhǔn)確答案,而不是俏皮話。
? ? ? ? 當(dāng)下很多人嘗試用深度學(xué)習(xí)做端到端的以任務(wù)為目標(biāo)的對(duì)話機(jī)器人,有的基于傳統(tǒng)的對(duì)話機(jī)器人框架,即NLU+DM+NLG,每一個(gè)模塊都換成深度學(xué)習(xí)模型,再加入用戶模擬器進(jìn)行強(qiáng)化學(xué)習(xí),進(jìn)行端到端的訓(xùn)練;還有的使用"Memort Networks"方式,偏向于seq2seq,將整個(gè)知識(shí)庫(kù)都編碼在一個(gè)復(fù)雜的深度網(wǎng)絡(luò)中,再和編碼過(guò)的問(wèn)題結(jié)合起來(lái)解碼生成答案。這主要應(yīng)用在機(jī)器閱讀理解上,注明的斯坦福的SQuAD比賽,有一些神乎其技的結(jié)果,但在垂直領(lǐng)域任務(wù)導(dǎo)向的對(duì)話機(jī)器人上的成功應(yīng)用還有待觀察。?
2.5?TTS語(yǔ)音合成
? ? ? ? 語(yǔ)音合成也稱文字轉(zhuǎn)語(yǔ)音(Text to Speech, TTS),是將文字轉(zhuǎn)換成人類可以理解的語(yǔ)音技術(shù)。TTS已經(jīng)發(fā)展許多年,業(yè)界有比較成熟的解決方案,從效果來(lái)說(shuō)達(dá)到了可以實(shí)用的地步。出于研發(fā)成本的考慮,在實(shí)際使用中多直接使用專業(yè)公司(科大訊飛、百度)提供的TTS引擎或服務(wù)。
三、Rasa組件介紹
3.1?Rasa簡(jiǎn)介
Rasa是一個(gè)用于構(gòu)建對(duì)話機(jī)器人的開(kāi)源機(jī)器學(xué)習(xí)框架,幾乎覆蓋了對(duì)話系統(tǒng)的所有功能,是目前主流的開(kāi)源機(jī)器對(duì)話機(jī)器人框架。
Rasa框架包含4個(gè)部分:
- Rasa NLU:提取用戶想要做什么和關(guān)鍵的上下文信息;
- Rasa Core:基于對(duì)話歷史,選擇最優(yōu)的回復(fù)和動(dòng)作;
- 通道(channel)和動(dòng)作(action):連接對(duì)話機(jī)器人與用戶及后端服務(wù)系統(tǒng)(使用界面),支持即時(shí)通信軟件對(duì)接Rasa;
- tracker store、lock store、event broker等輔助系統(tǒng);
Rasa的核心工作邏輯如下:
????????大多數(shù)機(jī)器人都需要調(diào)用外部服務(wù)來(lái)完成對(duì)應(yīng)功能,例如,在天氣查詢機(jī)器人需要天氣信息服務(wù)商的接口來(lái)完成實(shí)際天氣情況的查詢,訂餐機(jī)器人需要調(diào)用外部服務(wù)完成金融消費(fèi)和餐品下單。在Rasa中,這種由于具體業(yè)務(wù)決定的動(dòng)作被稱為自定義動(dòng)作(custom action)。自定義動(dòng)作運(yùn)行在一個(gè)單獨(dú)的服務(wù)器進(jìn)程中,也被稱為動(dòng)作服務(wù)器(action server)。動(dòng)作服務(wù)器通過(guò)HTTP和Rasa Core進(jìn)行通信。
3.2?Rasa安裝
?安裝Rasa非常容易,在命令行中使用pip命令即可安裝。
pip install rasa
3.3?Rasa項(xiàng)目基本流程
構(gòu)建一個(gè)完整的Rasa項(xiàng)目工程會(huì)有如下步驟:
(1)初始化項(xiàng)目
(2)準(zhǔn)備NLU訓(xùn)練數(shù)據(jù)
(3)配置NLU模型
(4)準(zhǔn)備故事(story)數(shù)據(jù)
(5)定義領(lǐng)域(domain)
(6)配置Rasa Core模型
(7)訓(xùn)練模型
(8)測(cè)試機(jī)器人
(9)讓人們使用機(jī)器人
3.4?Rasa常用命令
Rasa常用命令如下表所示:
命令 | 功能 |
rasa init | 創(chuàng)建一個(gè)新的項(xiàng)目,包含樣本訓(xùn)練模型、配置和動(dòng)作 |
rasa train | 使用NLU訓(xùn)練數(shù)據(jù)、故事數(shù)據(jù)、配置訓(xùn)練模型,默認(rèn)情況下模型保存在./models目錄中 |
rasa interactive | 交互式的訓(xùn)練:通過(guò)和機(jī)器人對(duì)話修正可能的錯(cuò)誤,并將對(duì)話數(shù)據(jù)導(dǎo)出 |
rasa run | 運(yùn)行rasa服務(wù)器 |
rasa shell | 等價(jià)于執(zhí)行rasa run命令,開(kāi)啟基于命令行界面的對(duì)話界面和機(jī)器人交流 |
rasa run actions | 運(yùn)行rasa動(dòng)作服務(wù)器 |
rasa x | 啟動(dòng)Rasa X服務(wù)器(如果沒(méi)有安裝Rasa X的話會(huì)提示安裝) |
rasa -h | 打印Rasa命令的幫助信息 |
3.4?Rasa常用命令
????????成功安裝Rasa后,開(kāi)發(fā)者就可以使用Rasa自帶的命令行工具創(chuàng)建一個(gè)示例項(xiàng)目:
rasa init
? ? ? ? rasa init運(yùn)行后會(huì)詢問(wèn)新創(chuàng)建的項(xiàng)目位于哪里(默認(rèn)是當(dāng)前目錄),一級(jí)創(chuàng)建示例項(xiàng)目后是否立即訓(xùn)練模型(默認(rèn)是Yes),開(kāi)發(fā)者可以選擇No,然后自己通過(guò)rasa train命令訓(xùn)練模型。
? ? ? ? 示例項(xiàng)目創(chuàng)建成功后,選擇的項(xiàng)目目錄下將會(huì)增加如下文件:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-496504.html
—— actions
—— actions.py
—— __init__.py
—— config.yml
—— credentials.yml
—— data
—— nlu.py
—— rules.py
—— stories.py
—— domain.yml
—— endpoints.yml
—— tests
—— test_stories.py
? ? ? ? 所有Rasa命令行工具都默認(rèn)使用這套文件目錄布局,因此這是創(chuàng)建Rasa工程的最佳方法。我們鼓勵(lì)在命令行中運(yùn)行rasa train命令來(lái)訓(xùn)練這個(gè)項(xiàng)目模型,并通過(guò)使用rasa shell命令來(lái)和機(jī)器人進(jìn)行對(duì)話。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-496504.html
到了這里,關(guān)于Rasa系列教程(一) -- 系統(tǒng)及各組件介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!