使用Botkit和Rasa NLU构建智能聊天机器人

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~

我们每天都会听到关于有能力涉及旅游、社交、法律​​、支持、销售等领域的新型机器人推出的新闻。根据我最后一次查阅的数据,单单Facebook Messenger就拥有超过11000个机器人,然而到我写这篇文章的时候,估计又已经增加了几千台。第一代的机器人由于它们只能根据对话中的关键字来分析有限的一些问题,因此显得十分的愚笨。但是随着像Wit.aiAPI.aiLuis.aiAmazon LexIBM Watson等机器学习服务和NLP自然语言处理(Natural Language Processing)的商品化,促进了像donotpaychatShopper这样的智能机器人的发展 。

我不知道机器人这个话题只是炒作还是真正的付之现实,但我可以肯定地说,构建一个机器人的过程一定是十分有趣并且具有挑战性的。在这篇文章中,我将向您介绍一些构建智能聊天机器人时所需要的工具。

文章的标题已经清楚地表明,我们将使用 BotkitRasa (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": ,
"end": ,
"value": "phone",
"entity": "device"
}
]
}, {
"text": "my phone is not working.",
"intent": "device_failure",
"entities": [
{
"start": ,
"end": ,
"value": "phone",
"entity": "device"
}
]
}, {
"text": "My phone crashed and isn’t working anymore.",
"intent": "device_failure",
"entities": [
{
"start": ,
"end": ,
"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(, 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是我的机器人的名称)。

使用Botkit和Rasa NLU构建智能聊天机器人

您现在应该已经熟悉如何使用机器人开发框架和NLU来构建对话机器人的过程了。希望这篇文章能够帮助你更快的开始搭建起你自己的机器人。

翻译人:KX_WEN,该成员来自云+社区翻译社

原文链接:https://dzone.com/articles/building-an-intelligent-chatbot-using-botkit-and-r

原文作者:Arjun Hariharan

相关阅读

神经网络权重初始化问题

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

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


此文已由作者授权腾讯云+技术社区发布,转载请注明文章出处

上一篇:深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统


下一篇:智能聊天机器人——基于RASA搭建