歡迎大家前往雲+社區,獲取更多騰訊海量技術實踐干貨哦~
我們每天都會聽到關於有能力涉及旅游、社交、法律、支持、銷售等領域的新型機器人推出的新聞。根據我最后一次查閱的數據,單單Facebook Messenger就擁有超過11000個機器人,然而到我寫這篇文章的時候,估計又已經增加了幾千台。第一代的機器人由於它們只能根據對話中的關鍵字來分析有限的一些問題,因此顯得十分的愚笨。但是隨着像Wit.ai, API.ai, Luis.ai, Amazon Lex, IBM Watson等機器學習服務和NLP自然語言處理(Natural Language Processing)的商品化,促進了像donotpay 和 chatShopper這樣的智能機器人的發展 。
我不知道機器人這個話題只是炒作還是真正的付之現實,但我可以肯定地說,構建一個機器人的過程一定是十分有趣並且具有挑戰性的。在這篇文章中,我將向您介紹一些構建智能聊天機器人時所需要的工具。
文章的標題已經清楚地表明,我們將使用 Botkit 和 Rasa (NLU)來構建我們的機器人。但是在介紹技術之前,我想先分享一下選擇這兩個平台的原因,並解釋它們應該如何適應我們的用例。
機器人開發框架
Howdy,Botkit和Microsoft(MS)Bot Framework都是在這方面中非常有力的競爭者。這幾個框架的共同之處在於:
- 它們都是開源的。
- 它們與當前流行的消息平台,如Slack,Facebook Messenger,Twilio等都有一定的整合。
- 它們都有很好的文檔文件。
- 它們都有活躍的開發者社區。
由於合規性問題,我們選擇AWS來部署我們所有的服務,我們希望機器人也一樣用AWS來部署。
NLU自然語言理解(Natural Language Understanding)
API.ai (由Google所持有)和 Wit.ai (由Facebook所持有的)是兩個在機器人行業內流行的NLU工具,也是我們在這個任務中首先考慮的工具。它們共同的實施方案是:
- 它們都被作為雲服務進行托管。
- 它們都具有Nodejs,Python SDK和一個REST接口。
- 它們都有完善的文檔信息。
- 它們都支持對話狀態或對話上下文的交互理解能力,這使得建立一個對話式的平台變得更加簡易。
如前所述,由於合規性的問題,我們無法使用任何一個上述的托管解決方案。取而代之的,我們通過使用一個叫做Rasa的開源的NLU來完美的代替API.ai和Wit.ai,這樣一來,我們便能夠在AWS上對其進行托管和管理了。
閱讀至此,您可能會疑惑為什么我使用NLU這個詞來描述Api.ai和Wit.ai這個這兩個工具,而不使用NLP自然語言處理(Natural Language Processing)這個術語來描述。
其實,NLP是指所有能夠與人進行自然交互的系統。這意味着我們可以使用與真人交談的方式來與一個系統進行交流。相反的,NLU只是NLP的一個子領域,它的任務是將未處理過的輸入信號轉化成一種機器能夠識別理解並且能夠給予反饋的數據結構,這是一項細小的分支但是卻非常復雜。例如當你說出 “日期= 2017年4月20日,地點=舊金山,行動=訂酒店 ”的時候,系統就可以理解。
Rasa NLU
在本節中,我將詳細解釋Rasa NLU,並且提供給你一些你應該熟知的在NLP中常用的術語。
- 意圖: 將用戶的訴求告知機器。
- 例如:提出投訴,要求退款等請求。
- 實體: 提取用戶訴求細節的屬性。
- 例如:與服務中斷、退款等有關的投訴
- 置信度: 一個距離指標,該指標能夠體現出NLU分析出的結果與意圖列表中訴求相差多少。
以下例子能夠幫助你更好的理解上述概念。
輸入:“今天早上我的互聯網一直無法使用。”
- 意圖: 服務中斷
- 實體: “服務=互聯網”, “持續時間=整個上午”
- 置信度:0.84(可能根據個人培訓方式不同而異)
NLU的職責(在本例中是Rasa)是接受一個句子或是陳述,輸出一個能夠被機器人使用的”意圖”,“實體“和“置信度”。Rasa基本上提供了一個在各種NLP和ML庫之上的高層次的API來負責”意圖”的分類和“實體”的提取。這些NLP和ML庫則被稱為后端,是他們使得Rasa變得智能化。以下是一些通常與Rasa一起使用的后端:
- MITIE: 一個包羅萬象的庫; 換言之,它有一個內置的用於”實體”提取的NLP庫以及一個用於”意圖”分類的ML庫。
- spaCy + sklearn: spaCy是一個只進行”實體”提取的NLP庫。而sklearn是與spaCy一起使用的,用於為其添加ML功能來進行”意圖”分類操作。
- MITIE + sklearn: 該組合使用了兩個各自領域里最好的庫。該組合既擁有了MITIE中良好的”實體”識別能力又擁有sklearn中的快速和優秀的”意圖”分類。
我曾使用過MITIE后端來訓練Rasa。在演示部分,我們有一個“在線支持對話機器人”,我們訓練它來解決以下類似消息,如:
- 我的手機無法使用。
- 我的手機沒有開機。
- 我的手機壞了,無法再使用了。
我的訓練數據如下所示:
{ "rasa_nlu_data": { "common_examples": [ { "text": "hi", "intent": "greet", "entities": [] }, { "text": "my phone isn't turning on.", "intent": "device_failure", "entities": [ { "start": 3, "end": 8, "value": "phone", "entity": "device" } ] }, { "text": "my phone is not working.", "intent": "device_failure", "entities": [ { "start": 3, "end": 8, "value": "phone", "entity": "device" } ] }, { "text": "My phone crashed and isn’t working anymore.", "intent": "device_failure", "entities": [ { "start": 3, "end": 8, "value": "phone", "entity": "device" } ] } ] } }
注意:我們觀察到在小的訓練集合中進行實驗時,MITIE比spaCy + sklearn更精確,但是隨着”意圖”集合的不斷增加,MITIE的訓練過程變得越來越慢。對於一個包含約10-15個”意圖”的200多個示例的集合來說,MITIE需要大約35-45分鍾才能在AWS的C4.4xlarge實例(16核,30 GB RAM)上對其訓練完成。
這是一個與MITIE后端訓練Rasa有關的好教程。如果你是一名初學者,那么你可以通過參考此文檔來安裝Rasa。
Botkit和Rasa集成
Botkit 是由Howdy的創建者設計的開源的機器人開發框架 。它基本上提供了一套能夠在Facebook Messenger,Slack,Twilio,Kik和其他流行平台上構建機器人的工具。他們還提供了一款名為Botkit Studio的用於機器人開發的IDE 。總而言之,Botkit是一個可以讓我們只需編寫一次就可以將其部署到多個消息平台上的工具。
Botkit同時也為用於擴展Botkit功能的媒介軟件提供支持。這些媒介軟件提供Botkit與數據庫、CRM、NLU和統計工具的集成接口,使得該框架更加具有可擴展性。這種設計還允許我們通過為其編寫媒介軟件模塊的方式,輕松地添加Botkit與其他工具和軟件集成的能力。
在這個演示中,我集成了Slack和botkit。您可以使用此樣板作為模板來為Botkit設置Slack模塊。在這里我們已經擴展了Botkit-Rasa媒介軟件,你可以在這里找到它們。
Botkit-Rasa有兩個功能:接收和監聽,這兩個功能覆蓋了Botkit原有的默認操作。
receive
在當Botkit收到一條消息時被調用。它將用戶的消息發送給Rasa,並將”意圖“ 和”實體“存儲到botkit的message
對象中。hears
覆蓋了Botkit中原有的“hears
”方法——controller.hears
。 默認的hears
方法使用正則表達式來搜索用戶消息中的給定模式,而來自Botkit-Rasa媒介軟件的”hear”方法則是通過檢索”意圖”來實現。
let Botkit = require('botkit'); let rasa = require('./Middleware/rasa')({rasa_uri: 'http://localhost:5000'}); let controller = Botkit.slackbot({ clientId: process.env.clientId, clientSecret: process.env.clientSecret, scopes: ['bot'], json_file_store: __dirname + '/.db/' }); // 改寫botkit中的接收方法 controller.middleware.receive.use(rasa.receive); // 改寫botkit中的監聽方法 controller.changeEars(function (patterns, message) { return rasa.hears(patterns, message); }); controller.setupWebserver(3000, function (err, webserver) { // 配置一個能夠從slack中獲取webhooks的路徑 controller.createWebhookEndpoints(webserver); });
我們來舉個例子:“我的手機沒有開機。”Rasa會返回以下內容:
- 意圖:設備宕機
- 實體:設備=手機
如果你稍加注意便會發現,我所提供的輸入並不存在於我的訓練檔案中,Rasa內置的智能功能能夠正確的識別這些組合起來的”意圖”和“實體”。
我們需要添加一個hears
方法來監聽設備宕機
這個意圖來處理這個輸入消息。請記住,Rasa返回的”意圖”和”實體”將被媒介軟件儲存在message
對象中。
controller.hears(['device_failure'], 'direct_message,direct_mention,mention', function (bot, message) { let reply = 'Try pressing the power button for 30 seconds. '; reply += 'Bring the phone to the service center if it does not start. '; reply += 'Do not forget to carry your warranty card.'; bot.reply(message, reply); });
你可以通過Slack來運行這個機器人,並且看到如下圖所示的輸出(support_bot是我的機器人的名稱)。

您現在應該已經熟悉如何使用機器人開發框架和NLU來構建對話機器人的過程了。希望這篇文章能夠幫助你更快的開始搭建起你自己的機器人。
翻譯人:KX_WEN,該成員來自雲+社區翻譯社
原文鏈接:https://dzone.com/articles/building-an-intelligent-chatbot-using-botkit-and-r
原文作者:Arjun Hariharan
相關閱讀
此文已由作者授權騰訊雲+技術社區發布,轉載請注明文章出處