nlp聊天机器人案例 聊天机器人架构_聊天机器人



Chatbot 的开发者越来越多了,一些创业公司都开始开发自己的聊天机器人产品,包括提供平台类的,提供API 的,提供分析工具的等等。很多的博客,杂志和视频都充满着工业界对聊天机器人的宠爱,开发者们也聚集在一起讨论如何开发,以及参加各种会议。

我也开发过一段时间的聊天机器人,在这篇文章中,我将简单的介绍一些 chatbot 架构。

有什么类型的机器人?

聊天机器人主要有两种形式:第一种是娱乐型;第二种是商务型。

关于娱乐型的聊天机器人,工程师们已经开发了很多年了,比较著名的有再 1966 年开发的 ELIZA 机器人。开发这些机器人的目的就是想让它能像一个人一样进行交流,通过图灵测试。所有参与 Loebner 比赛的机器人都属于这一类的。微软的 Xiaoice 和 Tay 是这一类机器人的代表。最近比较有名的例子是 Skype 上面的 “Spock” 机器人。

我们设计的聊天机器人应该足够聪明,这样用户采用兴趣和机器人一直聊下去。但是机器人不需要完全去明白用户所说的,也不需要去记住和用户的对话细节。

一个评估娱乐聊天机器人是否智能的测试是图灵测试。其他一些定量指标是机器人和最终用户之间的平均会话长度,也可以是每周用户平均花费的时间,如果对话很短,那么机器人就不够有趣。

商业化的聊天机器人往往是交易类型的,他们都扎根于某一个垂直领域,对话通常侧重于用户的真实需求。比如,Travel chatbot 提供有关航班,酒店和旅游的信息,并有助于根据用户的标准找到最佳的方案。Google Assistant 随时都可以提供用户要求的信息,Uber bot 可以根据用户需求,响应乘车请求。

该类型的机器人对话通常都非常短,不到15分钟。每个对话都有一个小目标,并且可以通过有多少用户达到了他们的目标,以此来评估这个机器人的质量。用户是否找到他正在查找的信息?用户是否成功预订了航班和酒店?用户是否购买了有助于解决手头问题的产品?通常,这些硬指标都是很容易被跟踪到的。

也许一些机器人不适合这种分类标准,但是对于现在大多数机器人来做,这应该是足够好的。

另一个比较好的分类是基于对话类型:一对一,一对多等等。如果一个 chatbot 被添加到群聊中。那么,机器人的使用场景就会非常复杂,并不是一个单一的场景了。

模型

正如,Denny Britz 在博客 Deep Learning for chatbots 中写道,chatbot 可以基于机器学习模型从头开始生成响应,或者使用一些启发式方式从预订的数据库中选择一些响应。

但是,生成模型是非常难建立和训练的。通常需要数百万个例子来需要一个生成模型,以获得质量比较好的对话,而且生成模型有一个很大的缺点就是你不能完全确定模型会产生什么回应。Miscrosoft Tay 就是属于这个类别的。

生成模型

生成模型肯定是未来聊天机器人的开发趋势,它们能让机器人更加聪明。但是这种方法还没有被聊天机器人开发者所广泛使用,它更多的是使用在实验室里面。




nlp聊天机器人案例 聊天机器人架构_人工智能_02



基于检索式的模型

相比生成模型,检索模型开发非常简单。模型会提供更多可能的预测结果。如果模型无法获得100%的准确性回复,但是模型会返回一个最可能的回复,并且确保没有不当或者语法的错误。

目前,基于检索的模型更为实用,许多算法和API都可以供给开发人员使用。




nlp聊天机器人案例 聊天机器人架构_数据库_03



chatbot 基于用户的输入信息和上下文信息,从候选库中选出一个最佳的回答。上下文信息可以包括对话框中的当前信息,以前的对话信息,以及历史保存的变量信息(比如,一些用户喜好)。

如果机器人不使用上下文信息,那么它就是一个无状态的交流。它只会对当前的用户信息进行回应,而不会处理历史信息。

基于模式匹配的启发式模型

用于启发式匹配模型的开发,可以有许多种不同的设计方式,比如 if-else 条件逻辑,机器学习分类手段,等等。最简单的技术是使用一组规则,其中模式作为规则的条件。构建娱乐型的聊天机器人,这种模式是非常受欢迎的。AIML 是用于编写模式和响应的一种语言。开发者可以用 AIML 语言编写这种逻辑代码,代码可以包括很多单元,如下所示:

<category>
<pattern>WHAT IS YOUR NAME</pattern>
<template>My name is Michael N.S Evanious.</template>
</category>

