歡迎大家前往雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
我們每天都會聽到關於有能力涉及旅遊、社交、法律、支援、銷售等領域的新型機器人推出的新聞。根據我最後一次查閱的資料,單單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
相關閱讀
此文已由作者授權雲加社群釋出,轉載請註明文章出處;