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