|
現(xiàn)在來回答上次的問題,為什么工業(yè)界不能夠使用End2End,也即端到端的方式來構(gòu)建對話系統(tǒng)呢?首先百科一下,什么是End2End模型:
圖:Pipeline形式
圖:端到端形式 接著回到我們的問題,為什么工業(yè)界不能使用呢?是因為模塊化的模型更好管理,端到端的,如果輸出錯了,那對于算法工程師而言就是個黑盒子,我們并不知道在哪個環(huán)節(jié)出錯了,這就是一個核心的問題。 下面回到我們的主線,開始講解在工業(yè)界整個對話系統(tǒng)的全貌,以下的技術(shù)分享主要是關(guān)于智能客服的。那么智能客服有什么樣的功能呢?我們分成兩種方式:
圖:輔助回復功能 接下來我們主要介紹輔助回復的對話系統(tǒng),這種對話系統(tǒng)和我們初步構(gòu)想的不一樣,主要是檢索,通過檢索的方式,搜索出對應的回復,例如圖片中,用戶問:“為什么沒有效果?。俊?,之后對話系統(tǒng)會自動的檢索出相關(guān)的回復,總共羅列出三條。 那么接下來的問題是:檢索式對話系統(tǒng)是怎么做到這樣的?我們先看以下的圖片,這個看起來復雜但是實際上邏輯清晰的圖代表了檢索式對話系統(tǒng),首先是數(shù)據(jù)搭建,其次是通過召回的手段收集到相關(guān)的回答,再次是排序決策哪條是最好的輸出。
圖:檢索式對話系統(tǒng)流程圖 第一層:數(shù)據(jù)層: 這個層的主要目的,是收集很多線上的數(shù)據(jù),分別有兩種形式,其一是商家的對話日志,來自于商家和用戶的交流,其二是客服的對話日志,來自客服和用戶的交流。類似這種線上的日志,量會非常大,所以需要搭建一種回流機制,自發(fā)的篩選出優(yōu)質(zhì)的數(shù)據(jù),供之后的模型訓練。 第二層:召回層: 和傳統(tǒng)的任務導向型對話系統(tǒng)不太一樣,這種召回的模塊充當了NLU+DM的角色,即需要理解用戶的話語,也需要根據(jù)當前的狀況做出動作。那么接下來的問題是,召回的索引應當如何選擇?這點尤其重要,因為涉及到了之后排序的邏輯:
“親,感謝你的支持” “親,比心” “親,之后多多光顧我們店哦” 第二層召回層第一種:規(guī)則召回 這點往往是最重要的,需要業(yè)務上的工程師根據(jù)當下的時事,熱點等信息構(gòu)建規(guī)則化的召回,例如有一條鏈路專門是用來召回和世界杯相關(guān)的文本,就需要放在這里。 第二層召回層第二種:文本召回 在做文本召回的時候,勢必會遇到對話系統(tǒng)的常見問題,顧短期還是顧長期?一個常見的對話場景,可能會發(fā)生幾十輪,那么此時召回的內(nèi)容應該是長期對話歷史做召回,還是短期歷史做召回,并沒有一個好的答案。所以簡單的做法是把兩種思想合并起來一起使用。或者,可以考慮從長期的對話中,處理出比較重要的信息,刪減掉無用的話語。 第二層召回層第二種:向量召回 和文本召回相比,向量召回往往帶來更差的結(jié)果,為什么這么講?很多例子都是有了一兩個字的改變,但是語義發(fā)生巨大變化,但是向量召回并不會發(fā)現(xiàn)的。舉個例子來說:“我們的產(chǎn)品下次會更優(yōu)秀” 和 “我們下次會做的更優(yōu)秀”,前后只差一個單詞產(chǎn)品,兩句話在語義上就有了很大的差別,前者在描述產(chǎn)品更好,而后者在說服務態(tài)度更好,但是對于向量召回來說,可不是那么容易發(fā)現(xiàn)的事情。 在向量召回的時候,有兩種需要選擇,其一是Context-Context召回,其二是Context-Response 召回,前者的含義是通過當前文本來召回相似的文本,再從這個文本里找出對應的Response。后者的含義是從當前上下文來召回答案,這種在邏輯上不是很通順,讀者可以自行思考一下。 接下來,我們應該使用什么樣的模型學習到這種embedding表示呢?實際上在這種業(yè)務場景中,我們的數(shù)據(jù)是特殊的,每一個子數(shù)據(jù)都是由{Context, Response}來構(gòu)成的,也就是存在一一對應的關(guān)系,那這種時候,我們可以使用dual encoder(雙塔模型)來對分別對Context,Response進行編碼,
圖:Dual Encoder示意圖,其中Source-Target即為文中的Context-Response,共享一個模型的參數(shù) 在選擇好模型之后,就是對于正負樣本的定義,其中正樣本就是高質(zhì)量的Context-Response對,而負樣本是由隨機替換掉Response來制作的。而如何制作高質(zhì)量的負樣本也是學術(shù)界的一個重要問題,也即 “高質(zhì)量負樣本”,其實可以通過文本召回的方式,從Context找到相似的Context_a,再找到Context_a 對應的Response_a 即可,這就能達到我們對于高質(zhì)量的要求! 第二層召回層第三種:標簽召回 標簽召回實際上是最弱的一種,為什么這么說呢?
第三層排序?qū)拥谝环N:規(guī)則排序 和召回層第一種類似,如果能走規(guī)則,肯定是規(guī)則優(yōu)先,因為里面含有了算法工程師對于業(yè)務的深刻理解。 第三層排序?qū)拥诙N:相關(guān)性排序 那么船長問讀者一個問題?相關(guān)性從何而來?我們有很多的正樣本,也會有隨機構(gòu)成的負樣本,在這個時候,我們的相關(guān)性是否可以通過模型來得到呢?答案是可以的。那么,仍舊是之前的雙塔模型嗎?答案是否定的,雙胎模型實際上在本質(zhì)上,Context-Response的信息交互還是不夠,需要把Context和Response當做一個輸入,這種情況會有好的效果:
圖:預訓練模型框架 那么接下來的問題是,如何做預訓練任務呢?我們的目標是什么呢?在工業(yè)界中,向量化表示勢必要隨著業(yè)務的數(shù)據(jù)變化而變化,例如BERT是利用百科知識來訓練的,但是應用場景是在法律領(lǐng)域,這種時候我們希望不同的法律向量化表示應該盡可能的遠才可以。那就需要使用大量的法律文本來做預訓練,改變之前潛在的向量化分布。我們按照下圖舉了一個可視化的例子,其中每一種顏色代表了一個領(lǐng)域的word embedding二維可視化,可以看出,在微調(diào)前我們各個領(lǐng)域都是混合在一起的,在利用法律,金融等領(lǐng)域數(shù)據(jù)集微調(diào)之后,各個領(lǐng)域的embedding空間回逐漸的拆分開。
圖:各個領(lǐng)域embedding進行微調(diào)之前
圖:各個領(lǐng)域embedding進行微調(diào)之后 基于上文,應該嘗試如下的預訓練目標:
第三層排序?qū)拥谌N:CTR排序 接下來就到了推薦系統(tǒng)常見的問題,CTR任務,這里有非常繁多的CTR模型,例如FM,DeepFM等等。我們這里可以借鑒CTR的模型來對最終的輸出進行排序。
圖:DeepFM模型 第四層應用層: 終于到了輸出的地方,在智能客服的場景中,實際上能用到的情況很多,例如商家在回復的時候,輸出一些他可供的選項,或者在商家打字的時候,預測出下一個單詞等等。本質(zhì)上會幫助商家更好地做出回答,而再往深了說,就是提升整個對話的效果,包括提升流暢性,降低客訴率等等。 這篇文章是給大家來分享在工業(yè)界的對話系統(tǒng),具體和學術(shù)界有什么不一樣的地方,可以看到工業(yè)界并不會用強化學習的方式來做決策,反而是利用召回+排序的方式來更好地做出決策,通過召回的方式從億萬的數(shù)據(jù)中篩選出幾千條,再做排序的流程篩選出最優(yōu)質(zhì)的回答。那么這次船長給大家留下一個問題:
|
|
|