0
本文作者: 恒亮 | 2017-04-16 09:51 | 專題:雷峰網(wǎng)公開(kāi)課 |
SuperScript 是一款開(kāi)源的交互式會(huì)話引擎,它帶有弱AI、自然語(yǔ)言理解、簡(jiǎn)單易用和靈活可擴(kuò)展的特點(diǎn)。SuperScript 也是目前開(kāi)源領(lǐng)域內(nèi)最優(yōu)秀的聊天機(jī)器人引擎之一,社區(qū)討論活躍、模塊構(gòu)建合理,受到諸多自然語(yǔ)言處理相關(guān)開(kāi)發(fā)者的追捧。
近日,雷鋒網(wǎng) AI 研習(xí)社有幸邀請(qǐng)到了呤呤英語(yǔ) AI 技術(shù)負(fù)責(zé)人 Hain,他從代碼實(shí)操的角度為我們?cè)敿?xì)介紹了 SuperScript 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。
Hain,Rockq 開(kāi)發(fā)者社區(qū)創(chuàng)始人,呤呤英語(yǔ) AI 技術(shù)負(fù)責(zé)人,曾就職于 IBM 中國(guó)開(kāi)發(fā)中心和創(chuàng)新中心。
Rockq 社區(qū)是 2015 年 5 月在北京建立的分享、學(xué)習(xí)型社區(qū),主要面向 JavaScript 開(kāi)發(fā)者,并拓展到機(jī)器學(xué)習(xí)和虛擬現(xiàn)實(shí)領(lǐng)域。本著“精益創(chuàng)新,竭盡分享”的精神,Rockq 已經(jīng)舉辦過(guò) 30 余次不同內(nèi)容的分享活動(dòng)。呤呤英語(yǔ)是一家兒童英語(yǔ)在線教育服務(wù)公司,有面向兒童的國(guó)際化社交網(wǎng)絡(luò)和高等專業(yè)的外教團(tuán)隊(duì)。從2016年開(kāi)始,Hain 開(kāi)始探索聊天機(jī)器人的商業(yè)機(jī)會(huì),以及如何使用深度學(xué)習(xí)和 NLP 技術(shù)研發(fā)聊天機(jī)器人,目前已經(jīng)推出了兩款聊天機(jī)器人服務(wù),幫助少兒學(xué)習(xí)英語(yǔ)。
以下為本次分享的完整視頻(約 40 分鐘)。
以下是文字版整理:
大家好,我是 Hain,今天我們分享一下關(guān)于會(huì)話交互系統(tǒng) SuperScript 的設(shè)計(jì)與實(shí)現(xiàn)。
首先做一個(gè)簡(jiǎn)單的自我介紹,我曾在 IBM 中國(guó)開(kāi)發(fā)中心和創(chuàng)新中心工作過(guò)四年,后來(lái)又創(chuàng)辦了一個(gè)開(kāi)發(fā)者社區(qū) Rockq,現(xiàn)在在一家英語(yǔ)教育創(chuàng)業(yè)公司呤呤英語(yǔ)做 AI 技術(shù)負(fù)責(zé)人,同時(shí)也是一個(gè)開(kāi)源愛(ài)好者。
這里是我的 Github 地址和主頁(yè)截圖,大家可以看到,左上角是 DeepQA2,使用深度學(xué)習(xí)訓(xùn)練的一個(gè)會(huì)話模型,右上角這個(gè)是用 Node.js 訪問(wèn)科大訊飛的語(yǔ)音識(shí)別的 API,其他還有用 Docker 的技術(shù)來(lái)做 ELK 的 Service 等。同時(shí)我也整理過(guò)一些問(wèn)答的語(yǔ)料,因?yàn)榇蠹叶贾溃褂脵C(jī)器學(xué)習(xí)訓(xùn)練問(wèn)答系統(tǒng)的難點(diǎn)是特征提取,而特征提取的天花板其實(shí)是在于精確的語(yǔ)料。這里我通過(guò)整理 10 萬(wàn)個(gè)問(wèn)答對(duì),得到了 3000 個(gè)精確的問(wèn)答語(yǔ)料。此外我還為一些聊天機(jī)器人平臺(tái)寫(xiě)過(guò) Node.js 的樣例,以及做過(guò) TensorFlow 相關(guān)的入門(mén)教程。
今天我們主要講的內(nèi)容是聊天機(jī)器人對(duì)話引擎,即通過(guò) NLP 的技術(shù)去處理人機(jī)對(duì)話系統(tǒng)。
作為開(kāi)發(fā)者,我們首先要考慮的問(wèn)題是要做一個(gè)什么樣的服務(wù)。根據(jù)我的觀察,在 IT 領(lǐng)域大概每十年就會(huì)有一個(gè)大的改變,包括 1970 年代的主機(jī)系統(tǒng),1980 年代以 Mac 為代表的個(gè)人電腦浪潮,以及 1990 年代的谷歌搜索為代表的互聯(lián)網(wǎng)時(shí)代的到來(lái),到 2000 年代以 iPhone 為代表的手機(jī)移動(dòng)互聯(lián)網(wǎng)的問(wèn)世,還有 2010 年代微信的推出。我們就會(huì)猜想說(shuō)下一個(gè)十年會(huì)出現(xiàn)一個(gè)怎樣的服務(wù),發(fā)生怎樣的改變,讓人們的生活更便捷。我覺(jué)得應(yīng)該是人工智能。而在人工智能里,應(yīng)該有一個(gè)殺手級(jí)的應(yīng)用,我覺(jué)得這個(gè)應(yīng)用是聊天機(jī)器人。
所以從去年 3 月初我就開(kāi)始調(diào)研聊天機(jī)器人的相關(guān)技術(shù),以及它能用在哪些行業(yè),解決什么問(wèn)題。我本人目前是在一家英語(yǔ)教育公司做面向兒童的英語(yǔ)教育機(jī)器人。實(shí)際上這兩年涌現(xiàn)了一大批做聊天機(jī)器人的公司或者組織,其中大公司一般更偏向于做底層,做一些理論研究和平臺(tái)化的服務(wù),而其他小公司和創(chuàng)業(yè)公司則更多的是從應(yīng)用層面出發(fā),解決一些實(shí)際的問(wèn)題。這里我介紹三種比較典型的面向聊天機(jī)器人開(kāi)發(fā)者的平臺(tái)級(jí)服務(wù)。
第一個(gè)是微軟推出的 Botframework,它的主要特點(diǎn)是提供了一個(gè)跨平臺(tái)的連接方案。因?yàn)槲覀兛赡軙?huì)將聊天機(jī)器人的服務(wù)分發(fā)的許多不同的平臺(tái)上,例如對(duì)接自己的 OA 系統(tǒng),對(duì)接到 Telegram,對(duì)接到 facebook messager,或者是通過(guò)短信和郵件的形式與你的機(jī)器人進(jìn)行對(duì)話。這個(gè)是 Botframework 提供的方案。
第二個(gè)是 API.AI,它是硅谷的一個(gè)創(chuàng)業(yè)公司,去年被谷歌收購(gòu),收購(gòu)之后現(xiàn)在主要在做會(huì)話訓(xùn)練、會(huì)話管理,同時(shí)也接入了谷歌的語(yǔ)音識(shí)別方案。它在利用用戶的數(shù)據(jù)進(jìn)行機(jī)器學(xué)習(xí)的訓(xùn)練方面其實(shí)是一個(gè)非常領(lǐng)先的平臺(tái),但是由于一些眾所周知的原因,訪問(wèn)它需要翻墻。其實(shí)我們也調(diào)研過(guò)使用 API.AI 的優(yōu)缺點(diǎn),發(fā)現(xiàn)它更像是一個(gè)做信息助手的平臺(tái),因?yàn)槟闵蟼髁俗约旱男畔⒅?,是由人工去?intent 標(biāo)記,然后派發(fā) action。特別適合于做一些點(diǎn)餐的應(yīng)用、打車(chē)的應(yīng)用和問(wèn)問(wèn)天氣等。這兩年 API.AI 升級(jí)比較大的地方是不同知識(shí)域的會(huì)話,在你自己上傳的數(shù)據(jù)之外,它可以給用戶提供訓(xùn)練好的語(yǔ)言模型,比如一些打車(chē)的服務(wù),直接可以在它的平臺(tái)上調(diào)用。
第三個(gè)是 Telegram Bot Store,它其實(shí)是一個(gè)專門(mén)為開(kāi)發(fā)好的聊天機(jī)器人分發(fā)服務(wù)的地方,在這個(gè)平臺(tái)上可以找到一些非常優(yōu)秀的聊天機(jī)器人,可惜還是要翻墻。我自己體驗(yàn)過(guò)的一個(gè)非常好的聊天機(jī)器人實(shí)際上也是在 Telegram 上找到的,而且這個(gè)機(jī)器人也給了我很大的啟發(fā)。
今天我們主要關(guān)注的是上面這張圖中 Logic 這一部分??梢钥吹?,圖中左邊這個(gè) STT 的主要功能是將語(yǔ)音轉(zhuǎn)換成文字,然后通過(guò) Logic 的服務(wù)對(duì)文字進(jìn)行處理,TTS 這個(gè)部分是將文字轉(zhuǎn)換成語(yǔ)音。目前這個(gè) Logic 其實(shí)更像是一個(gè)弱 AI,它與大家想象中的人工智能其實(shí)還有一定的差距。
從一些公開(kāi)的資料來(lái)看,現(xiàn)在大部分公司的語(yǔ)音助手的實(shí)現(xiàn)方案都如上圖所示。STT 之后會(huì)經(jīng)過(guò)一個(gè) NLU 的模塊,進(jìn)行自然語(yǔ)言的理解。這里 NLP 一般是進(jìn)行一些規(guī)范化的操作,比如識(shí)別一些專有名詞和地名,把主謂賓等一些簡(jiǎn)單的語(yǔ)言結(jié)構(gòu)分析出來(lái),糾正一些常見(jiàn)的語(yǔ)法和拼寫(xiě)錯(cuò)誤,把一些時(shí)態(tài)相關(guān)的詞根分解出來(lái)等。NLU 之后會(huì)進(jìn)入一個(gè) DST 的部分,DST 的全稱是 Dialog State Tracking,也就是聊天狀態(tài)的跟蹤。一般聊天機(jī)器人都會(huì)有自己的處理規(guī)則,而在這個(gè)會(huì)話進(jìn)入系統(tǒng)之后,右側(cè)的 Policy 會(huì)加入影響,來(lái)決定下一步在哪個(gè)地方進(jìn)行處理。DST 處理之后會(huì)進(jìn)入 NLG,也就是自然語(yǔ)言生成,就會(huì)生成一個(gè)新的語(yǔ)句,作為剛剛進(jìn)來(lái)這句話的一個(gè)回復(fù),傳遞給 TTS,生成對(duì)應(yīng)的語(yǔ)音。
一般來(lái)說(shuō)現(xiàn)在的 STT 和 TTS 都有一些很成熟的方案了。我嘗試過(guò)一些 STT 的服務(wù)提供商,包括微軟、IBM 和谷歌的服務(wù)等,國(guó)內(nèi)的話嘗試過(guò)科大訊飛的服務(wù)和云之聲的服務(wù)等?;谶@個(gè)對(duì)比的話,我認(rèn)為谷歌是最準(zhǔn)確的,但其實(shí)也要分具體的場(chǎng)景,比如普通話、英語(yǔ)還是粵語(yǔ)等,但總體上我認(rèn)為谷歌的技術(shù)是最領(lǐng)先的。但由于防火墻和其他一些原因,其實(shí)綜合考慮選擇科大訊飛是比較合適的。而 TTS 我認(rèn)為做的比較好的是 IBM 的服務(wù)。
剛才也提到了,整體上這套系統(tǒng)是一個(gè)弱的 AI,其實(shí)你也可以叫它“人工智障”。從長(zhǎng)遠(yuǎn)的角度來(lái)看的話,它其實(shí)還需要一個(gè)長(zhǎng)期的發(fā)展,讓它變得更加智能。如果我們現(xiàn)在去體驗(yàn)一些已有的聊天機(jī)器人,包括微軟的小冰和百度的度秘,你會(huì)發(fā)現(xiàn)其實(shí)很多的回答都是通過(guò)搜索引擎的搜索獲得的,有的時(shí)候還會(huì)給我們返回多條記錄,這一點(diǎn)其實(shí)非常不智能。
在公司里一般都會(huì)將上面提到的 NLU、DST 和 NLG 等部分再細(xì)分為好多模塊,每個(gè)模塊都有專門(mén)的團(tuán)隊(duì)負(fù)責(zé)維護(hù)。而像我們這些創(chuàng)業(yè)公司來(lái)說(shuō),一般都只有一些小的團(tuán)隊(duì)來(lái)做,沒(méi)有足夠的資源去細(xì)分這么多模塊,因此我們就更偏向于去借助一些開(kāi)源的項(xiàng)目。我們現(xiàn)在的實(shí)現(xiàn)方案是如下這張圖。
從圖中可以看到,最上面是一些微信小程序、微信公眾號(hào)等一些即時(shí)的通信服務(wù),然后下面是 Inbound Message,也就是用戶發(fā)給聊天機(jī)器人的消息,然后再下面是 Bot Engine 即處理模塊,這是我們今天要講的重點(diǎn)。這個(gè) Bot Engine 會(huì)負(fù)責(zé)分析這個(gè)語(yǔ)句,包括里面的概念和命名,而且它也有規(guī)則引擎,它會(huì)有一些 Trigger 和回復(fù),開(kāi)場(chǎng)白等。這些會(huì)被定義在 Topic 里面,也就是 Bot 可以跟用戶交流的主題,這里主題又可以有許多類(lèi),比如打車(chē)、餐廳等。而整個(gè) Bot Engine 還可以連接 Knowledge Graphics 做知識(shí)圖譜,將來(lái)還可以在知識(shí)圖譜里做更多智能化的查詢和推理等。這里我們將 Bot 的知識(shí)分為三種類(lèi)型,一種是 World Knowledge,即外部世界的知識(shí),另一個(gè)是 User Knowledge,即用戶跟 Bot 聊天結(jié)束后積累下來(lái)的知識(shí),最后就是 Bot Knowledge,即 Bot 自己的知識(shí)。
整體上講,Bot Engine 是一個(gè)承上啟下的關(guān)系,它需要有一個(gè)非常靈活的解決方案。而且因?yàn)榱奶鞕C(jī)器人是一個(gè)集大成的服務(wù),比如這個(gè) Bot Engine 可能要連接到知識(shí)圖譜的服務(wù)和搜索引擎等其他的服務(wù),所以它是一個(gè)類(lèi)似于中控一樣的平臺(tái)。當(dāng)我們寫(xiě)的一些 Topic 沒(méi)有命中用戶想要聊的一些主題,也就是沒(méi)有辦法去回答一些問(wèn)題的時(shí)候,我們就可以借助于深度學(xué)習(xí)。
深度學(xué)習(xí)是在這個(gè)圖的最下面,叫做 Bot Model。Bot Model 其實(shí)是一個(gè)語(yǔ)言模型,我們通過(guò)算法和數(shù)據(jù)注入這個(gè)深度學(xué)習(xí)框架里,經(jīng)過(guò)框架的運(yùn)行,結(jié)果就會(huì)給我們輸出一個(gè)模型。我們問(wèn)模型一些問(wèn)題,之后這個(gè)模型就會(huì)預(yù)測(cè)出這個(gè)回答可能是什么樣的。實(shí)際上這里我們嘗試過(guò)用 TensorFlow,使用了其中的 seq2seq 模型,加上我們自己的語(yǔ)料,結(jié)果發(fā)現(xiàn)效果還是不錯(cuò)的。所以我認(rèn)為,在接下來(lái)的一段時(shí)間里,嘗試去積累質(zhì)量更高更多的語(yǔ)料,應(yīng)該是接下來(lái)工作的重點(diǎn),因?yàn)閿?shù)據(jù)是特征提取的天花板,而特征提取是深度學(xué)習(xí)智能化程度的天花板。
現(xiàn)在關(guān)于用深度學(xué)習(xí)來(lái)做 Bot Model 的訓(xùn)練其實(shí)有非常多的算法,包括增強(qiáng)學(xué)習(xí)和生成對(duì)抗網(wǎng)絡(luò)等。在我們這張圖中,左邊這條線的意思是說(shuō)如果我們能在 Bot Engine 里面標(biāo)注一些非常好的高質(zhì)量的對(duì)話,那么就能進(jìn)入我們訓(xùn)練好的模型,做一個(gè)增強(qiáng)學(xué)習(xí)。
整個(gè)圖實(shí)際上就是我們現(xiàn)在正在努力實(shí)現(xiàn)的一個(gè)愿景。基于這張圖我們其實(shí)做了許多關(guān)于 Bot Engine 的嘗試,因?yàn)樗鼘?shí)際上是一個(gè)相當(dāng)于中控的地方。下面我們進(jìn)入今天的正題,即如何實(shí)現(xiàn)一個(gè) SuperScript 會(huì)話系統(tǒng)。
SuperScript 是 2014 年中旬左右由幾個(gè)開(kāi)源愛(ài)好者做的一個(gè)開(kāi)源項(xiàng)目,當(dāng)時(shí)它就提出來(lái)要做一個(gè) conversational UI 的理念,它其實(shí)借鑒了之前的 RiveScript 和 ChatScript 這兩個(gè)項(xiàng)目,另外它的主要作者貢獻(xiàn)了許多在 Node.js 里面使用 NLP 的 package。這兩年根據(jù)我自己的比較,SuperScript 在 Node.js 領(lǐng)域,或者在我調(diào)研對(duì)比的 200 多個(gè)聊天機(jī)器人的開(kāi)源項(xiàng)目里,SuperScript 應(yīng)該是做的最好的一個(gè)平臺(tái)。SuperScript 的使用其實(shí)非常簡(jiǎn)單,在 Linux 平臺(tái)使用 npm 命令安裝之后,其實(shí)就可以嵌入代碼使用了。
這里需要強(qiáng)調(diào)的是,SuperScript 其實(shí)不是一個(gè)研究性非常強(qiáng)的項(xiàng)目,它更偏向于去實(shí)現(xiàn)一個(gè)應(yīng)用,它更是一個(gè) development technology。
SuperScript 為用戶開(kāi)放的其實(shí)是非常簡(jiǎn)單的接口,當(dāng)我們使用它的服務(wù)是這樣的幾行代碼,就可以 setup 一個(gè)服務(wù)。比如說(shuō)下圖中的代碼,我們?cè)诘谝坏降诙形覀円昧?SuperScript 并聲明了一個(gè) Bot,然后在第三行對(duì) SuperScript 進(jìn)行了一些配置。在第七行我們得到了一個(gè) botInstance,這個(gè) botInstance 包含了兩個(gè)核心的接口,一個(gè)是 reply,另一個(gè)是 directReply。當(dāng)我們想和這個(gè) Bot 對(duì)話時(shí)首先要傳入用戶的 ID,以及對(duì)話內(nèi)容,然后就會(huì)通過(guò) Reply 得到回復(fù)。而當(dāng)我們有明確的想要聊的話題時(shí),比如 hello 是屬于 greetings 類(lèi)別,這時(shí)就可以使用 directReply 接口,直接傳入類(lèi)別信息,然后取得回復(fù)。
下面是在 SuperScript 中生成 Topic 的過(guò)程,這里和之前的 RiveScript 和 ChatScript 其實(shí)是很相似的。圖中展示的是通過(guò)腳本來(lái)生成對(duì)話,我個(gè)人在這里非常推薦這種方式。因?yàn)楝F(xiàn)在很多像 Botframework 這樣的聊天機(jī)器人的平臺(tái),幾乎都要求一定的編程能力,想要實(shí)現(xiàn)一個(gè)對(duì)話能力,就要寫(xiě)好多代碼,而且還要調(diào)試,對(duì)開(kāi)發(fā)者以外的人來(lái)說(shuō)有一定難度。但是 SuperScript 采用的這種方式很簡(jiǎn)單,對(duì)開(kāi)發(fā)者或者其他熟悉業(yè)務(wù)的人員來(lái)說(shuō)都非常友好。
這里先要寫(xiě)一個(gè) SS 文件,它有特殊的語(yǔ)法,使用前需要用自帶的解析工具對(duì)文件進(jìn)行編譯,生成 data.json 文件。而這個(gè) data.json 中就包括了會(huì)話中包括了哪些談話、開(kāi)場(chǎng)白和回復(fù)等。而在今年 1 月份發(fā)布的 SuperScript 最新版本 V1 當(dāng)中,這個(gè)編譯工具比上一個(gè)穩(wěn)定版快了上百倍。這是因?yàn)樗捎昧艘粋€(gè)全新的語(yǔ)法生成器。
簡(jiǎn)單地說(shuō),用 SuperScript 來(lái)寫(xiě)對(duì)話的語(yǔ)法主要有方式有上面這幾點(diǎn)。第一個(gè)是定義一個(gè) Gambit 作為開(kāi)場(chǎng),也就是下圖中加號(hào)后面的部分,用戶輸入“i go by bus/train/car”中的任何一句,都會(huì)命中這條規(guī)則。
第二個(gè)也可以寫(xiě)一個(gè)正則表達(dá)式,例如下面的“hello *2”,表示如果用戶輸入 hello 后面再加一個(gè)兩個(gè)單詞的人名,也會(huì)命中這條規(guī)則。
第三個(gè)是在 Gambit 中定義兩個(gè)字符串,然后在 Reply 中做回復(fù)。例如圖中的“*1 is taller than *2”就定義了包括兩個(gè)字符串的 Gambit,如果用戶的輸入符合這個(gè) Gambit,則系統(tǒng)就會(huì)回復(fù)減號(hào)后面的那句話,其中 cap1 用 *1 代替,cap2 用 *2 代替。
另外 SuperScript 還支持多個(gè)回復(fù),且系統(tǒng)會(huì)根據(jù)用戶設(shè)置選擇其中的一個(gè)回復(fù)。例如上圖第四個(gè)例子,當(dāng)用戶多次輸入符合 Hello 正則表達(dá)式的語(yǔ)句之后,系統(tǒng)就會(huì)保留 keep 后面的語(yǔ)句,在其他場(chǎng)景下再次發(fā)送 。
我們看一個(gè)聊天機(jī)器人的智能程度,主要是看它處理上下文和帶有關(guān)聯(lián)關(guān)系的對(duì)話的能力。SuperScript 在這方面也做了許多優(yōu)化。如上圖所示,Bot 問(wèn)了一個(gè)問(wèn)題說(shuō)你叫什么名字,這時(shí)代碼就會(huì)走到下面第 2 部分,根據(jù)用戶回答的名字通過(guò) % 符號(hào)又定義了一個(gè)新的規(guī)則,用來(lái)承接上面的問(wèn)題,用戶回答后才能進(jìn)入下面的流程,即根據(jù)回答又問(wèn)了 first name 是什么。如果說(shuō)還要接著進(jìn)行會(huì)話,則還可以根據(jù)上一次的回復(fù)為基礎(chǔ)問(wèn)更多的問(wèn)題。比如這里問(wèn) first name 是不是剛剛的那個(gè)回復(fù),回答如果是 yes,則回復(fù) ok。而如果回復(fù)不是 yes,則會(huì)進(jìn)入第 4 部分代碼,返回重新開(kāi)始對(duì)話的相關(guān)語(yǔ)句。
整個(gè)看起來(lái),SuperScript 所支持的會(huì)話就是通過(guò)對(duì)應(yīng)的 % 來(lái)找到對(duì)話中上下文的位置,然后進(jìn)行對(duì)應(yīng)的回復(fù)。這里需要強(qiáng)調(diào)的是,代碼中的縮進(jìn)并不影響執(zhí)行,只是為了便于閱讀。
下面講一些更復(fù)雜的內(nèi)容。在我們寫(xiě) reply 的時(shí)候其實(shí)是可以加入一些復(fù)雜的句式的,也就是函數(shù)。比如調(diào)用外面的系統(tǒng)獲取天氣信息,那么就可以像下圖這樣采用角標(biāo)加函數(shù)名的形式(getWeather函數(shù))調(diào)用相關(guān)函數(shù)。具體函數(shù)的定義就如圖中下面的部分所示,這里演示的是一些 JavaScript 的代碼。在 SuperScript 啟動(dòng)的時(shí)候,用戶可以選擇 load 一些事先寫(xiě)好的 JavaScript 代碼。相信大家也可以看到,這里展示的天氣查詢實(shí)際上是通過(guò)函數(shù)回調(diào)的方式處理的。
另外,在 SuperScript 中通過(guò)一條語(yǔ)句也能調(diào)用多個(gè)函數(shù),例如“+ It is ^fun1 and ^fun2” 這條語(yǔ)句中,就同時(shí)調(diào)用了 fun1 和 fun2 兩個(gè)函數(shù)。
同時(shí) SuperScript 也支持嵌套函數(shù)的調(diào)用,如下圖所示。
作為一個(gè) Node.js 的環(huán)境,SuperScript 還支持導(dǎo)入各種 Node.js 的包和模型。另外,在書(shū)寫(xiě)一個(gè) plugin 的時(shí)候,SuperScript 環(huán)境本身為函數(shù)提供了豐富的功能,如下圖所示。我們可以用 this.message 應(yīng)用用戶所說(shuō)的話,用 this.user 查詢用戶消息或者通話記錄,用 this.user.memory 引用 SuperScript 內(nèi)置的知識(shí)圖譜圖數(shù)據(jù)庫(kù)等。
除了自己寫(xiě)函數(shù)之外,SuperScript 還內(nèi)置了一些實(shí)現(xiàn)好的函數(shù)供開(kāi)發(fā)者直接調(diào)用。例如下圖所示的 topicRedirect 函數(shù),用來(lái)在不同的 topic 之間靈活跳轉(zhuǎn)。
下面講一下知識(shí)圖譜的部分。這里我們講的知識(shí)圖譜其實(shí)可以理解為我們?yōu)橛脩艚⒌囊粋€(gè)畫(huà)像,建立的用戶和用戶之間的關(guān)系。例如我們可以記錄用戶的大學(xué)專業(yè)、生日和喜歡的電影等個(gè)人信息,其實(shí)從數(shù)據(jù)結(jié)構(gòu)來(lái)說(shuō)很像是一個(gè)圖,在聊天機(jī)器人里面得到了廣泛使用,因?yàn)橄鄬?duì)便于分析和查詢。
從下面圖中右側(cè)的部分我們可以看到 SuperScript 中對(duì)知識(shí)圖譜的使用。系統(tǒng)會(huì)為每個(gè)用戶單獨(dú)建立一個(gè) memory,Bot 引擎也有自己的 memory,它們共同的參照是一個(gè)上文提到的 World Knowledge,即通用知識(shí)。而遍歷、生成、查詢和使用這些知識(shí)的過(guò)程,就會(huì)使用一些 plugin,例如上面提到的 this.user.memory 對(duì)應(yīng)當(dāng)前用戶自己的 memory 空間,this.botfacts 表示 Bot 的空間等。這些空間的結(jié)構(gòu)大約由三個(gè)部分組成:subject 名稱,predict 關(guān)系,以及 object 實(shí)體。
講完 SuperScript 的具體工作方式之后,我們下面講一講它底層具體是怎么實(shí)現(xiàn)的。通過(guò)分析源碼我們發(fā)現(xiàn),系統(tǒng)解析了腳本之后會(huì)生成 data.jason 文件,而 data.jason 文件其實(shí)是一個(gè)面向?qū)ο蟮哪P?。因?yàn)槲覀冊(cè)诰帉?xiě)腳本的時(shí)候其實(shí)思路是面向過(guò)程的,比如先說(shuō)了什么,然后回復(fù)什么,然后又說(shuō)了什么,等等。但是 SuperScript 在執(zhí)行時(shí)其實(shí)是面向?qū)ο蟮?,因此要首先解析?data.jason。
如下圖所示,首先我們是定義了一個(gè) topic,topic 對(duì)應(yīng)了很多屬性,然后是開(kāi)場(chǎng) gambit,一個(gè) topic 還會(huì)定義若干個(gè)開(kāi)場(chǎng),gambit 也有一些屬性,例如 filter 和 trigger 等,filter 就是上文提到的 % 后面的部分,而 trigger 就是正則表達(dá)式一類(lèi)的觸發(fā)條件。一個(gè)開(kāi)場(chǎng) gambit 被命中以后,它會(huì)從內(nèi)部包含的若干個(gè) reply 里面的檢索出條件最符合的發(fā)送出去,這里 reply 也包含了 filter 和 keep 等這些屬性。而每個(gè) reply 反過(guò)來(lái)又包含了若干個(gè) gambit,系統(tǒng)不斷地處于等待回復(fù)和下一個(gè)開(kāi)場(chǎng)之間,這樣一來(lái)就形成了會(huì)話。
另一個(gè)比較重要的內(nèi)容是 ss-message,如下圖所示,這里 ss-message 主要是處理了一些規(guī)范化輸入、取詞根、加入日期、判定問(wèn)題和命名標(biāo)識(shí)一類(lèi)的操作。這些都得益于開(kāi)源社區(qū)許多開(kāi)發(fā)者所做的貢獻(xiàn),而底層則依賴于許多學(xué)術(shù)和社區(qū)提供的服務(wù),例如 WordNet 和 ConceptNet 等。
到這里,Bot 雖然能根據(jù)用戶的問(wèn)題回復(fù)信息,但其實(shí) Bot 回復(fù)的信息還是和自然語(yǔ)言有一定差距的,這里就需要有一個(gè) Normalize 的過(guò)程。比如說(shuō),用戶輸入的是一個(gè) emoji 表情,那么系統(tǒng)應(yīng)該能識(shí)別出這個(gè)表情是微笑還是生氣,這些功能都需要 Normalize。在 SuperScript 最新發(fā)布的 V1 版本中,最新發(fā)布了 bot-lang 這個(gè)模塊,其實(shí)也是開(kāi)源社區(qū)的支持。它的主要功能就是實(shí)現(xiàn)這里的 Normalize 的過(guò)程。
另外就是如何建立知識(shí)譜圖了,SuperScript 內(nèi)置使用的是 LevelDB 支持這部分功能,它的速度非常快。如下圖所示,在 SuperScript 中主要通過(guò) sfacts 模塊來(lái)實(shí)現(xiàn)。sfacts 提供了創(chuàng)建 DB 和加載 DB 的方法,同時(shí)它也允許用戶創(chuàng)建自己的 concept,創(chuàng)建自己的 DB 等一系列操作。
有時(shí)候我們需要在自己的聊天系統(tǒng)里創(chuàng)建 concept,例如商品的種類(lèi),當(dāng)用戶的輸入匹配上某一種商品之后,我需要將流程導(dǎo)入到介紹相關(guān)產(chǎn)品或者下單的對(duì)話流程中去。而這些功能在工具里是沒(méi)有的,需要我們自己實(shí)現(xiàn)。
在 SuperScript 里加載自己定義的 concept 可以分為如下圖所示的三步。
第一步是創(chuàng)建一個(gè) concept 文件,也就是聲明一下名稱和其中包含了哪些子類(lèi)。
第二步是在通過(guò)解析工具生成 data.jason 文件的時(shí)候,需要引用第一步中聲明的 concept 文件。
第三步是在啟動(dòng) SuperScript 服務(wù)的時(shí)候要加載 concept 文件。
這就是加載自己定義的 concept 的過(guò)程。
另外一個(gè) SuperScript 的核心,也是它與 RiveScript 和 ChatScript 等其他工具一個(gè)最大的不同,就是它實(shí)現(xiàn)了一種算法,即怎樣從 topic 棧中獲取答案的算法。如下圖所示,算法的核心就是按照從左到右的語(yǔ)料庫(kù)順序依次排查,最左邊的優(yōu)先級(jí)最高,最右邊的優(yōu)先級(jí)最低。當(dāng)收到用戶的問(wèn)話時(shí),系統(tǒng)會(huì)首先在 pre 標(biāo)簽的 topic 中找尋 reply,如果沒(méi)有找到,則系統(tǒng)會(huì)通過(guò) last reply 中獲取的當(dāng)前聊天的會(huì)話,從當(dāng)前會(huì)話中搜索 reply,如果還沒(méi)有找到,則系統(tǒng)會(huì)通過(guò) TF-IDF 在以往聊天歷史中做一個(gè)詞頻排序查找,如果還是沒(méi)有找到,則會(huì)跳到一些沒(méi)有聊過(guò)的非系統(tǒng) topic 中查找,最后,如果這些都沒(méi)有找到,就會(huì)從 post 標(biāo)簽的 topic 中找尋。需要注意的是,這里 pre 和 post 標(biāo)簽都是系統(tǒng)規(guī)定的,但那內(nèi)容需要用戶自己實(shí)現(xiàn)。
在 SuperScript 最新發(fā)布的 V1 版本中,它的 get reply 接口要比之前的老版本快數(shù)十倍。除此之外,在 V1 版本中,還有其他一些重大變化,具體如下圖所示。
首先是這個(gè) FactSystem 以前用的是 LevelDB,它會(huì)在系統(tǒng)中產(chǎn)生一些 disk 文件,這個(gè)其實(shí)是不利于應(yīng)用的,因?yàn)檫@個(gè)文件系統(tǒng)有寫(xiě)進(jìn)程的鎖,導(dǎo)致 SuperScript 只能是單實(shí)例的。但是在 V1 版本中,上層依然使用的是 LevelDB 的接口,但是下層它將數(shù)據(jù)都存儲(chǔ)到了 MongoDB 里。這個(gè)過(guò)程就會(huì)讓 SuperScript 相比過(guò)去有更好的延展性,在生產(chǎn)環(huán)境中這個(gè)意義是非常重大的。
第二個(gè)是開(kāi)始支持多租戶的形式,以前 SuperScript 只有單實(shí)例,同時(shí)也只有一個(gè) personality,就只能跑一個(gè)服務(wù)。
第三個(gè)是新版本使用了 ES6,使用 babel 編譯。這樣讓 SuperScript 兼容更多的新語(yǔ)言特性,同時(shí)也可能是許多接口速度大幅提升的原因。
作為國(guó)外的一個(gè)開(kāi)源項(xiàng)目,其實(shí) SuperScript 本身是不會(huì)考慮支持中文的。這一點(diǎn)對(duì)于我和其他關(guān)注 SuperScript 的國(guó)內(nèi)開(kāi)發(fā)者而言,是一個(gè)亟需解決的問(wèn)題。
其實(shí)在 SuperScript 的社區(qū)討論組里可以看到,相關(guān)的技術(shù)討論還是非?;钴S的,有很多人參與。雖然官方?jīng)]有公布具體有哪些用戶在使用 SuperScript,但通過(guò)官方討論組可以看到它的用戶目前有幾百人。
隨著未來(lái)聊天機(jī)器人的越來(lái)越流行,我相信 SuperScript 會(huì)越來(lái)越流行,越來(lái)越引起大家的關(guān)注。
最后在這里分享一個(gè)我自己做的網(wǎng)站:http://blog.chatbot.io/ 里面記錄了一些我的工作總結(jié),類(lèi)似 SuperScript 這樣的框架調(diào)研結(jié)果,以及關(guān)于深度學(xué)習(xí)算法層面的東西。
謝謝大家。
問(wèn)題1:目前國(guó)內(nèi)公司的交互會(huì)話系統(tǒng)和谷歌、微軟等國(guó)外公司相比,差距有多大?
基于去年做的一些調(diào)研,國(guó)內(nèi)的聊天機(jī)器人在客服、導(dǎo)購(gòu)、老人小孩陪伴上都有嘗試,偏應(yīng)用層面,比如助理來(lái)也和出門(mén)問(wèn)問(wèn),在聊了一些之后,甚至?xí)D(zhuǎn)人工服務(wù)。而國(guó)內(nèi)的大公司,前幾年并沒(méi)有發(fā)力,百度做了很多工作。我也關(guān)注今年騰訊的AI Lab也開(kāi)始大量招并買(mǎi)馬。相對(duì)國(guó)外來(lái)說(shuō),起步較晚。
而國(guó)內(nèi)的開(kāi)源領(lǐng)域和研究機(jī)構(gòu),也不比國(guó)外活躍。在硅谷涌現(xiàn)了一些新的服務(wù)比如dashbot.io, kitt.ai, qnamarker.ai,api.ai,在國(guó)內(nèi)還沒(méi)有看到特別好的copy。而且國(guó)外的開(kāi)放語(yǔ)料比較豐富,由政府出面做了很多數(shù)據(jù)開(kāi)放運(yùn)動(dòng),包括dbpedia, wordnet, concept, imagenet都建立起來(lái)了。
做為一個(gè)開(kāi)發(fā)聊天機(jī)器人的開(kāi)發(fā)者,我覺(jué)得國(guó)外的工具比較多,國(guó)內(nèi)還很欠缺,所以,我主要關(guān)注英語(yǔ)教育的聊天機(jī)器人。
問(wèn)題2:能不能講一下詞庫(kù)的設(shè)計(jì)思路?
我們還沒(méi)有建設(shè)自己的詞庫(kù),目前分詞使用了開(kāi)源領(lǐng)域的庫(kù),我們對(duì)于新詞的識(shí)別還是次要的,因?yàn)槭歉鶕?jù)美國(guó)小學(xué)課程設(shè)立的會(huì)話內(nèi)容。我們主要是處理chglish,目前也是通過(guò)常見(jiàn)的拼寫(xiě)錯(cuò)誤識(shí)別方法和人工制作列表的方式進(jìn)行。長(zhǎng)遠(yuǎn)的角度來(lái)講,我們希望積累到大量的數(shù)據(jù),然后通過(guò)機(jī)器學(xué)習(xí)的方式來(lái)解決。
問(wèn)題3:SuperScript 引擎的未來(lái)發(fā)展如何?
會(huì)對(duì)創(chuàng)業(yè)公司很有吸引力,包括集成Facebook Messager, Slack, Amazon Echo這樣的IM和硬件,SuperScript是很靈活和有優(yōu)勢(shì)的,目前社區(qū)也相比其他對(duì)話引擎活躍,我覺(jué)得它會(huì)成為開(kāi)源領(lǐng)域最流行的聊天機(jī)器人對(duì)話引擎。
問(wèn)題4:人機(jī)對(duì)話中,可控性和智能型如何平衡?
我覺(jué)得現(xiàn)在開(kāi)發(fā)機(jī)器人,主要由兩個(gè)部分組成:基于規(guī)則的檢索式的部分 + 基于機(jī)器學(xué)習(xí)的生成式的部分。而基于規(guī)則的部分,是開(kāi)發(fā)者的可控性很強(qiáng)的,而基于機(jī)器學(xué)習(xí)的部分,得到的回復(fù)會(huì)超出人的解釋范疇,帶有數(shù)學(xué)的隨機(jī)特點(diǎn)。在我們的對(duì)話中,更傾向于對(duì)話包含知識(shí),因?yàn)槭敲嫦蚪逃?,所以,基于檢索的部分多一些,在基于檢索的系統(tǒng)中得不到好的答案,在進(jìn)入機(jī)器學(xué)習(xí)的語(yǔ)言模型獲取答案。這樣整體上,就可以回答用戶的任何問(wèn)題,而且效果看上去還不錯(cuò)。
所以,可控性帶來(lái)更多的商業(yè)機(jī)會(huì),比如個(gè)人信息助手,而智能型的可以帶來(lái)更多的樂(lè)趣,比如閑聊解悶。而像api.ai這樣的服務(wù),通過(guò)人工標(biāo)注 -> 意圖識(shí)別 -> 派發(fā)行為這樣的系統(tǒng),是帶有更多可控性的,可以作為開(kāi)發(fā)個(gè)人信息助手的選擇。而像tuling123的服務(wù),是帶有更多智能效果的,可以作為開(kāi)發(fā)閑聊機(jī)器人的選擇。當(dāng)?shù)谌降姆?wù)不能滿足需求,或者自己的技術(shù)團(tuán)隊(duì)很棒的話,可以使用像SuperScript + Language Model這樣的方式開(kāi)發(fā)自己的聊天機(jī)器人。在調(diào)研了很多第三方服務(wù)之后,SuperScript 讓我放棄了使用Botframework, TensorFlow讓我放棄了使用api.ai.
問(wèn)題5:像這種聊天機(jī)器人,體積通常較小,比較便攜,感覺(jué)是不是可以在戶外也使用,小朋友出門(mén)也想帶著“朋友”一起出門(mén)的話,這一塊有沒(méi)有對(duì)應(yīng)的應(yīng)用場(chǎng)景分析過(guò)?
我見(jiàn)到過(guò)幾款這樣的智能硬件,外向像個(gè)蛋蛋,價(jià)格在七八百塊,創(chuàng)業(yè)公司在做,360也在做,甚至做成手表,可以使用語(yǔ)音對(duì)話,它可以講故事。其實(shí)里面就是運(yùn)行android系統(tǒng),加上應(yīng)用。除了對(duì)話能體現(xiàn)出智能,其他部分沒(méi)有技術(shù)壁壘。市場(chǎng)也很接受,我覺(jué)得挺好的,但是怎么提高更多價(jià)值呢?不能就賣(mài)硬件吧?我也思考過(guò)很多場(chǎng)景,我覺(jué)得這里的機(jī)會(huì)非常多。
比如面向由自閉癥,孤寡老人,兒童,都會(huì)帶來(lái)價(jià)值。但我覺(jué)得聊天機(jī)器人最好的入口還是VR或者AR。因?yàn)檫@樣有更強(qiáng)的代入感,會(huì)作出用戶更喜歡的產(chǎn)品。
我去年也體驗(yàn)了很多設(shè)備,Hololens、Rift、Vive、主動(dòng)式,被動(dòng)式的VR設(shè)備,玩過(guò)賽車(chē)、射擊等游戲。我覺(jué)得像HoloLens這樣的設(shè)備,搭載聊天機(jī)器人會(huì)成為劃時(shí)代的產(chǎn)品,入口已經(jīng)不愁了,主要是聊天機(jī)器人的智能程度。
問(wèn)題6:虛擬機(jī)器人和實(shí)體機(jī)器人哪個(gè)更可能成為機(jī)器人的主流趨勢(shì)?會(huì)有什么優(yōu)勢(shì)?
二者的性質(zhì)不一樣,我更相信實(shí)物機(jī)器人會(huì)取代工廠生產(chǎn)線上的工人,虛擬機(jī)器人會(huì)取代呼叫中心的客服。不論何種機(jī)器人,自然語(yǔ)言處理,對(duì)話和意圖識(shí)別,都會(huì)讓這些機(jī)器人更能按照人的意愿行事。
我覺(jué)得虛擬機(jī)器人的智能程度會(huì)更高一些,會(huì)更流行。因?yàn)樘摂M機(jī)器人設(shè)定場(chǎng)景可能更便于機(jī)器人做判斷。
問(wèn)題7:目前聊天機(jī)器人在上下文聯(lián)系問(wèn)答上到底是個(gè)什么樣的水平?
關(guān)于上下文關(guān)聯(lián),從算法層面,要考慮在語(yǔ)言模型訓(xùn)練時(shí)候,注入下面的數(shù)據(jù):P - Personality matrix, U - User Relationship with Bot 以及 L - Lexicon。我也查找了相關(guān)的論文。這個(gè)處于前沿的探索階段,我還不知道從算法層面上解決這些的成功案例。2015年, seq2seq 模型出現(xiàn),而seq2seq的衍生模型,Seq2Seq attention/Seq2seqGAN 處理其實(shí)還是單論對(duì)話,訓(xùn)練長(zhǎng)度也有限,語(yǔ)句長(zhǎng)度越長(zhǎng),系統(tǒng)越難調(diào)。而從工程角度上看,開(kāi)發(fā)技術(shù)一般是考慮建立bot的系統(tǒng)畫(huà)像以及用戶的畫(huà)像,對(duì)話對(duì)上下文的分析也會(huì)限制在一個(gè)時(shí)間窗內(nèi)。
比如SuperScript對(duì)上下文的分析就是開(kāi)發(fā)者可以配置的,默認(rèn)情況下,SuperScript在檢索回復(fù)的時(shí)候,會(huì)考慮過(guò)去5分鐘內(nèi),用戶說(shuō)的最近的10句話。
我覺(jué)得這里還需要融合更多的技術(shù),比如建立知識(shí)圖譜和搜索引擎,然后在superscript的上下文,有更多的查詢能力。大家也可以去體驗(yàn)一下微軟的小冰,google的allo和百度度秘。作為大廠的服務(wù),這些應(yīng)該具有說(shuō)明意義。上下文關(guān)聯(lián),是一個(gè)很大的挑戰(zhàn)。
雷鋒網(wǎng)(公眾號(hào):雷鋒網(wǎng))相關(guān)閱讀:
聊天機(jī)器人之熱(一):微軟、Facebook、亞馬遜等巨頭為何押下重注
如何讓人類(lèi)上癮 淺談聊天機(jī)器人抓住用戶的藝術(shù)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。