我们每天都会听到关于有能力涉及旅游社交法律支持销售等领域的新型机器人推出的新闻根据我最后一次查阅的数据, 单单 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": 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 isnt 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 与数据库 CRMNLU 和统计工具的集成接口, 使得该框架更加具有可扩展性这种设计还允许我们通过为其编写媒介软件模块的方式, 轻松地添加 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(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 来构建对话机器人的过程了希望这篇文章能够帮助你更快的开始搭建起你自己的机器人
来源: https://juejin.im/post/5a71360f6fb9a01c9526647f