自從iPhone 4S開始內(nèi)置Siri,到現(xiàn)在各種智能音箱,或者扎克伯格說自己做的智能管家, 我認為都算是對話機器人的一類。
以蘋果的Siri和亞馬遜的Echo為例,它實際上是一套非常復(fù)雜的智能系統(tǒng),而對話機器人是其中一個界面。 有些文獻或者商業(yè)機構(gòu)把這部分稱為Conversational UI(對話界面),也就是說我們通過對話來與機器溝通。
遺憾的是,本文和本文的后續(xù)文章,都不可能說清楚怎么完整的做出一個Siri或者Echo, 它們的背后都是由成百數(shù)千名工程師、學(xué)者,在無數(shù)的各種資源支持下,動用幾十個、上百個很多不同的工程技術(shù)的疊加組合而成的。
本文會探討各種簡單的對話機器人技術(shù),而這些技術(shù),每個往往只能完成一個及其特定的功能。
岔開話題的話,在科學(xué)上,“怎么實現(xiàn)一個機器人”,是一個太寬泛的問題,往往此類問題都會被分解為若干個小問題。 例如:怎么讓實現(xiàn)讓機器人能回答單個問題?怎么實現(xiàn)讓機器人能回答連續(xù)的問題?怎么讓機器人幫我買咖啡? 而一個學(xué)術(shù)領(lǐng)域往往是一個子問題的最新、最優(yōu)解,而工程上我們往往需要結(jié)合不同領(lǐng)域的成果構(gòu)建一個可用系統(tǒng)。
機器人的作用之一是回答問題(Question Answering)
一個最簡單的問答系統(tǒng)
最簡單的問答系統(tǒng)就是當(dāng)我們有足夠多的問答數(shù)據(jù),例如:
中國的首都是哪? 北京。
當(dāng)數(shù)據(jù)足夠多的時候,一個最簡單的問答實現(xiàn),就是去匹配問題的相似度。
例如用戶問:中國的首都
假設(shè)我們在python中計算編輯距離的話,會發(fā)現(xiàn)“中國的首都”這個問題和 我們數(shù)據(jù)庫中已有的問題“中國的首都在哪”很相似(距離只有2,可以粗暴理解為只差兩個字)。
那么我們直接給用戶這個問題的答案就好了,就可能有足夠高的成功率。
當(dāng)然這個看上去很簡單粗暴的解決方案有很多問題,例如:
1、準確率取決于相似度算法;
2、很難設(shè)置相似度算法的閾值;
3、數(shù)據(jù)庫要求比較大;
4、擴展性比較差;
但是實際上在真實世界中,往往必須有一部分上這個算法,因為這個算法同樣有優(yōu)勢:
1、不需要訓(xùn)練,假設(shè)你的領(lǐng)導(dǎo)要你給線上產(chǎn)品添加一個問答的時候,他并不喜歡:“我的深度學(xué)習(xí)模型訓(xùn)練5個小時之后,這個答案就上線了”,這樣的回答;
2、自定義問題成本低;
3、非常容易解釋;
4、對于完全匹配的問題可以絕對準確,如果是其他的概率模型的話,就必然有可能不準確,而簡單的模型不會出錯;
更好的回答問題,怎么回答“中國的首都?”
簡單的來說,可以分為“有數(shù)據(jù)”的問答系統(tǒng),和“沒數(shù)據(jù)的問答系統(tǒng)”。
有數(shù)據(jù)的是指,我們已經(jīng)有一些已經(jīng)結(jié)構(gòu)化的數(shù)據(jù),或者說知識。 例如我們的問答系統(tǒng)就想回答關(guān)于國家與城市的問題, 那么我們可以假設(shè)自己已經(jīng)有了很多關(guān)于國家、城市、國家與城市之間關(guān)系的知識。
知識圖譜建模與查詢
“有數(shù)據(jù)”的問答系統(tǒng)是指,例如你有一堆可以查詢的知識。 一種常見的知識存儲方法,就是三元組:
(中國,有首都,北京)
(北京,是某國的首都,中國)
(英國,有首都,倫敦)
(倫敦,是某國的首都,英國)
在上面的前兩個三元組中出現(xiàn)了兩個實體(entity),分別是北京和中國。 總過出現(xiàn)了兩個關(guān)系,分別是“由首都”和“是某國的首都”。
從字面意義上來講,他們可以解決“中國的首都是哪?”和“北京是哪個國家的首都?”這兩個問題, 也就是根據(jù)一個關(guān)系和一個實體,查詢另一個實體。 當(dāng)然也可以解決“北京和中國的關(guān)系”這樣的問題,也就是根據(jù)已知的兩個實體,查詢他們的關(guān)系。
從學(xué)術(shù)上來講,這個領(lǐng)域叫做 Knowledge-Based Question Answering 也就是我們有了知識, 需要在上面構(gòu)建一個問答系統(tǒng)。
題外話,上哪能弄到這些知識呢? 一般來說很多問題是在其他領(lǐng)域工作中,已經(jīng)有了類似數(shù)據(jù)的積累。 或者是利用別人收集的數(shù)據(jù),例如一些開放的中文知識圖譜,例如英文世界的freebase。 還有或者就自己嘗試制造這樣的數(shù)據(jù),例如從維基百科、從百度百科中獲取。 或者……發(fā)揮想象力。
在知識圖譜建模的領(lǐng)域,有一種稱為SPARQL的語言,類似關(guān)系數(shù)據(jù)庫查詢的SQL語言, 例如我們要查詢(中國,有首都,北京) 中的北京,則SPARQL可以寫為:
Select ?x where { 中國, 有首都, ?x }
也就是問題轉(zhuǎn)換為,如何把一句自然語言“中國的首都是哪?”,轉(zhuǎn)換為上面的SPARQL語句?
例如現(xiàn)在的一些方向是利用統(tǒng)計機器學(xué)習(xí)的翻譯任務(wù),完成從“自然語言”到“SPARQL”語言的機器翻譯任務(wù),就如同中英翻譯等自然語言之間的翻譯一樣,同樣也可以做到的。但是根據(jù)語料數(shù)據(jù)、SPARQL復(fù)雜度等等問題,也會有其他各種問題。
當(dāng)然也有不依賴SPARQL作為中間件的查詢系統(tǒng),例如有的文獻設(shè)計了一套在知識圖譜中逐漸搜索(探索)的系統(tǒng); 以這個問題為例,起始點可以是實體“中國”,中國這個實體可能有很多關(guān)系,例如有首都、有文化、有省份、有xxx,然后搜索下一步最合理的關(guān)系“有首都”; 最后探索到答案“北京”,判讀任務(wù)完成。
更多細節(jié)本文不再討論。
沒數(shù)據(jù)的問答系統(tǒng)
IR-based 問答系統(tǒng) (IR: Information Retrieval)
此類問答系統(tǒng)不需要提前構(gòu)建知識,而是根據(jù)問題去檢索答案(例如從搜索引擎上)。
此類問答系統(tǒng)從某種意義上類似人的搜索方式,例如我們想知道“中國的首都是哪”, 可能會去搜索引擎中搜索這個問題,而答案很可能會出現(xiàn)在搜索結(jié)果中, 我們知道這個答案的類型很可能是“某個城市”,所以我們會在搜索引擎給我們的結(jié)果中, 尋找一個城市名。
而機器也可以完成類似過程,首先根據(jù)問題來嘗試判斷答案類型,這里同樣也可以判斷結(jié)果類型為城市。 然后機器可能需要對問題進行重構(gòu),也就是尋找一個搜索問句,能找到答案的幾率最大, 例如這個問題可能被重構(gòu)為:“中國 首都 城市”。(最后添加了這個詞城市,是因為我們假設(shè)可以準確判斷出答案類型)
然后機器去自有的非結(jié)構(gòu)化文檔(沒有知識圖譜化的文檔,例如各種純文本文章),從中尋找最接近我們重構(gòu)后問題的段落。
或者去搜索引擎、百科網(wǎng)站等等,搜索答案、或者檢索問題相關(guān)的段落。
定位到這個段落后,根據(jù)答案類型(這里是城市),嘗試從這個段落中篩出答案。例如我們?nèi)ニ阉饕嫠阉鳌爸袊氖锥肌?,很可能第一個答案段落中的第一個出現(xiàn)的城市名就是我們所需要的答案。
怎么讓機器人幫我買咖啡(Dialogue System)
這里的對話系統(tǒng)特指 Task-Oriented Dialogue System, 也就是讓機器人幫助實現(xiàn)一種特定任務(wù)的系統(tǒng), 有一文獻提到的 General Dialogue System 的系統(tǒng),往往指類似 Chit Chat 的系統(tǒng)。
一般此類對話系統(tǒng)的研究都基于如何讓機器人在有限步驟內(nèi)完成可以完成的任務(wù)的系統(tǒng),并且結(jié)果往往定位到一個單一實體。此類系統(tǒng)的一個隱含假設(shè)往往是通過電話、文字、語音來進行人機交互,也就是沒有什么“點擊按鈕”,“從多個選項選擇”,之類的交互方式。當(dāng)然在一些類似對話系統(tǒng)演變的工程實踐中,是有類似的實現(xiàn)的。
因為這個關(guān)于“必須文字交互”的假設(shè),所以實際上有些問題并不適合基于這種假設(shè)的對話系統(tǒng)完成。例如你在一些手機軟件中搜索餐廳,結(jié)果可能會返回多家餐廳(餐廳本身即實體),他們都有名稱、地址、電話等等信息(這些也可以稱為餐廳這個實體的屬性,當(dāng)然也可以是與餐廳這個實體有關(guān)的其他實體)。而你想要通過語音、朗讀的文字來獲得這個列表,就顯得很愚蠢了,不會有人想聽機器人讀5分鐘搜索結(jié)果的20家餐廳然后決策吧?所以此類系統(tǒng)往往最后是推薦單一實體,例如結(jié)果排名最高的餐廳,如果你需要更換,可以跟系統(tǒng)說換一下餐廳。
一個典型的對話系統(tǒng)的交互過程是這樣的:
用戶:你好(User Dialog Act:greeting)
機器:你好,我可以幫助你搜索并預(yù)訂餐廳(Sys Dialog Act:greeting)
用戶:我想要找一家在中央公園2.0附近的意大利餐廳(User Dialog Act:inform(地址=中央公園2.0,口味=意大利))
機器:請問你想要在中央公園2.0附近什么價位的意大利餐廳?(Sys Dialog Act:request(價位))
用戶:普通的就好(User Dialog Act:inform(價位=普通))
機器:我知道那里有一家柯南家的老意大利料理餐廳(Sys Dialog Act:inform(名稱=柯南家的老意大利料理))
用戶:換一個(User Dialog Act:alter())
機器:我知道那里有一家意大利油潑面餐廳(Sys Dialog Act:inform(名稱=意大利油潑面))
用戶:它家的價格怎么樣?(User Dialog Act:request(價位))
機器:意大利油潑面的價位是普通(Sys Dialog Act:inform(價位=普通))
用戶:就這家吧,幫我預(yù)訂(User Dialog Act:order())
機器:請問有幾個人?(Sys Dialog Act:request(人數(shù)))
用戶:單身狗(User Dialog Act:inform(人數(shù)=1))
機器:真的就1個人嗎?(Sys Dialog Act:confirm(人數(shù)=1))
用戶:是的(User Dialog Act:confirm())
機器:已經(jīng)預(yù)定成功(Sys Dialog Act:order_success())
用戶:好的,再見(User Dialog Act:bye())
機器:再見,歡迎下次使用(Sys Dialog Act:bye())
Dialog Acts 如果是用戶發(fā)起的(User Dialog Act), 那么它是一種處理后的用戶意圖的抽象表達,是一種形式化的意圖描述。
The dialog act expresses an important component of the intention of the speaker (or writer) in saying what they said
系統(tǒng)發(fā)起的行為(Sys Dialog Act),是根據(jù)用戶行為,上下文信息等等綜合得出的, 下一步所要進行的操作的抽象表達,這個抽象表達后續(xù)會送入NLG部件,生成自然語言。
常見的不同意圖有:
用戶的greeting:問好
用戶的inform:用戶提供一個信息,例如想要的餐廳的地址
用戶的request:詢問一個信息,例如當(dāng)前結(jié)果餐廳的電話
用戶的confirm:確認信息正確(例如上一條是機器問你對不對)
用戶的bye:結(jié)束對話
機器的greeting:問好,也可以是自我介紹
機器的inform:提供機器知道的信息,例如當(dāng)前結(jié)果餐廳的信息
機器的request:機器必須有足夠的信息才能完成任務(wù),如果欠缺一些必須信息,例如餐廳地址、口味,則會向用戶詢問
機器的confirm:根用戶確認信息是否正確
機器的bye:結(jié)束對話
上文還出現(xiàn)了一些可能的特殊意圖,例如:
用戶的order:確認訂餐
用戶的alter:更換檢索結(jié)果
系統(tǒng)的order_success:反饋訂餐成功
整個對話系統(tǒng),就是為了完成某個特定任務(wù),這個任務(wù)所需要的特定條件需需要由用戶提供(例如幫助買咖啡需要咖啡品種,熱或冷等信息),當(dāng)信息足夠的時候,機器就能完成相應(yīng)任務(wù)。
這個過程總結(jié)就是:
用戶說了什么 =》
分析用戶意圖 =》
生成系統(tǒng)的對應(yīng)意圖(操作)=》
用戶聽到了系統(tǒng)的反饋 =》
用戶說了什么(第二輪)=》 …………
當(dāng)然根據(jù)任務(wù)復(fù)雜度、和其他系統(tǒng)結(jié)合等等問題, 對話系統(tǒng)本身也有各種的不同準確度與實現(xiàn)方式。
讓機器人陪我,聊天,閑聊(Chit Chat、Chatbot)
聊天機器人往往是沒有一個明確目的,或者目的比較模糊的系統(tǒng)。有別于問答系統(tǒng)和對話系統(tǒng),前兩者的一個期望是用戶盡可能得到信息后離開,快速找到想要的回答或者快速完成任務(wù),是盡可能在減少與用戶的交流時間。而聊天機器人往往設(shè)計上需要盡可能的占用用戶時間,盡可能的延長與用戶聊天、陪伴的時間,或者盡可能的再次讓用戶使用。
聊天機器人本身也可以是有一定目的的,不過是比較寬泛的目的。例如最近融資成功的woebot,它的目的是可以一定程度上跟蹤用戶心理狀態(tài)、幫助用戶調(diào)整自己的心理狀態(tài)等等,有一定程度的心理醫(yī)學(xué)性質(zhì)。
最開始的希望通過圖靈測試的機器人系統(tǒng)都有類似閑聊機器人的特征,例如Eliza(1964),或者Alicebot(1995)。 它們主要通過模板特征實現(xiàn),也就是人工定義對話模板,產(chǎn)生類似智能的效果。
這樣的機器人模板其實可以很多,例如Alicebot有超過六萬條AIML模板來覆蓋絕大部分日常對話。 AIML,即人工智能標記語言,是用來通過定義模板實現(xiàn)機器人(閑聊)的一種方法。
模板方法是機器人相關(guān)實現(xiàn)的最重要的方法(沒有之一),實際上在絕大多數(shù)的對話系統(tǒng)中都依然存在(Siri,小冰),并且在一些學(xué)術(shù)文獻上被證明與其他系統(tǒng)相比依然擁有更好的效果(例如與 Neural Conversation 模型相比)。
與模板方法相對的,是基于深度學(xué)習(xí)的 Neural Conversation 模型,是一種基于神經(jīng)機器翻譯技術(shù)演變而來的對話生成模型。類似機器翻譯,例如一句英文翻譯為一句中文,對話中,上一句對話也可以“翻譯”到下一句對話;類似的還有作詩機,上一句詩“翻譯”出下一句詩。
本質(zhì)是根據(jù)統(tǒng)計學(xué)方法進行的一種文本生成,這種文本生成往往會生成語法正確的句子。 但語義、邏輯、一致話、發(fā)散性等地方會有問題。例如:
人格不一致:
Q:你今年幾歲A:我5歲了Q:你今年多大?A:我馬上就滿18了
語法正確但語義有問題:
發(fā)散性差,本質(zhì)機器傾向于回答簡單又不容易出錯的回答,相當(dāng)于機器學(xué)會了一種投機取巧的方法:
Q:你喜歡我嗎A:我不知道Q:今天天氣不錯A:我不知道Q:你是誰???A:我不知道