当一个机器人接受到用户的信息时,它会便利所有的模式,直到找到用户的输入匹配。然后AIML会根据找到的模式,来生成相应的响应。

ChatScript 是一个关于这个想法的进一步实现。它是一个开源的 Chatbot 引擎,它允许以基于规则的语言定义聊天室。每个规则包含一个模式和一个输出:

s: (because [someday “one day”]) That won’t be soon.

ChatScript 引擎具有强大的自然语言处理流程和丰富的模式语言。使用 ChatScript 可以做的比 AIML 更好。它会解析用户信息,标记,查找同义词和概念,并找出与输入信息最匹配的回答。除了 NLP 功能之外,ChatScript 还会跟踪对话框,以便你可以设计包含不同主题的长脚本。不过它不会有什么特别花哨的东西,它也不能运行机器学习算法,不会访问外部的知识库或者第三方 API 接口,除非你自己来设计这一部分的工作。

使用机器学习对用户意图进行分类

启发式的模式匹配存在一个严重问题,那就是所有的匹配模式都是需要手动编程的,这不是一件容易的事,特别是如果 chatbot 必须正确的处理几百个意图。想象你正在构建一个客户服务机器人,机器人应该回应一个退款申请。用户可以使用数百种表达方式,比如,“我要退款”,“退款”,“我需要我的钱还我”。同时,如果在另一个应用场景中,对于同一个单词,机器人应该做出不同的回应,比如:“如果我不喜欢这项服务,我可以要求退款吗?”,“你的退款政策是什么?”人类并不擅长写自然语言理解的模式和规则,但是计算机可以在这个任务上表现更好。

我们可以利用机器学习算法来构建我们的意图分类模型。你只需要几百或几千个示例的训练集,然后模型将从这些数据中学出一种意图模式。

这样的算法可以使用任何流行的机器学习库(比如:scikit-learn)来构建,另一个选择是使用第三方云平台API,比如:wit.ai,api.ai,Microsoft LUIS。wit.ai 好像是第一家为 chatbot 做机器学习 API 的公司,它是今年被 Facebook 收购,现在它变成了一个免费 API 。

产生问答

模式匹配或者机器学习分类算法有助于了解用户输入消息在描述什么意思。当 chatbot 获取消息的意图时,它将产生一个响应。那么,机器人是怎么做到的呢?最简单的方式就是采用静态响应来进行响应,每个消息都设计一个意图。或者,也许,根据意图来获取一个模板并放入一些变量。这种模式是 ChatScript 机器人和大多数机器人都采用的一种方法。

那么,机器人如何能做的更好呢?这没有一个简单的答案。响应机制必须依赖于用户的真实需求。医务机器人可能会使用基于症状的统计模型来决定哪些问题需要重新诊断,问答机器人将会根据知识图谱来产生一些潜在的答案,然后利用一些别的算法来对这些信息进行打分,IBM就是这么做的。天气机器人只会访问一些天气API,以此来获得给定位置的天气预报。

响应选择架构

对于同一个信息,chatbot 可以使用不同的词来藐视。比如,对于天气机器人,chatbot 可以回答 “天气会下雨” 或者 “天气 80% 的概率会下雨”,或者提醒用户,你今天要带伞喔。那么到底哪一种回答是最好的呢?谁也不知道,不同用户有不同的感受。机器人可以分析以前的聊天和相关指标(会话的长度,销售概率,用户满意度),以此来指定用户的响应。

chatbot 可以具有单独的响应式生成和响应选择模块,具体架构如下图所示:




nlp聊天机器人案例 聊天机器人架构_聊天机器人_04



消息处理一般都从了解用户正在谈论什么内容开始。意图分类模块识别用户消息的真正意图是什么。通常,它是选择多个预定意图中的其中一个,尽管更加复杂的机器人可以从一个消息中识别多个意图,但是一般我们都设计成识别一个意图。对意图的分类我们可以使用上下文信息,例如先前消息的意图,用户个人信息和一些偏好。实体识别模块从消息中提取结构化的信息,比如,天气机器人需要提取位置和日期。

候选响应生成器在所有特定域上面处理用户请求。它可以使用不同的算法,调用几个外部的API,甚至还可以让人们帮助处理响应生成。这些计算就是候选响应生成器的列表。所有这些回应都应该在特定的领域中,逻辑是正确的。它不能只是大量的随机响应。响应生成器必须使用会话的上下文以及从用户最近的消息中提取意图和实体,否则它不能支持多消息对话。

响应选择器仅对所有响应候选集进行评分,并且选择出为用户最好的响应。

现在,你可以选择一种你认为最合适的架构,为你的机器人设计软件了,赶快行动吧!