使用Botkit和Rasa NLU构建智能聊天机器人
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~
我们每天都会听到关于有能力涉及旅游、社交、法律、支持、销售等领域的新型机器人推出的新闻。根据我最后一次查阅的数据,单单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": ,
"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原有的默认操作。
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(, 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构建智能聊天机器人的更多相关文章
- AI中台——智能聊天机器人平台的架构与应用(分享实录)
内容来源:宜信技术学院第3期技术沙龙-线上直播|AI中台——智能聊天机器人平台 主讲人:宜信科技中心AI中台团队负责人王东 导读:随着“中台”战略的提出,目前宜信中台建设在思想理念及架构设计上都已经取 ...
- 学习笔记TF059:自然语言处理、智能聊天机器人
自然语言处理,语音处理.文本处理.语音识别(speech recognition),让计算机能够"听懂"人类语音,语音的文字信息"提取". 日本富国生命保险公司 ...
- 深度学习项目——基于循环神经网络(RNN)的智能聊天机器人系统
基于循环神经网络(RNN)的智能聊天机器人系统 本设计研究智能聊天机器人技术,基于循环神经网络构建了一套智能聊天机器人系统,系统将由以下几个部分构成:制作问答聊天数据集.RNN神经网络搭建.seq2s ...
- 软工实践团队项目-"智能聊天机器人"简介
"智能聊天机器人"项目 目前已确定的团队人员:张扬.俊彦.韫月.地秀.泽波.李翔.文婧.俞明.加伟(排名不分先后) 队伍已满,没有再招人的打算(#^.^#) 我们的想法 你有用过智 ...
- 【Python成长之路】从零学GUI -- 制作智能聊天机器人
[写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...
- 使用websocket开发智能聊天机器人
前面我们学习了异步web框架(sanic)和http异步调用库httpx,今天我们学习websocket技术. websocket简介 我们知道HTTP协议是:请求->响应,如果没有响应就一直等 ...
- 智能聊天机器人——基于RASA搭建
前言: 最近了解了一下Rasa,阅读了一下官方文档,初步搭建了一个聊天机器人. 官方文档:https://rasa.com/docs/ 搭建的chatbot项目地址: https://github.c ...
- 自己动手开发智能聊天机器人完全指南(附python完整源码)
一.前言 人工智能时代,开发一款自己的智能问答机器人,一方面提升自己的AI能力,另一方面作为转型AI的实战练习.在此把学习过程记录下来,算是自己的笔记. 二.正文 2.1 下载pyaiml 下载pya ...
- 情人节用Python智能聊天机器人的实现|制作一个虚拟恋人
首先项目需要的包 import urllib.request import urllib.parse from tkinter import * import time PS:另外很多人在学习Pyth ...
随机推荐
- Nginx集群之WCF分布式局域网应用
目录 1 大概思路... 1 2 Nginx集群WCF分布式局域网结构图... 1 3 关于WCF的BasicHttpBinding. 1 4 编写WC ...
- tcp链接断开的探测
有资料说,read.write都可以探测tcp的断开,但都不是实时的. 但是实际在某些设备上测试发现,即使开一个线程每隔一小段时间发一次心跳包(write),write也不能探测连接已经断开,而且这个 ...
- 【STL深入理解】vector
这篇文章不打算讲述vector的基本用法,而是总结一下近期我大量阅读C++经典书籍时遇到的一些关于vector的容易忽略的知识点,特意将它们记录下来,以便以后查阅. 1.v[0]和v.at(0)的区别 ...
- mp3格式转wav格式 附完整C++算法实现代码
近期偶然间看到一个开源项目minimp3 Minimalistic MP3 decoder single header library 项目地址: https://github.com/lieff/m ...
- 利用.Net自带的票据完成BaseController的未登陆自动跳转到登陆页功能
一:定义票据中要记录的字段类 /// <summary> /// 用户存在于浏览器端的身份票据(非持久) /// 非持久 FormsAuthenticationTicket 的isPers ...
- java.io与网络通信
文件IO java.io.File是用于操作文件或目录的类: File file = new File("hello.txt"); 实例化File时不关心路径的目标并不会去读取文件 ...
- Use of Deep Learning in Modern Recommendation System: A Summary of Recent Works(笔记)
注意:论文中,很多的地方出现baseline,可以理解为参照物的意思,但是在论文中,我们还是直接将它称之为基线,也 就是对照物,参照物. 这片论文中,作者没有去做实际的实验,但是却做了一件很有意义的事 ...
- React问题集序
问题描述 antd version: 2.7.4 OS and its version: windows7 Browser and its version: Chromium 55.0.2883.87 ...
- CCNA笔记(2)
CCNA第一天笔记:何为因特网?答:因特网,是连接各台pc与终端设备,正是因为有了因特网,我们才能与全世界交流,玩在线游戏,在线学习.因特网给我们教育带来什么方便?答:没有了地域的阻止,可以在线学习, ...
- 最短路(spfa)
http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others) Memory ...