现在,我们已经具备了为我们的客户开发出色对话体验的必要技能,很明显,你将创造出下一个杀手机器人。它将与一堆 API 集成,完成迄今为止业界闻所未闻的事情。我不擅长销售,但你懂的。你对自己的想法感到兴奋,更兴奋的是把它推向市场。该机器人已经部署,但令所有人失望的是,它并没有获得牵引力。用户不会参与其中。突然,你意识到你没有很好地理解用户在做什么,以及他们何时放弃与你的聊天机器人的对话。我们需要的是分析!
所有聊天机器人都会不断产生数据。用户和机器人之间的每一次交互,每次 NLU 平台解析用户的意图,每次用户诅咒机器人,每次机器人不知道用户在要求它做什么,都是对话中的关键点,可以洞察用户的行为,更重要的是,可以洞察如何改善对话体验。
我们有哪些方法可以获取所有这些数据?我们试图回答什么样的问题?我们如何获得这些数据?本章旨在回答其中的一些问题,并介绍如何将聊天机器人与分析平台相集成。
值得研究的是,我们应该从用户与聊天机器人的互动中获得什么样的见解。我们当然对用户与机器人对话的时间感兴趣。我们还对用户发信息的主题感兴趣。当然,我们对原始输入感兴趣,但是如果我们知道被解决的确切意图,我们可能会得到更好的见解。我们还想知道我们的机器人知道如何处理用户输入的百分比,或者它应该知道如何处理。
一般来说,聊天机器人分析平台都会收集和报告类似的数据。除了一般的分析功能,许多人可以在机器人上执行特定通道的分析。例如,Dashbot 是我们将在下一节介绍的平台之一,它可以从 Slack 和 Facebook Messenger 等平台收集特定的分析数据。在 Slack 上,我们可以看到统计数据,比如有多少 Slack 频道安装了我们的 bot。毫不奇怪,分析工具应该允许我们要求特定通道的数据。在一般情况下,我们要问的问题并不新奇:网络分析平台回答了很多类似的问题。对于聊天机器人,我们接下来看几类分析。
通用数据是原始的数字数据,例如消息数量、用户会话数量、每个会话交换的消息数量、会话持续时间、每个用户的会话数量等等。这些数据应该显示在一个按时间绘制的图表中,理想情况下,可以按任何时间段进行汇总。这些数据让我们可以看到一些简单的趋势,例如用户通常何时与机器人交互,交互多少次,持续多长时间。如果你有一百万用户,恭喜你!但是如果他们只和你的机器人交流过两条信息,那就不是成功。图 13-1 展示了谷歌聊天数据库提供的一个简单的活跃用户图表。图 13-2 是 Dashbot 用户参与度图表的一个例子。
图 13-2
Dashbot 的交战图
图 13-1
Chatbase 的活跃用户图表
此类别包括位置、性别、年龄和语言等数据。此数据并不适用于所有通道。图 13-3 是来自 Dashbot 的用户语言分发示例。
图 13-3
这只猫
现在我们进入了一些有趣的领域。理想情况下,我们会检查与会话持续时间和意图等其他指标相关的平均对话情绪。例如,一个功能真的会让用户感到沮丧吗?随着时间的推移,用户是否对机器人越来越失望?如果支持的话,这可能表示需要主动转移到人类实时聊天。情绪是否与我们无法控制的事情相关,比如一天中的时间?图 13-4 是 Dashbot 整体情绪可视化的一个例子。
图 13-4
整体情绪跟踪。6 月 26 日不是一个好日子。
作为聊天机器人开发者或产品所有者,最有趣的数据之一是用户多久回来体验一次。我们希望我们的对话体验是“粘性的”分析平台通常会包括一些可视化功能,显示每周有多少用户返回聊天机器人。当然,一个好的分析工具也可以让我们根据用户最初与聊天机器人互动的方式来探索保留指标。谷歌的聊天平台就是这样一个平台(图 13-5 )。默认情况下,我们可以看到在以任何方式与机器人互动一周后,有多少百分比的用户会再次使用机器人。我们可以将此分解,将意图作为等式的一部分,从而将意图与保持联系起来。这是一个很好的衡量标准,可以用来了解哪些功能可能会推动用户保持率,以及哪些领域需要改进。
图 13-5
用户保留表
可视化用户行为的方法有很多,但用户流是最常见的方法之一。通常,分析平台将显示用户在会话开始时采取的最常见操作,以及采取此操作的用户百分比。接下来,对于每个操作,它将显示用户采取的每个后续操作,包括这样做的用户的百分比和退出率。也就是说,我们了解了有多少用户一直在与机器人进行交互,通过哪些操作,以及有多少用户只是完全停止了与机器人的对话。同样,这种可视化在网络分析领域很常见,在聊天机器人中使用也很自然。图 13-6 显示了一个来自 Chatbase 的例子。我们可以从这种可视化中获得的一个见解是,团队可能会考虑支持那些指定他们今天要车的租车客户,而不是要求他们输入日期。请注意,“今天租车”路径表示不支持“今天”意图。
图 13-6
示例 charbase 会话流程图
有几个聊天机器人分析平台。首先,大多数聊天机器人开发平台和一些通道都有某种分析仪表板。例如,微软的 Bot 框架包括一个分析仪表板(图 13-7 ),它提供了消息和用户的总数、基本保留表、一段时间内每个通道的用户数以及一段时间内每个通道的消息数。
图 13-7
Azure Bot 服务分析仪表板
脸书提供脸书分析(图 13-8 ),这是一个平台范围的分析仪表板,包括详细的脸书机器人数据。亚马逊提供了一个 Alexa 技能仪表盘。问题是,机器人服务分析在深度和可用性方面有些欠缺,脸书和 Alexa 仪表板都只支持一个通道。
图 13-8
机器人的脸书分析
许多客户已经投资了跨多个产品线的分析平台。例如,一个分析系统可能拥有从 web 属性、移动应用和多个聊天机器人收集的所有数据。在这样的环境中,数据和用户行为可以跨不同的平台进行关联。如果有一种方法可以识别移动设备上的用户,并将其与聊天机器人上的用户相关联(可能通过帐户链接过程),那么我们就可以更广泛地了解用户在各个平台上的行为,并相应地满足他们的需求。通常,这将涉及企业数据存储解决方案,无论是在内部还是在云中,使用微软的 Power BI(图 13-9 )或 Tableau 等工具构建自定义可视化。
图 13-9
Power BI 仪表板示例
还有灵活的第三方聊天机器人分析解决方案,提供我们可以与我们的机器人集成的 API 和 SDK。我们提到了两个我们将在本章剩余部分使用的工具:Dashbot ( https://dashbot.io )和 Google 的 Chatbase ( https://chatbase.com )。还有其他选项如僵尸分析( https://botanalytics.co/ )和僵尸度量( https://www.getbotmetrics.com/ )。其中许多供应商还支持对 Alexa、Cortana 和 Google Home 等语音界面的分析。我们鼓励您自己进行研究,了解各种选项,并根据他们的要求做出最佳选择。
我们选择了这两个平台来展示两种风格的分析集成以及它们提供的报告类型。我们将了解 Dashbot 的开箱即用 Node bot Builder 支持,它利用 Bot 中间件来安装传入和传出消息处理程序,以便向 Dashbot 发送分析数据。(回想一下,我们之前在第 10 章的多语言支持上下文中使用了 bot 中间件的概念。)这是一个很好的开始。相比之下,谷歌的聊天平台更注重确保围绕分析数据的故事更加丰富。具体地,当向分析系统报告数据时,不仅发送用户的输入而且确定输入是否符合意图、输入是否被处理以及输入是命令还是对机器人问题的简单反馈可能是有用的。这种额外的元数据,通过中间件的简单集成将被强制捕获,可以产生极其丰富的分析。正确地完成它需要努力使每个对话都具有分析意识。让我们看几个例子来说明这两种方法。
先说 Dashbot。首先,我们去 https://dashbot.io/ 注册一个免费账户。一旦登录,我们将被带到一个空的机器人列表。点击添加机器人、技能或动作按钮(Dashbot 支持 Alexa 技能和谷歌动作,你能看出来吗?).界面将询问我们目标平台或频道(图 13-10 )。这是 Dashbot 基于通道提供分析优化和进一步数据集成机会的方式。
图 13-10
创建新的 Dashbot 条目
创建完成后,Dashbot 将向我们展示该机器人的分析 API 密钥。让我们将聊天机器人连接到这个 Dashbot 条目。首先,安装 Node.js 包。
npm install dashbot –-save最后,在创建了一个 bot 之后,我们将以下代码添加到 app.js 文件中:
// setup dashbot
const dashbotApiMap = {
facebook: process.env.DASHBOT_FB_KEY
};
const dashbot = require('dashbot')(dashbotApiMap).microsoft;
// optional and recommended for Facebook Bots
dashbot.setFacebookToken(process.env.PAGE_ACCESS_TOKEN);
bot.use(dashbot);这里发生了几件事。首先,我们指定 Dashbot API 键。在 Dashbot 中,每个平台都可以获得自己独特的仪表板,或者您可以创建多平台仪表板。如果机器人支持额外的通道,并且我们为这些通道准备了额外的 API 键,我们将在 dashbotApiMap 中设置它们。接下来,我们为 bot 框架导入 Dashbot 中间件,并使用 bot.use 将其添加到 Bot 中。当我们这样做的时候,我们也提供了脸书页面访问令牌。这不是必需的,但它为 Dashbot 提供了从脸书获取额外数据并将其集成到仪表板中的能力。
而且,就是这样!Dashbot 的 bot 框架中间件的代码非常简洁。我们在此提出以供参考:
that.receive = function (session, next) {
logDashbot(session, true, next);
};
that.send = function (session, next) {
logDashbot(session, false, next);
};
function logDashbot(session, isIncoming, next) {
if (that.debug) {
//console.log('\n*** MSFTBK Debug: ', (isIncoming ? 'incoming' : 'outgoing'), JSON.stringify(session, null, 2))
}
var data = {
is_microsoft: true,
dashbot_timestamp: new Date().getTime(),
json: session
};
var platform = session.source ? session.source : _.get(session, 'address.channelId');
// hack for facebook token
if (platform === 'facebook' && that.facebookToken != null) {
data.token = that.facebookToken;
}
var apiKey = apiKeyMap[platform]
if (!apiKey) {
console.warn('**** Warning: No Dashbot apiKey for platform:(' + platform + ') Data not saved. ')
next();
return;
}
// if the platform is not supported by us, use generic
if (_.indexOf(['facebook', 'kik', 'slack'], platform) === -1) {
platform = 'generic';
}
var url = that.urlRoot + '?apiKey=' +
apiKey + '&type=' + (isIncoming ? 'incoming' : 'outgoing') +
'&platform=' + platform + '&v=' + VERSION + '-npm';
if (that.debug) {
console.log('\n*** Dashbot MSFT Bot Framework Debug **');
console.log(' *** platform is ' + platform);
console.log(' *** Dashbot Url: ' + url);
console.log(JSON.stringify(data, null, 2));
}
makeRequest({
uri: url,
method: 'POST',
json: data
}, that.printErrors, that.config.redact);
next();
}在与我们的机器人交谈了几分钟后,我们产生了图 13-11 中的数据。
图 13-11
一次对话的数据价值
那很容易。我们可以在 Dashbot 上查看许多其他数据点。图 13-12 显示了一个可能性列表,包括关于用户、留存率、人口统计、热门信息和意图的详细信息,甚至包括原始对话记录。自然,像意图数据这样的东西不会被填充。根据我们之前的观点,如果我们想要支持它,我们的对话框必须包含分析报告功能。
图 13-12
Dashbot 提供的不同分析
Google 的 Chatbase API 不包含预建的 Bot 框架中间件集成;然而,我们自己构建这个并不太具有挑战性。我们可以把 Dashbot 的代码作为起点。事实上,我们这样做,但只针对传出的消息。传入的消息数据将从各个对话中发送。
首先,我们通过 Add Your Bot 按钮在 https://chatbase.com 上创建一个新的机器人。我们需要输入姓名、国家、行业和商业案例。因此,我们将从 Chatbase 获得一个 API 密钥。我们首先安装 Node.js 包。
npm install @google/chatbase –-save然后,我们编写一些助手方法来构建聊天库消息和中间件发送处理程序。我们可以将它放在自己的 Node.js 模块中。在下面的构建方法中,我们要求调用者提供消息文本、用户 ID、对话参数(从中我们可以尝试提取意图)和已处理标志。Chatbase 允许我们报告某个输入是否被处理。例如,如果有来自用户的未被识别的输入,我们将希望这样报告它。
require('dotenv-extended').load();
const chatbase = require('@google/chatbase')
.setApiKey(process.env.CHATBASE_KEY) // Your Chatbase API Key
.setAsTypeUser()
.setVersion('1.0')
.setPlatform('SAMPLE'); // The platform you are interacting with the user over
exports.chatbase = chatbase;
chatbase.build = function (text, user_id, args, handled) {
let intent = args;
if (typeof (intent) !== 'string') {
intent = args && args.intent && args.intent.intent;
}
var msg = chatbase.newMessage();
msg.setIntent(intent).setUserId(user_id).setMessage(text);
if (handled === undefined && !intent) {
msg.setAsNotHandled();
} else if (handled === true) {
msg.setAsHandled();
} else if (handled === false) {
msg.setAsNotHandled();
}
return msg;
}
exports.middleware = {
send: function (event, next) {
if (event.type === 'message') {
const msg = chatbase.newMessage()
.setAsTypeAgent()
.setUserId(event.address.user.id)
.setMessage(event.text);
if (!event.text && event.attachments) {
msg.setMessage(event.attachmentLayout);
}
msg.send()
.then(() => {
next();
})
.catch(err => {
console.error(err);
next();
});
} else {
next();
}
}
};在我们的 app.js 中剩下要做的就是安装 Bot Builder 中间件。
const chatbase = require('./chatbase');
bot.use(chatbase.middleware); // install the sender middleware接下来,我们需要在对话框中任何需要的地方添加分析调用。例如,在 summarize 对话框中,我们可以使用这个调用来报告成功进入该对话框。
chatbase.build(session.message.text, session.message.address.user.id, args, true).send();这段代码已经集成到我们在整本书中一直在做的日历机器人中。回购中的分支chapter-13已经与之前的代码集成。
图 13-13 是使用这种方法收集的数据仪表板示例。我们对聊天机器人没有处理的消息特别感兴趣。我们确实向日历机器人询问了生命的意义,这是我们不期望得到满意答案的事情。未处理的话语数据当然是我们要考虑的重要信息。图 13-14 显示处理后的输入。
图 13-14
同一会话的已处理消息
图 13-13
包含与机器人的一次对话的仪表板
同样,以前的数据很少,但随着你的聊天机器人获得使用,情况会变得更清楚,也更有价值。
这一章仅仅触及了如何正确地引导聊天机器人进行分析收集的表面。不同的分析平台还没有成熟的网络分析平台丰富,但他们正在取得良好的进展。作为聊天机器人开发人员,我们的重点是熟悉系统,并能够将它们集成到我们的代码中,以便正确的数据流入分析仪表板。然后,我们的团队可以做出明智的决定,决定哪些聊天机器人功能应该改进,哪些新功能可以添加,哪些功能可能不会引起用户的共鸣。聊天机器人仍然是一个新的空间;客户对对话界面会有各种各样的反应,特别是如果部署给不精通技术或者不喜欢用计算机发消息的客户。理解这些挑战并基于分析改善对话体验对于确保未来几年的成功采用至关重要。分析将在这一变革中发挥主导作用。*













