聊天機器人已經(jīng)有了很多很好的實現(xiàn),比如圖靈機器人箱锐、微軟小冰都非常的智能而且語氣都與人類相似辫呻。但這并不是一件一勞永逸的事情,在特定的場景下問題的回答是有邊界的或者符合特定業(yè)務場景的蚯根,所以還是需要可以按需定制開發(fā)的機器人后众。
chatterBot項目是一個用Python實現(xiàn)聊天機器人的開源項目(作者:Gunther Cox胀糜,github地址),下面介紹下chatterBot的實現(xiàn)方式以及如何在這個項目的基礎上做定制開發(fā):
chatterBot將一個機器人分為input Adapter蒂誉、logic Adapter教藻、storage Adapter、output Adapter以及Trainer模塊右锨。
input Adapter: 這個模塊被設計用來獲取并處理用戶輸入括堤,獲取輸入是指自動從外部獲取輸入,比如從gitter room, twitter等這些都是項目自帶的輸入插件绍移。處理用戶輸入是把獲取到的輸入轉化為可以進行下一步處理的Statement對象悄窃。Statement對象是對用戶輸入的抽象,包含了輸入的text蹂窖,附加信息并提供了序列化轧抗,對比等方法。input Adapter被設計成為插件式的瞬测,所以在實踐當中横媚,我們可以實現(xiàn)自己的input Adapter,比如為每個用戶打上id月趟,這樣輸入就包含了用戶信息灯蝴,在接下來的處理中就可以根據(jù)不同用戶實現(xiàn)不同邏輯了。
logic Adapter: 完成輸入處理后就到了邏輯處理狮斗,這依然是一個插件式的設計绽乔,主進程在啟動時會將用戶定義的所有邏輯處理插件添加到logic context中,然后交MultiLogicAdapter進行處理碳褒,MultiLogicAdapter會依次調用每個logic Adapter折砸,logic Adapter被調用時先執(zhí)行can_process方式判斷輸入是否可以命中這個邏輯處理插件。比如說 "今天天氣怎么樣"顯然需要命中天氣邏輯處理插件沙峻,但時間邏輯處理插件的can_process方法則應該返回False睦授。在命中后logic Adapter要負責計算出對應的回答(也是包裝成Statement對象)以及可信度(confidence),MultiLogicAdapter會取可信度最高的回答摔寨,并進入下一步去枷。項目已經(jīng)自帶了很多l(xiāng)ogic Adapter,有close match是复、close meaning删顶、時間邏輯、數(shù)學邏輯淑廊,甚至還有情感邏輯逗余,大家可以自己探索。在實踐當中季惩,我們還是需要自己定制開發(fā)一些邏輯處理插件录粱,如果我們希望自己的邏輯處理插件優(yōu)先級始終高于自帶的插件腻格,可以提高confidence,自帶的邏輯處理插件返回的confidence最大是1啥繁,只要confidence比1大就是最高優(yōu)先級了菜职。
storage Adapter: 剛才介紹logic Adapter時其實還有一點沒有說明,就是大部分的邏輯處理還是基于訓練集的旗闽,在處理時需要與訓練集做匹配婿滓,所以這個項目將訓練集的持久化也做成了插件式的际跪,自帶的持久化有文件型(json格式)鼻百、mongodb岗照,我們也可以做自己的持久化層蚕钦,比如支持redis亭病,支持mysql。
output Adapter: 這個模塊就不用詳細介紹了嘶居,基本與input Adapter一致罪帖,只是這里處理的是輸出。也是插件式設計邮屁,所以我們也可以定制開發(fā)整袁,比如與騰訊等語音合成服務提供商的接口集成,我們的機器人就可以"開口說話了"佑吝。
Trainer: 這個模塊提供訓練機器人的方法坐昙,自帶的方法有兩種,一種是通過輸入list來訓練芋忿,比如["你好"炸客,"你好啊"],后者是前者的回答戈钢,另一種是通過導入Corpus格式的文件來訓練痹仙。如果這兩種方法都沒有辦法滿足的話,我們還可以寫自己的訓練模塊殉了,但總的來說還是要將最終的訓練集轉換成上述兩種類型开仰。
總結: chatterBot這個項目并不是一個非常完善的聊天機器人項目(如果你希望一安裝就獲得一個話嘮一樣的機器人那就可以放棄了),總的來說自帶的功能有限薪铜,但是這個項目并不簡單众弓,因為項目本身結構非常清晰,又高度插件化隔箍,所以非常適合在此基礎上做定制化開發(fā)谓娃,so 動手吧。