使用Botkit和Rasa NLU構建智能聊天機器人

歡迎你們前往雲+社區,獲取更多騰訊海量技術實踐乾貨哦~html

咱們天天都會聽到關於有能力涉及旅遊、社交、法律​​、支持、銷售等領域的新型機器人推出的新聞。根據我最後一次查閱的數據,單單Facebook Messenger就擁有超過11000個機器人,然而到我寫這篇文章的時候,估計又已經增長了幾千臺。第一代的機器人因爲它們只能根據對話中的關鍵字來分析有限的一些問題,所以顯得十分的愚笨。可是隨着像Wit.aiAPI.aiLuis.aiAmazon LexIBM Watson等機器學習服務和NLP天然語言處理(Natural Language Processing)的商品化,促進了像donotpay chatShopper這樣的智能機器人的發展 。git

我不知道機器人這個話題只是炒做仍是真正的付之現實,但我能夠確定地說,構建一個機器人的過程必定是十分有趣而且具備挑戰性的。在這篇文章中,我將向您介紹一些構建智能聊天機器人時所須要的工具。github

文章的標題已經清楚地代表,咱們將使用 BotkitRasa (NLU)來構建咱們的機器人。可是在介紹技術以前,我想先分享一下選擇這兩個平臺的緣由,並解釋它們應該如何適應咱們的用例。web

機器人開發框架

Howdy,Botkit和Microsoft(MS)Bot Framework都是在這方面中很是有力的競爭者。這幾個框架的共同之處在於:正則表達式

  • 它們都是開源的。
  • 它們與當前流行的消息平臺,如Slack,Facebook Messenger,Twilio等都有必定的整合。
  • 它們都有很好的文檔文件。
  • 它們都有活躍的開發者社區。

因爲合規性問題,咱們選擇AWS來部署咱們全部的服務,咱們但願機器人也同樣用AWS來部署。數據庫

NLU天然語言理解(Natural Language Understanding)

API.ai (由Google所持有)和 Wit.ai (由Facebook所持有的)是兩個在機器人行業內流行的NLU工具,也是咱們在這個任務中首先考慮的工具。它們共同的實施方案是:json

  • 它們都被做爲雲服務進行託管。
  • 它們都具備Nodejs,Python SDK和一個REST接口。
  • 它們都有完善的文檔信息。
  • 它們都支持對話狀態或對話上下文的交互理解能力,這使得創建一個對話式的平臺變得更加簡易。

如前所述,因爲合規性的問題,咱們沒法使用任何一個上述的託管解決方案。取而代之的,咱們經過使用一個叫作Rasa的開源的NLU來完美的代替API.ai和Wit.ai,這樣一來,咱們便可以在AWS上對其進行託管和管理了。後端

閱讀至此,您可能會疑惑爲何我使用NLU這個詞來描述Api.ai和Wit.ai這個這兩個工具,而不使用NLP天然語言處理(Natural Language Processing)這個術語來描述。api

其實,NLP是指全部可以與人進行天然交互的系統。這意味着咱們可使用與真人交談的方式來與一個系統進行交流。相反的,NLU只是NLP的一個子領域,它的任務是將未處理過的輸入信號轉化成一種機器可以識別理解而且可以給予反饋的數據結構,這是一項細小的分支可是卻很是複雜。例如當你說出 「日期= 2017年4月20日,地點=舊金山,行動=訂酒店」的時候,系統就能夠理解。bash

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原有的默認操做。

  1. receive 在當Botkit收到一條消息時被調用。它將用戶的消息發送給Rasa,並將」意圖「和」實體「存儲到botkit的 message 對象中。
  2. 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

相關閱讀

神經網絡權重初始化問題

在人工智能領域, 開發人員須要什麼技能?

機器學習教程:最大熵文本分類器

此文已由做者受權雲加社區發佈,轉載請註明文章出處

相關文章
相關標籤/搜索