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

我们每天都会听到关于有能力涉及旅游、社交、法律​​、支持、销售等领域的新型机器人推出的新闻。根据我最后一次查阅的数据,单单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是我的机器人的名称)。

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

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

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

原文作者:Arjun Hariharan

相关阅读

神经网络权重初始化问题

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

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


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

使用Botkit和Rasa NLU构建智能聊天机器人的更多相关文章

  1. AI中台——智能聊天机器人平台的架构与应用(分享实录)

    内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取 ...

  2. 学习笔记TF059:自然语言处理、智能聊天机器人

    自然语言处理,语音处理.文本处理.语音识别(speech recognition),让计算机能够"听懂"人类语音,语音的文字信息"提取". 日本富国生命保险公司 ...

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

    基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...

  4. 软工实践团队项目-"智能聊天机器人"简介

    "智能聊天机器人"项目 目前已确定的团队人员:张扬.俊彦.韫月.地秀.泽波.李翔.文婧.俞明.加伟(排名不分先后) 队伍已满,没有再招人的打算(#^.^#) 我们的想法 你有用过智 ...

  5. 【Python成长之路】从零学GUI -- 制作智能聊天机器人

    [写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...

  6. 使用websocket开发智能聊天机器人

    前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...

  7. 智能聊天机器人——基于RASA搭建

    前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...

  8. 自己动手开发智能聊天机器人完全指南(附python完整源码)

    一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...

  9. 情人节用Python智能聊天机器人的实现|制作一个虚拟恋人

    首先项目需要的包 import urllib.request import urllib.parse from tkinter import * import time PS:另外很多人在学习Pyth ...

随机推荐

  1. 浅析mongodb

    当爬取数据时候,我们可能需要缓存大量的数据,但是又无须任何复杂的连接操作,因此我们将选用NoSQL数据库,这种数据库比传统的关系型数据库更易于操作,这里我想主要说一下目前非常流行的MongoDB作为缓 ...

  2. [转]scp用法

    从本地复制到远程 复制目录命令格式: scp -r local_folder remote_username@remote_ip:remote_folder 或者 scp -r local_folde ...

  3. Android基础_web通信2

    一.移动客服端实现对PC端数据的操作 在PC端模拟一个数据库,实现用户的增删改查,然后在移动客服端实现对PC端数据库的操作 在PC端建立三个表 用户表(Users),员工表(Emp), 部门表(Dep ...

  4. 【ASP.NET Core】在Win 10 的 Linux 子系统中安装 .NET Core

    在上一篇文章中,老周扯了一下在 Windows 10 中开启 Linux 子系统,并且进行了一些简单的设置.本篇咱们就往上面安装 .net core . 老周假设你从来没有用过 Linux,所以,接着 ...

  5. beef配合ettercap批量劫持内网的浏览器

    先更改首先先打开ettercap的DNS文件进行编辑,在kali linux2.0下的文件路径为/etc/ettercap/etter.dns 在对应的位置添加对应的 标识和IP地址 * 代表所有域名 ...

  6. msfvenom向apk注入payload

    首先安装apt-get install apkinjector 这个东西,msfvenom重新组装apk的时候会自动调用 msfvenom -x /路径/apk android/meterpreter ...

  7. AtCoder Grand Contest 016

    在雅礼和衡水的dalao们打了一场atcoder 然而窝好菜啊…… A - Shrinking 题意:定义一次操作为将长度为n的字符串变成长度n-1的字符串,且变化后第i个字母为变化前第i 或 i+1 ...

  8. bzoj:1575: [Usaco2009 Jan]气象牛Baric

    Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1...M_N(1 <= M_i <= ...

  9. [bzoj3955] [WF2013]Surely You Congest

    首先最短路长度不同的人肯定不会冲突. 对于最短路长度相同的人,跑个最大流就行了..当然只有一个人就不用跑了 看起来会T得很惨..但dinic在单位网络里是O(m*n^0.5)的... #include ...

  10. .NET MongoDB Driver 2.2 API注释

    主要内容 1 MongoClient 1.1构造函数 1.2 方法 2 IMongoDatabase 3 IMongoCollection 4 IMongoCollectionExtensions 5 ...