使用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

相关阅读

神经网络权重初始化问题

在人工智能领域, 开发人员须要什么技能?

机器学习教程:最大熵文本分类器

此文已由做者受权云加社区发布,转载请注明文章出处

相关文章
相关标签/搜索