建立屬于你的智能客服
背景
很多人問,對話式交互系統(tǒng)就是語音交互么?當(dāng)然不是。語音交互本身真的算不上新概念,大家可能都給銀行打過電話,“普通話服務(wù)請按1,英文服務(wù)請按2……返回上一層請按0” 這也算對話式交互系統(tǒng),我想大家都清楚這種交互帶來的用戶體驗有多低效。那么對話式交互系統(tǒng)已經(jīng)可以取代人類提供服務(wù)了么?也沒有,圖靈測試還沒有過呢,著什么急啊。
不過,隨著人工智能的發(fā)展,對話式交互穿著語音和文本的外衣,攜手模糊搜索引擎,懷抱計算科學(xué)和語言學(xué)的內(nèi)核,帶著定制化推薦的花環(huán),駕著深度學(xué)習(xí)和大數(shù)據(jù)的馬車乘風(fēng)破浪而來——我們就知道,大約是時候了。至少,我們已經(jīng)可以在十分鐘內(nèi)創(chuàng)造自己的對話式客服了。
今天的文章大致分為三部分:歷史,今天(chatbot api)和未來(深度學(xué)習(xí)和智能問答)。
先定義一下交互系統(tǒng),wiki給出的定義是:
Interaction is a kind of action that occurs as two or more objects have an effect upon one another. |
即雙方或者多方相互影響的過程,那么在咱們的上下文中,我們不妨限定為人機(jī)交互。先來講講是什么,再來講講怎么做吧。
歷史和現(xiàn)在
廣義上的對話式交互實際上包括所有一問一答形式的人機(jī)交互,自始至終,我們都需要從機(jī)器拿到信息。在最早的時代用的是文本交互系統(tǒng)TUI,其實直到今天,我相信程序員們在Linux下面完成大部分操作時還是會選用Terminal,這種文本交互非常簡潔高效,但是有一個缺點:不熟悉操作的人上手非常困難,需要記住大量的指令和規(guī)則,才可以有效的告訴機(jī)器想要它做什么——正如一個笑話:“問:如何生成一個隨機(jī)的字符串? 答:讓新手退出VIM”。
直觀的,既然“以機(jī)器的交流方式告訴機(jī)器想要做什么”這件事情給人類帶來了很差的用戶體驗,那我們可以讓機(jī)器提供可能的選項來讓人類選擇。所以,人類用了幾十年,把交互系統(tǒng)升級成了圖形化交互GUI。大家今天看到的桌面系統(tǒng)就是特別典型的一個體現(xiàn)。包括后來的觸摸屏幕和智能手機(jī)的發(fā)展,其實都是圖形化交互的不同表現(xiàn)。
現(xiàn)在一切都好了么?并沒有。雖然機(jī)器可以在瞬間呈現(xiàn)大量的信息,但是人類在同一時刻可注意到的信息卻極為有限。心理學(xué)研究發(fā)現(xiàn),人類的注意廣度其實只有5-9個對象。想象一下上面那張圖,如果我在桌面上放100個應(yīng)用程序呢?1000個呢?隨著數(shù)據(jù)量的發(fā)展。如何在大量的信息中,迅速呈現(xiàn)出有效的信息呢?
搜索系統(tǒng),或者再具體一點——推薦系統(tǒng),在選項過多的時候,承擔(dān)起了給用戶盡可能高效率的提供想要的信息的任務(wù)。如果我們做好了智能搜索,我們就能做好智能交互。本質(zhì)上都是一樣的:在浩瀚的已知數(shù)據(jù)里,基于一定模型和經(jīng)驗,總結(jié)出用戶最想要的答案并及時的呈現(xiàn)出來。我問Google一個問題,Google將我想要的答案排在***個位置返回給我,誰又能說這不是對話式交互呢?
當(dāng)然,我們希望的對話式UI不僅是一問一答,我們希望對話系統(tǒng)能夠有自己的知識數(shù)據(jù)庫,希望它保有對上下文的記憶和理解,希望它具有邏輯推演能力,甚至,頗有爭議的,希望它具有一定的感情色彩。
所以,我們有了今天的Conversational UI,對話式交互只是一個殼子。其中的本質(zhì)是智能和定制化服務(wù),在一段時間的訓(xùn)練之后,你拿起電話撥給銀行,應(yīng)答的智能客服和人類的交互方式是一樣的。拋開繁瑣的從1按到9的決策路徑,直接告訴他你要做什么,銀行會直接給你提供***你需求的服務(wù)。而完成這個任務(wù),我們主要有兩條路可以走,一條是專家系統(tǒng),這里也會給大家介紹幾個網(wǎng)絡(luò)上的引擎,爭取在十分鐘之內(nèi)讓大家學(xué)會建立一個屬于自己的智能客服系統(tǒng)。而另外一條,則是智能問答系統(tǒng),需要一點機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的知識——教機(jī)器理解規(guī)則,比教機(jī)器規(guī)則,要有趣的多。
輸入和輸出
前面都在講輸入,就是機(jī)器如何理解人類的指令。是因為輸出這個問題,可以說已經(jīng)被解決了很久了。文本、圖像和語音三大交流方式中,語音被解決的最晚,但是20年前的技術(shù)就已經(jīng)足夠和人類進(jìn)行交流了,雖然我們還是能很容易的聽出來語料是不是電子合成的,但是這一點音色上的損失并不影響我們交流的目的。
而語音到文本的識別便要復(fù)雜得多。這類工作確切來說始于1952年。從讀識數(shù)字從1到0,然后把數(shù)字的聲音譜線打出來,識別說的是哪個數(shù)字開始。這個模型雖然達(dá)到了98%的精度,但是其實并不具有通用性:數(shù)據(jù)源空間和目標(biāo)空間都實在是太小了。
我們都知道當(dāng)下***或者說***用的語音識別模型是深度學(xué)習(xí)模型。但是在此之前呢?舉一個典型例子:開復(fù)老師的博士論文,隱馬爾科夫模型,大約三十年前發(fā)表,如下圖所示:
簡單說就是一個時間序列模型。有時間狀態(tài),隱藏狀態(tài),然后有觀測狀態(tài)。比如我有兩個色子,一個六面體色子,從1到6。一個四面體的,從1到4。兩個色子之間進(jìn)行轉(zhuǎn)換的概率都是0.5?,F(xiàn)在給出一段極端一點的序列 111122224441111555566666666,大家覺得哪一段是四面體色子、哪一段是六面體色子呢?同理,聽到一個語音,我想知道后面隱藏起來的那句話,原理也是和扔色子一樣的:根據(jù)觀測到的狀態(tài)(聲音)來推理后面隱藏的狀態(tài)(文本)。這類概率模型的效果相當(dāng)不錯,以至于今天還有許多人在用。
Chatbot API
按照人工干預(yù)的多少,推理引擎的實現(xiàn)大致可以分為兩類。一類是人工定義規(guī)則,一類是機(jī)器從數(shù)據(jù)里面自動學(xué)習(xí)規(guī)則。對于前者,我們都知道wit.ai和api.ai這兩個著名的chatbot開放api, 分屬于Facebook和Google兩大巨頭。先來看一下實現(xiàn)的效果:
這里的+表示得分,機(jī)器準(zhǔn)確的理解了人類的意圖。o表示不得分,機(jī)器并沒有理解。我們可以看到,其實表現(xiàn)并沒有想象中的那么好,一些很簡單的案例‘i would like to order pizza’ 都沒有得分,離普通人類的智能還有些距離。
那么背后的邏輯是怎樣的呢?舉一個api.ai的例子,我們會定義不同的類型和變量,然后把他們和相關(guān)的值與回答鏈接起來。從而在和用戶進(jìn)行交互的時候,能夠按照已知的(人類定義的)規(guī)則來存儲相應(yīng)的值,并調(diào)用相應(yīng)的方法。
可能大家會覺得英文讀起來比較慢,這里介紹一個中文版api.ai——yige.ai. 并不是廣告,我了解這個平臺還得益于我的朋友——有一天他跑來跟我說:夭壽啦!你知道嗎,有個相親網(wǎng)站,拿人工智能代替女性用戶和人聊天!之后,官方辟謠說并不會這么做。但是yige.ai在新手入門方面的友善程度,實在是我見過中文chatbot API中數(shù)一數(shù)二好的。
但是也正如圖中所示,我們依舊需要人工定義很多事情包括詞庫,場景,規(guī)則,動作,參數(shù)等等。在買鞋這樣一個小的場景和確定范圍的交互期待里面,這樣做還是可以為大部分人群所接受的。畢竟簡單而直觀,精準(zhǔn)的實現(xiàn)了“十分鐘制作屬于自己的chatbot”這一需求,更不需要強(qiáng)大的計算資源和數(shù)據(jù)量。但我們并不太可能在這樣的系統(tǒng)里面,得到定義好的域以外的知識。如果我們的時間和人力足夠多的話,能夠有專門的一些領(lǐng)域?qū)<襾硗晟七@個提問庫,將會使得搜索的精度非常高。因為所有可能的提問都已經(jīng)有了專業(yè)的答案。但是,當(dāng)場景復(fù)雜之后,這樣做的工作量就會變成很大的壓力了。
所以,我們需要深度學(xué)習(xí)。
深度學(xué)習(xí)想要達(dá)到一個好的表現(xiàn),需要有兩個前提。一個是足量的計算資源,一個是大量的數(shù)據(jù)。
計算資源不用說,如果沒有GPU,圖片/語音這種非結(jié)構(gòu)化的原始數(shù)據(jù)訓(xùn)練的時間基本需要以“周”來作單位。
數(shù)據(jù)集設(shè)計
關(guān)于大數(shù)據(jù),一個很常見的問題就是,多大才算大,學(xué)術(shù)一點的說法是:大到包含區(qū)分目標(biāo)值所需要的所有特征就可以了——我們都知道在實踐中,這句話基本屬于廢話。那么舉個例子,一般來說訓(xùn)練一個語音識別的模型,數(shù)據(jù)是以千小時為單位計算的。
而且很抱歉的是,很多商業(yè)公司的數(shù)據(jù)集基本是不公開的。那么對于小型的創(chuàng)業(yè)公司和自由研究者,數(shù)據(jù)從哪里來呢?筆者整理了一些可以用來做自然語言處理和智能問答的公開數(shù)據(jù)集,這里由于篇幅和主題所限,就不展開講了。改天會專門開主題介紹免費可用的公開數(shù)據(jù),以及在公開數(shù)據(jù)集上所得到的模型應(yīng)該如何遷移到自己的問題域當(dāng)中來。
這里用斯坦福大學(xué)的著名問答數(shù)據(jù)集作為例子,SQuAD,可以被稱為業(yè)內(nèi)用于衡量問答系統(tǒng)的最棒最典型的數(shù)據(jù)集。我們可能在高中時代都做過閱讀理解,一篇文章帶有幾個問題,答案來自于文章的信息。那么有了這樣一個數(shù)據(jù)集,我們能做的事情是什么呢?這樣一個數(shù)據(jù)集所訓(xùn)練出的模型可以解決什么樣的問題?在各個問題中,人類的表現(xiàn)和機(jī)器的表現(xiàn)有什么樣的差異?為什么?
我們很高興的看到,在***發(fā)表的一篇基于r-net的論文中,機(jī)器的表現(xiàn)已經(jīng)可以和人類媲美了。人類在這個數(shù)據(jù)集所得到的EM得分約82.3,F(xiàn)1得分約91.2。而微軟發(fā)表的框架EM得分高達(dá)82.1,和人類相差不足0.2%。
深度學(xué)習(xí)
好的,現(xiàn)在數(shù)據(jù)有了,計算資源有了,模型從哪里來呢?我們很高興的看到算法正在進(jìn)化,人工的干預(yù)隨著技術(shù)的進(jìn)步越來越少。在DeepMind于2017年12月5日發(fā)表的***版本中,AlphaZero沒有用到任何人工的特征就打敗了用了一堆特征的前任AlphaGo,也打敗了人類歷經(jīng)千年沉淀下來的珍瓏棋譜。
直觀一點,在圖像識別的深度網(wǎng)絡(luò)中,計算機(jī)難以理解原始圖像像素值的含義,然而神經(jīng)網(wǎng)絡(luò)每層的權(quán)重實際上學(xué)習(xí)到了圖像的高級特征。越高層的神經(jīng)網(wǎng)絡(luò),成分越具體。***層可以通過比較像素的亮度來識別邊緣,基于此,第二層可以檢測邊角的集合,第三層可能是小的色泡或者面,第四層可能是嘴巴這類更復(fù)雜的對象,再往下可能是更具體的特征,直到物體本身。 神經(jīng)網(wǎng)絡(luò)和人腦一樣,將原始信號經(jīng)過逐層的處理,最終從部分到整體抽象為我們感知的物體。圖中所示的是一個從圖像到物體的感知過程,或者說是一個圖像到標(biāo)簽列表的映射模型。
語音轉(zhuǎn)文本或者問題到答案,也是一樣的,可以用sequence2sequence作為學(xué)習(xí)的模型設(shè)計。前面說到的api.ai也好,yige.ai也好,規(guī)則和變量都是傾向于人工定義的。機(jī)器會對未經(jīng)定義的語法規(guī)則給出一些通用的支持,但是正如我們看到的,一旦遇到定義域之外的交互場景,表現(xiàn)就很難盡如人意。
而在端到端的識別中,我們不關(guān)心所有的語法和語義規(guī)則,所有的輸入直接定向為問題,所有的輸出直接是答案。當(dāng)數(shù)據(jù)足夠多,我們就可以做到端到端的識別,而不受人工定義的語義規(guī)則的干擾。這件事情,既是好事情,也是壞事情。基于人工規(guī)則的機(jī)器永遠(yuǎn)都不可能超過人類的表現(xiàn),但是純基于數(shù)據(jù)的機(jī)器學(xué)習(xí)模型,卻可以打敗人類——這點在AlphaGo的所向披靡之中,已經(jīng)被證實過了。
如同圖示,seq2seq的模型可以基于Sutskever在2014年發(fā)表于NIPS的一篇文章設(shè)計 ,模型用recurrent neural network每次讀入一個token作為輸入,并預(yù)測應(yīng)答的token。我們假設(shè)***個人說了ABC,而第二個人回答了WXYZ,那么模型將會建立一個從ABC到WXYZ的映射。模型的隱變量,我們可以叫他“thought vector”,表明在這里機(jī)器理解了這個ABC的想法,或者說概念。這個模型在簡化程度和通用程度上都是極好的,后面的實驗也證明了這一點。
下圖是LSTM(一種神經(jīng)網(wǎng)絡(luò))所產(chǎn)生的翻譯結(jié)果樣例,大家可以參考一下效果,并和百度翻譯以及谷歌翻譯對比一下。
深度學(xué)習(xí)Chatbot開源實現(xiàn)
相信通過前面的介紹,大家對于對話式交互系統(tǒng),以及現(xiàn)有的api都有了初步了解,那么對于剩下一部分想要自己實現(xiàn)模型的人們,感謝github和arxiv,我們在源代碼和原理級別都可以知道當(dāng)今最聰明的那批人在做什么。
這里是一個頗具代表性的開源框架,純基于seq2seq,由機(jī)器學(xué)習(xí)實現(xiàn),并沒有任何人工規(guī)則干預(yù)。
和Google一直以來的風(fēng)格相符,整個代碼都是在TensorFlow和python3.5上實現(xiàn),支持各種開源數(shù)據(jù)庫以及定制化對話數(shù)據(jù)庫,甚至擁有本地的web界面。有現(xiàn)成的權(quán)重文件可以下載(無需自己耗時訓(xùn)練),通過 TensorBoard我們也可以輕松監(jiān)測系統(tǒng)的表現(xiàn),雖然在部分對話的表現(xiàn)上差強(qiáng)人意,有著諸如在上下文中對同一個問題的回答不統(tǒng)一這種明顯的bug,離通過圖靈測試更是很遙遠(yuǎn),但是其設(shè)計原理和實現(xiàn)方式對入門者實在是再友好不過。至少,這個模型告訴了我們,深度學(xué)習(xí)模型是可以自動從有噪聲的開放領(lǐng)域內(nèi)提取相應(yīng)知識,并全自動生成答案的。
總結(jié)與展望
總結(jié)一下,如果我們有更多的領(lǐng)域?qū)<液蜆I(yè)務(wù)分析師,并且業(yè)務(wù)上需要進(jìn)行對話式交互設(shè)計的場景相對有限,變量關(guān)系都比較簡單,那么毫無疑問,各式各樣的chatbot API將會是你***的選擇——它設(shè)計直觀,接口簡單,集成容易,而且大多數(shù)時候,它在特定問題下的精度將會比端到端的深度學(xué)習(xí)要高。如果我們有更多的數(shù)據(jù)科學(xué)家和大數(shù)據(jù)工程師,對和機(jī)器一起學(xué)習(xí)數(shù)據(jù)中的規(guī)則有很大的興趣,同時業(yè)務(wù)場景又比較復(fù)雜,需要支持更多非結(jié)構(gòu)化的原始數(shù)據(jù)以及自動化提取特征和規(guī)則,那么建議大家借勢深度學(xué)習(xí),搭建屬于自己的智能問答系統(tǒng)。
【本文是51CTO專欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號:思特沃克,轉(zhuǎn)載請聯(lián)系原作者】