李孟全,吳士泓,王志剛
(遠(yuǎn)光軟件股份有限公司,珠海 519085)
在企業(yè)推進(jìn)以人機(jī)協(xié)同系統(tǒng)為基礎(chǔ)的智能化進(jìn)程中,任務(wù)型對(duì)話系統(tǒng)是其中最核心的領(lǐng)域,需要各方深入研究和推動(dòng)。趙陽(yáng)洋等[1]認(rèn)為,盡管對(duì)話系統(tǒng)近年來(lái)有較大的發(fā)展,能夠幫助用戶(hù)完成簡(jiǎn)單的任務(wù),但其在通用性、深度理解等方面還面臨著許多挑戰(zhàn)。筆者研究了Rasa開(kāi)源框架,發(fā)現(xiàn)Rasa在通用性和深度理解方面具備一定的優(yōu)勢(shì),該框架設(shè)計(jì)高效、靈活,提供了對(duì)話機(jī)器人開(kāi)發(fā)時(shí)必要的基礎(chǔ)架構(gòu)和工具,尤其是Bunk等[2]基于Rasa框架提出的DIET模型,能夠?qū)τ脩?hù)意圖和實(shí)體信息進(jìn)行聯(lián)合建模,且Rasa整體上與NLP技術(shù)的最新研究進(jìn)展融合性很好。所以,本文將基于Rasa框架深入研究和設(shè)計(jì)一套智能對(duì)話系統(tǒng),以便減輕相關(guān)人員的工作壓力,滿(mǎn)足公司“提質(zhì)增效”的管理需求,為企業(yè)數(shù)字化轉(zhuǎn)型奠定堅(jiān)實(shí)基礎(chǔ)。
對(duì)話技術(shù)大體上經(jīng)歷了三個(gè)發(fā)展階段,分別是基于符號(hào)規(guī)則和模板階段、基于傳統(tǒng)機(jī)器學(xué)習(xí)階段、基于深度學(xué)習(xí)階段。
基于符號(hào)規(guī)則和模板階段。該階段的技術(shù)嚴(yán)重依賴(lài)專(zhuān)家手工制定的語(yǔ)法規(guī)則和本體設(shè)計(jì),優(yōu)點(diǎn)是容易理解,缺點(diǎn)是人工成本非常高、擴(kuò)展性差。例如,Goddeau等[3]提出的有限狀態(tài)機(jī)方法需要人工預(yù)先定義好全部狀態(tài)和狀態(tài)轉(zhuǎn)移條件,采用NLU輸出中得分或概率最高的結(jié)果才能完成對(duì)話狀態(tài)更新,該方法缺點(diǎn)是無(wú)法解決錯(cuò)誤識(shí)別問(wèn)題,且在復(fù)雜應(yīng)用場(chǎng)景下靈活性不足。后來(lái),Sun等[4]提出用于修正NLU中錯(cuò)誤識(shí)別的N-Best列表分?jǐn)?shù)方法,但缺點(diǎn)也同樣明顯:相關(guān)參數(shù)依賴(lài)人工編制,不能根據(jù)數(shù)據(jù)分布情況進(jìn)行學(xué)習(xí)。
基于傳統(tǒng)機(jī)器學(xué)習(xí)階段。該階段的技術(shù)方法包括K近鄰、決策樹(shù)、樸素貝葉斯、邏輯回歸、集成學(xué)習(xí)、條件隨機(jī)場(chǎng)、支持向量機(jī)(SVM)等。該階段的技術(shù)雖然具備弱學(xué)習(xí)能力,但漏洞修補(bǔ)難度大,也不利于模型大規(guī)模應(yīng)用。例如,Lewis等[5]、Zhang等[6]認(rèn)為樸素貝葉斯模型的獨(dú)立假設(shè)條件比較苛刻,在實(shí)際場(chǎng)景中應(yīng)用價(jià)值不大;Yang等[7]、Weinberger等[8]認(rèn)為K近鄰算法在結(jié)果一致性方面簡(jiǎn)單、有效,且重新訓(xùn)練代價(jià)低,但其性能過(guò)于依賴(lài)模型查找到的最近鄰距離度量,且面對(duì)高維數(shù)據(jù)時(shí)處理效果不佳。Joachims[9]指出SVM應(yīng)對(duì)高維空間和過(guò)擬合時(shí)表現(xiàn)出來(lái)的穩(wěn)健性不錯(cuò),但其性能又高度依賴(lài)于相關(guān)參數(shù)和核函數(shù)的選擇。Lubis等[10]通過(guò)變分自編碼潛在動(dòng)作空間對(duì)對(duì)話策略進(jìn)行優(yōu)化,主要探索了預(yù)訓(xùn)練、動(dòng)作知情的先驗(yàn)和多任務(wù)學(xué)習(xí)三種借助輔助任務(wù)塑造潛在變量分布的方法,優(yōu)點(diǎn)是與目前的Transformer不同,不需要額外的數(shù)據(jù),且計(jì)算成本低,在端到端對(duì)話任務(wù)上效果顯著,但在長(zhǎng)距離上下文和對(duì)話軌跡準(zhǔn)確性方面有待完善。
基于深度學(xué)習(xí)階段。該階段的技術(shù)促使了端到端的學(xué)習(xí)成為可能,是目前研究的主流方法,也涌現(xiàn)了大量的研究成果,當(dāng)然也存在一定程度的不足。目前在處理序列標(biāo)注任務(wù)時(shí)會(huì)在傳統(tǒng)序列標(biāo)注方法基礎(chǔ)上加入深度學(xué)習(xí)方法,例如,Ma等[11]、Dilek等[12]提到的具有條件隨機(jī)場(chǎng)層的雙向LSTM,成為目前處理序列標(biāo)注任務(wù)的主流模型,既可以兼顧上下文又可以兼顧依賴(lài)關(guān)系信息,滿(mǎn)足過(guò)去和未來(lái)的信息均可被充分利用的要求,但該方法有時(shí)候還是需要人工構(gòu)建特征;其他方面,馮強(qiáng)中[13]利用知識(shí)圖譜和神經(jīng)網(wǎng)絡(luò)(主要是雙向LSTM)進(jìn)行知識(shí)增強(qiáng),將復(fù)雜且非標(biāo)準(zhǔn)的自然語(yǔ)言查詢(xún)語(yǔ)句轉(zhuǎn)換為符合公司知識(shí)庫(kù)標(biāo)準(zhǔn)的問(wèn)題,再結(jié)合知識(shí)庫(kù)中的問(wèn)題、相似問(wèn)題和答案等實(shí)體構(gòu)建知識(shí)圖譜,完成智能問(wèn)答工作,但不足之處是模型僅限于其公司內(nèi)部相關(guān)數(shù)據(jù)上的表現(xiàn)不錯(cuò);Li等[14]提出了一種上下文感知的動(dòng)態(tài)卷積網(wǎng)絡(luò),可以在生成卷積核的同時(shí)充分利用上下文信息,提出的新網(wǎng)絡(luò)框架可被擴(kuò)展至多任務(wù)學(xué)習(xí)下的雙通道上,用于完成對(duì)話行為和情感分類(lèi)的聯(lián)合識(shí)別任務(wù)。
目前主流的深度學(xué)習(xí)方法在對(duì)話任務(wù)的表現(xiàn)不錯(cuò),但有些問(wèn)題需要進(jìn)一步解決,比如:①模型中領(lǐng)域漂移(domain shift)、語(yǔ)義間隔等問(wèn)題;②目前對(duì)于語(yǔ)言的理解多數(shù)停留在語(yǔ)義表層,復(fù)雜場(chǎng)景下融合知識(shí)后的邏輯推理能力偏弱;③域適應(yīng)能力面臨的問(wèn)題亟需解決,以便應(yīng)對(duì)自由度比較高的對(duì)話場(chǎng)景。
Rasa是一個(gè)用于構(gòu)建智能對(duì)話機(jī)器人的開(kāi)源機(jī)器學(xué)習(xí)框架,擁有大量的可擴(kuò)展特性組件,幾乎覆蓋對(duì)話系統(tǒng)的所有功能,是目前對(duì)話系統(tǒng)的主流開(kāi)源框架[15],主要包含以下四部分。
(1)Rasa NLU:提取用戶(hù)想要做什么和上下文關(guān)鍵信息;
(2)Rasa Core:基于對(duì)話歷史,選擇最優(yōu)的回復(fù)和動(dòng)作;
(3)通道(channel)和動(dòng)作(action):連接對(duì)話機(jī)器人與用戶(hù)及后端服務(wù)系統(tǒng);
(4)輔助系統(tǒng):Tracker Store、Lock Store和Event Broker等。
Rasa內(nèi)部運(yùn)行機(jī)制如圖1所示。用戶(hù)可以利用通道支持的客戶(hù)端將查詢(xún)信息輸入對(duì)話系統(tǒng),Rasa NLU負(fù)責(zé)將用戶(hù)的輸入轉(zhuǎn)換成意圖和實(shí)體信息,完成自然語(yǔ)言理解工作。然后,Rasa Core負(fù)責(zé)基于當(dāng)前和歷史的對(duì)話記錄(其中NLU的輸出是對(duì)話記錄的一部分)采取下一個(gè)動(dòng)作,下一個(gè)動(dòng)作可以是回復(fù)用戶(hù)信息、調(diào)用用戶(hù)自定義的動(dòng)作類(lèi)。自定義動(dòng)作運(yùn)行在一個(gè)單獨(dú)的服務(wù)進(jìn)程中,被稱(chēng)為動(dòng)作服務(wù)器,該服務(wù)器通過(guò)HTTP(hypertext transfer protocol)與Rasa Core進(jìn)行相互通信。多數(shù)情況下,我們重點(diǎn)關(guān)注Rasa NLU和Rasa Core兩個(gè)核心部分。
圖1 Rasa內(nèi)部運(yùn)行機(jī)制示意圖
3.1.1 Rasa NLU模塊中各類(lèi)組件
Rasa NLU主要是通過(guò)監(jiān)督學(xué)習(xí)算法完成意圖提取和實(shí)體提取,所以需要自行準(zhǔn)備一些包含意圖信息和實(shí)體信息的語(yǔ)料。這里將以某央企總部制定的“會(huì)計(jì)基礎(chǔ)管理辦法”及省公司本部制定的“會(huì)計(jì)科目責(zé)任制管理規(guī)范(業(yè)務(wù)規(guī)范)”等原始數(shù)據(jù)為基礎(chǔ),準(zhǔn)備需要的相關(guān)語(yǔ)料,同時(shí)會(huì)根據(jù)最新的內(nèi)外部政策要求更新語(yǔ)料庫(kù)。
Rasa NLU在軟件架構(gòu)設(shè)計(jì)上比較靈活,允許開(kāi)發(fā)人員自行使用各種算法完成相關(guān)工作,這些算法的具體實(shí)現(xiàn)被稱(chēng)為組件(component)。由于這些相互連接的各類(lèi)組件及組件間的數(shù)據(jù)流共同組成了有向無(wú)環(huán)圖,所以Rasa NLU也可以被看作一個(gè)基于有向無(wú)環(huán)圖的通用框架。自然語(yǔ)言理解模塊通常有實(shí)體識(shí)別和意圖識(shí)別兩個(gè)任務(wù),為了完成這些任務(wù),圖2給出了一個(gè)典型的Rasa NLU配置通常包含的各類(lèi)組件,下面針對(duì)這些組件進(jìn)行逐一說(shuō)明。
圖2 典型Rasa NLU組件示意圖
3.1.2 流水線配置
由上面分析可知,Rasa NLU是基于有向無(wú)環(huán)圖進(jìn)行組件配置,這種有向無(wú)環(huán)圖在Rasa中被稱(chēng)為流水線(pipeline),配置文件格式為YAML,配置樣例如算法1所示。
算法1流水線配置樣例
recipe:default.v1
language:zh
pipeline:
-name:JiebaTokenizer #使用Jieba中文分詞器
-name:LanguageModelFeaturizer
#基于HuggingFace的Transformers庫(kù)
model_name:bert #BERT的語(yǔ)言模型和架構(gòu)
model_weights:bert-base-chinese#BERT的中文語(yǔ)言模型和架構(gòu)
-name:RegexFeaturizer
#讀取訓(xùn)練數(shù)據(jù)中的正則表達(dá)式配置
-name:DIETClassifier
#Rasa提供的實(shí)體和意圖聯(lián)合提取組件
epochs:100 #模型運(yùn)行100個(gè)epoch
learning_rate:0.001
tensorboard_log_directory:./log
-name:ResponseSelector
epochs: 100
learning_rate: 0.001 #模型學(xué)習(xí)率
- name: EntitySynonymMapper #實(shí)體識(shí)別組件
3.1.3 Rasa NLU分析結(jié)果
如果輸入“請(qǐng)問(wèn)車(chē)輛燃油費(fèi)報(bào)銷(xiāo)時(shí)需要上傳哪些附件”,NLU將會(huì)給出如算法2所示的解析結(jié)果,顯然“attachment”和“attachment”之間的相關(guān)性明顯高于與“goodbye”的相關(guān)性。
算法2Rasa NLU分析結(jié)果
{
“text”:“請(qǐng)問(wèn)車(chē)輛燃油費(fèi)報(bào)銷(xiāo)時(shí)需要上傳哪些
附件”,
“intent”:{
“id”:5313274288154357548,
“name”:“attachment”,
“confidence”:0.999690031993
},
“entities”:[
{
“entity”:“reimbursement”
“start”:2,
“end”:9,
“confidence”:0.999778123345692,
“value”:“車(chē)輛燃油費(fèi)報(bào)銷(xiāo)”,
“extractor”:“DIETClassifier”
}
],
“intent_ranking”:{
“id”:5313274288154357548”,
“name”:“attachment”,
“confidence”:0.999688021375883,
},
{
“id”:-3614266674174050593,
“name”:“goodbye”,
“confidence”:0.000122011470351,
}
]
}
Rasa Core是Rasa體系中負(fù)責(zé)對(duì)話管理(dialog management,DM)的部分,主要職責(zé)是根據(jù)NLU模塊的輸出實(shí)現(xiàn)會(huì)話行為狀態(tài)的更新和跟蹤,并結(jié)合一定的策略(policy)選擇下一個(gè)動(dòng)作輸出。簡(jiǎn)言之,對(duì)話管理的核心在于基于意圖(intent)和狀態(tài)(state)的動(dòng)作預(yù)測(cè)。對(duì)話管理模塊內(nèi)部運(yùn)行原理示意圖如圖3所示。
圖3 對(duì)話管理模塊內(nèi)部運(yùn)行機(jī)制示意圖
3.2.1 通道
通道的主要作用是對(duì)經(jīng)過(guò)的數(shù)據(jù)進(jìn)行統(tǒng)一封裝,將符合規(guī)范的數(shù)據(jù)推送至下一個(gè)節(jié)點(diǎn)處理。這里的通道有兩類(lèi):輸入通道和輸出通道,前者負(fù)責(zé)將用戶(hù)的身份和輸入信息封裝成用戶(hù)信息對(duì)象后推送給Processor處理,后者將對(duì)話系統(tǒng)需要返回給用戶(hù)的信息進(jìn)行統(tǒng)一封裝。
3.2.2 領(lǐng)域
領(lǐng)域(domain)對(duì)象定義了對(duì)話系統(tǒng)需要掌握的所有信息,例如意圖、實(shí)體(entity)、詞槽(slot)、動(dòng)作、表單(form)和回復(fù)(response)。這些數(shù)據(jù)明確界定了模型的輸入和輸出范圍,一般由Rasa框架中的配置文件domain.yml統(tǒng)一提供。
本質(zhì)上講,領(lǐng)域有利于將對(duì)話系統(tǒng)需要使用的模板信息進(jìn)行統(tǒng)一管理,包括定義的意圖、實(shí)體、槽位、話術(shù)模板,以及自定義的動(dòng)作和策略等。領(lǐng)域?qū)ο笤趧?dòng)作執(zhí)行時(shí)可以提供這些模板信息,如果需要添加或修改這些信息,只需要修改domain.yml文件里的數(shù)據(jù)就可以,不需要修改任何代碼,實(shí)現(xiàn)了系統(tǒng)配置和代碼解耦,便于整體上對(duì)對(duì)話系統(tǒng)進(jìn)行管理。算法3給出了領(lǐng)域?qū)ο蟮臉永?/p>
算法3領(lǐng)域?qū)ο髽永?/p>
intents:
-goodbye
-greet
-chitchat
-deny
-stop
-affirm
-info_date
-info_reimbursement
entities:
-reimbursement
-date-time
slots:
address:
type:text
influence_conversation:false
mappings:
-entity:reimbursement
type:from_entity
date-time:
type:text
influence_conversation:false
mappings:
-entity:date-time
type:from_entity
responses:
utter_greet:
-text:您好,請(qǐng)問(wèn)有什么事情可以幫到您?
utter_goodbye:
-text:再見(jiàn)!
utter_ask_reimbursement:
-text:需要咨詢(xún)哪類(lèi)報(bào)銷(xiāo)業(yè)務(wù)問(wèn)題?
utter_ask_date-time:
-text:業(yè)務(wù)什么時(shí)候發(fā)生的?
utter_ask_continue:
-text:是否要繼續(xù)?
utter_default:
-text:小E沒(méi)有理解您說(shuō)的是什么意思。
actions:
-utter_greet
-utter_goodbye
-utter_ask_reimbursement
-utter_ask_date-time
-utter_ask_continue
-utter_default
-respond_chitchat
-action_reimbursement_form_submit
forms:
reimbursement_form:
required_slots:
-reimbursement
-date-time
3.2.3 故事
故事(story)是一種較高語(yǔ)義層次上記錄對(duì)話過(guò)程的方式,它不僅需要記錄用戶(hù)的語(yǔ)義表達(dá),還需要記錄系統(tǒng)內(nèi)部正確的狀態(tài)變化。故事本身是以字典的形式存在,包含兩個(gè)鍵:story和steps。后面的策略就是通過(guò)學(xué)習(xí)故事內(nèi)容才進(jìn)行動(dòng)作預(yù)測(cè)的。
3.2.4 策略
策略(policy)擔(dān)負(fù)著根據(jù)當(dāng)前用戶(hù)反饋的信息告知Processor當(dāng)前一輪對(duì)話中應(yīng)該執(zhí)行的后續(xù)動(dòng)作以及如何更新對(duì)話狀態(tài)信息等任務(wù)。Rasa框架中的策略管理模塊支持人工規(guī)則的策略和依靠機(jī)器學(xué)習(xí)、深度學(xué)習(xí)完成的數(shù)據(jù)驅(qū)動(dòng)策略,也支持組合策略。由于前期財(cái)務(wù)領(lǐng)域的樣本數(shù)據(jù)偏少,所以采用以表單策略(form_policy)為代表的人工規(guī)則策略,該策略與動(dòng)作管理中的表單動(dòng)作(form_action)相對(duì)應(yīng)。需要說(shuō)明的是,Rasa框架提前預(yù)置了一個(gè)叫fall_back的策略,其目的是為對(duì)話系統(tǒng)執(zhí)行一個(gè)兜底策略。
3.2.5 動(dòng)作
動(dòng)作接收用戶(hù)輸入和對(duì)話狀態(tài)信息,按照業(yè)務(wù)邏輯進(jìn)行處理,并輸出改變對(duì)話狀態(tài)的事件和回復(fù)用戶(hù)的消息。
在生產(chǎn)環(huán)境中部署對(duì)話系統(tǒng)時(shí),使用單機(jī)部署模式,使用Redis作為T(mén)racker store和Lock store背后的數(shù)據(jù)庫(kù),單機(jī)高并發(fā)設(shè)置為6,滿(mǎn)足Rasa服務(wù)器使用6個(gè)worker,性能測(cè)試時(shí)使用REST接口連接Rasa進(jìn)行對(duì)話處理,并使用JMeter等測(cè)試工具對(duì)Rasa的吞吐量和響應(yīng)時(shí)間進(jìn)行測(cè)量。
本文首先從企業(yè)以人機(jī)協(xié)同系統(tǒng)建設(shè)推進(jìn)其智能化建設(shè)的角度引出對(duì)話系統(tǒng),并對(duì)選擇Rasa框架搭建智能對(duì)話系統(tǒng)進(jìn)行說(shuō)明,提出構(gòu)建智能對(duì)話系統(tǒng)的實(shí)現(xiàn)方式;其次,針對(duì)對(duì)話技術(shù)研究現(xiàn)狀和目前的問(wèn)題進(jìn)行分析,給出相關(guān)研究進(jìn)展和未來(lái)挑戰(zhàn);然后,針對(duì)Rasa框架內(nèi)部運(yùn)行機(jī)制進(jìn)行解讀;最后,針對(duì)智能對(duì)話系統(tǒng)進(jìn)行詳細(xì)設(shè)計(jì),針對(duì)對(duì)話系統(tǒng)實(shí)現(xiàn)及系統(tǒng)部署進(jìn)行說(shuō)明。筆者認(rèn)為,隨著全國(guó)“全電發(fā)票”試點(diǎn)工作的深入推進(jìn),國(guó)內(nèi)大型企業(yè)在以財(cái)務(wù)數(shù)智化為基礎(chǔ)的智能系統(tǒng)建設(shè)步伐必將提速,以人機(jī)多元協(xié)同為主線的管理智能化創(chuàng)新應(yīng)用將會(huì)越來(lái)越多。