原创 | 工业场景下,问答机器人如何陪聊?
来源: | 作者:K君 | 发布时间: 2018-10-22 | 670 次浏览 | 分享到:

问答机器人(Chatbot)已经渗透到我们生活中的各个角落,如Apple公司的Siri、Amazon的Alexa、阿里的旺旺。它们可以陪你闲聊、设闹钟、订餐厅、控制家电、做商品导购等。在工业场景下,聊天机器人有哪些场景呢?比如,用户可以询问某个品牌风机当月的发电量和故障停机时间;查询机舱加速度超限的可能原因以及需要更换的备件,帮你找到检修该故障最有经验的专家;询问公司的安全生产制度或报销流程。

相比其他领域,工业场景的Chatbot有如下特点:

1.需要领域内专业词库的支持,比如故障、备件名称;

2.需要多数据源的跨库查询,需要大数据平台的支持,比如同时查询海量的生产实时数据和故障事件数据;

3.需要基于专家知识的知识图谱支持,这点类似医疗知识图谱的应用,因为仅靠人工编写对话脚本,是无法穷尽所有可能问题的。

以上特点使得构建工业上好用的Chatbot非常困难,当然困难程度因业务需求而异。另一方面,Chatbot本身技术架构是通用的、可借鉴其他领域的,因此本文重点介绍通用的技术架构部分,先从Chatbot的分类说起。

1. Chatbot分类

Chatbot按照用途,可分为闲聊型和任务型两种。

闲聊型又称为开放域Chatbot,就是可以跟用户谈天说地,比如风靡一时的小黄鸡,用户更关注这类Bot的趣味性和智能性。闲聊技能通常是数以万计的历史问答(QA)对学习训练来的,同时还可以从新对话中学习,实现自我进化。

任务型又称为特定领域Chatbot,比如为用户导购的阿里旺旺,这种场景下用户更关注Bot答案的准确性,对Chatbot的开发者来讲就是可控性。

工业场景与之类似,通常首要考虑的就是回答的准确性,知之为知之不知为,比如用户询问发电机过热怎么办,Bot即便回答不知道,也比回答去吃退烧药强,所以属于任务型Chatbot。

Chatbot按照技术框架可分为检索式、生成式和启发式。

2. Chatbot基本原理

Chatbot原理框图如下图所示:

ASR(Auto Speech Recognition)TTS(Text To Speech)代表语音识别和语音合成,它们分别实现语音转文字和文字转语音功能,是chatbot的入口和出口,是与用户进行语音交互的部分,当然也可以采用其他交互方式,比如文字(微信、浏览器页面等)。

核心对话模块是本文要展开介绍的内容,它包括:

NLU(Natural Language Understanding)是采用NLP(Natural Language Processing)技术对用户问题进行意图识别和实体抽取。意图识别是要弄清楚用户到底要问什么,如是查询故障发生次数还是故障原因;实体抽取是这个意图下的具体槽位值。比如问句是“上个月发电机故障次数是多少”,意图就是“查询故障次数”,故障名称的槽位值是“发电机故障”,时间的槽位值是“上个月”。意图识别可以描述成为分类问题,使用机器学习的方法来解决,如SVM、fastText;实体抽取使用NLP里的NER(命名实体识别)相关技术解决。

DM(Dialogue Management)模块根据问题匹配到相应答案(或采取什么动作,如查数据库或调用API);在多轮对话中它还负责对话状态跟踪,根据当前的对话状态(从历史对话内容更新获得),决定如何进行下一轮对话(或直接采取动作)。比如“上个月发电机故障次数是多少”问句除了故障名称和时间两个槽位,还有城市的槽位值(如是北京还是上海),DM模块根据当前这个状态,要决定继续追问用户“要查那个城市的故障?”。常用的DM策略包括有限状态机,HMM和神经网络[1]。

NLG(Natural Language Generation)是将DM模块返回的结果(如关键词、聚合数据)转变成自然语言文本,最常用的方法是通过规则模板生成回答,类似于NLU中问题匹配的逆向过程,另一种是基于深度学习的seq2seq生成方法。

以上介绍了Chatbot的基本框架和原理,从零开始开发Chatbot工作量很大,好在有大量的Chatbot框架可以使用,下面对几个常用的开源框架做简要介绍。

3. 任务式Chatbot构建工具框架

3.1

基于REfO的问句匹配

REfO(Regular Expressions for Objects)并不是一个框架,它把正则表达式的功能扩展到对象级别,它能同时使用关键和槽位匹配用户问句,从而实现DM模块的问句匹配功能,它支持python。举例, 见下图,REfO表达实现了“上个月发电机故障次数是多少”这个问句的匹配,匹配之后可以触发相应动作从数据库中查找问题答案。参见文献[2]提供REfO 匹配问句Python脚本实现例子。REfO虽然能匹配槽位,但是其脚本编写繁琐,也没有对话状态跟踪机制,基于脚本的规则引擎克服了上述缺点。

REfO问句匹配示例

3.2

基于脚本的规则引擎

该引擎根据人工编制的对话脚本,自动匹配问题模式,给出回答(动作),因此开发者只需把精力放在脚本编写上。引擎约定了脚本语法,满足大部分对话编制需求,如随机对话模式、通配符、变量捕获、Topic机制(多轮对话机制)、动作触发(函数调用)等。常见的规则引擎包括AIML[3]、Chat[4]、Rive[3]、Super[6],引擎诞生时间从早到晚,但其中最有名的还是AIML(支持Python调用)。其中使用AIML和Chat开发的Bot,都曾多次赢得年度Loebner Prize[7]人工智能大奖。Rive和Super脚本更加简洁,下图是同一个随机问答功能的脚本比较,可见Rive要比AIML更简洁友好。此外Rive支持多开发语言Go/Java/Java/Perl/Python,Super虽然仅支持Java,但其内嵌了图数据库功能,NLU和DM功能较Rive更加强大 。

AIML随机回答模式脚本

今天天气真好

Rive 随机回答模式脚本

+ 今天天气真好

- 是呀,天气不错。

- 要不出去走走?

- 希望每天天气都这么好!

3.3

RASA

实际对话中,相同问题的问法千变万化,这使得采用人工编制规则来匹配用户问题非常困难;基于机器学习Chatbot框架,通过大量的历史训练问答语料,部分克服了该问题。RASA[8]是其中杰出的开源代表,它包括RASA NLU和RASA Core两个子框架。

RASA NLU负责意图识别和实体抽取。这里首先需要使用已训练好的MITIE模型,该模型需要大量领域相关的中文语料。如构建风力发电领域对话,就要搜集机组的故障工单、故障报告、说明手册等;其次,要构建做意图识别和实体抽取的训练样本,以json格式存储,内容见下图,包括训练文本、意图名、实体名;

NLU训练jasn脚本示例

{

"text": "液压泵无反馈故障怎么修",

"intent": "restaurant_search",

"entities": [{

"start": 0,

"end": 6,

"value": "液压泵无反馈",

"entity": "fault_name"

}]

}

再次要修改pipeline设置,见下图;最后开始训练生成model文件。使用该模型,就可以开启NLU服务,完成意图识别和实体抽取功能。

RASA NLU Pipeline

RASA Core模块负责DM功能,具体流程如下图所示,Interpeter接受用户消息,转化为意图和实体,由RASA NLU实现;Tracker负责对话追踪;Policy接受当前对话状态,选择执行哪个动作;最后将动作返回用户,并记录到Tracker中。这里Tracker和Policy都使用机器学习模型来实现,其训练脚本为domain.yml和stories.md,前者定义了意图集合、slots集合和动作集合,后者定义意图实体与动作的映射关系,脚本具体写法和训练过程请参考文献[8-10]。RASA Core还提供UI工具[11]用于stories.md的训练生成,使得脚本训练更加简单高效。

RASA Framework

3.4

Chatbot在线服务

使用上述框架,需要开发人员具备一定的编程、机器学习和自然语言处理相关知识,如果不具备相关知识是否也能开发Chatbot呢?Chatbot在线服务应运而生,开发者可以在平台上免费创建虚拟Chatbot,甚至产品和运营人员都可以轻松地开发聊天/对话机器人应用,相关的国外服务有google的api.ai,Facebook的Wit.ai,国内服务有“一个AI[12]”,详细了解参加官方网站[8]。遗憾的是,目前这些Chatbot只能以http服务方式获取,这就意味着使用服务,就要向服务提供商提供自己的数据,这对于数据安全敏感的企业显然不适用。

4.结论

本文介绍了Chatbot的分类、基本原理和构建工具框架,讨论了在工业场景下Chatbot的开发方法,由于工业场景对Bot的可控性要求较高,使用任务式的框架来构建更为合适。在选择具体的工具框架时,基于规则框架可控性强、通用性强,但是其对话脚本工作量很大;基于机器学习的框架,智能性更强,具备自学习能力,但是每个话题都需要成百上千个训练问答对,冷启动比较困难。如何选择还需要根据具体的场景确定。

然而Chatbot框架仅仅完成了从用户自然语言到最终执行动作的路由,如开篇所述,工业Chatbot是需求导向的,如何搜集大量工业语料、积累专业词库,如何在Chatbot动作中完成多源异构的跨库查询,如何构建整合专业知识的知识图谱实现Bot高效查询,是决定Chatbot成败的关键因素,是在构建Chatbot初期就必须通盘考虑的。

最后附上一个Chatbot系统技能树[13],给准备入门的小伙伴做个参考。

Chatbot系统技能树[13]

参考资料

1. 对话系统原理和实践. https://segmentfault.com/a/1190000008315892

2. 基于 REfO 的 KBQA 实现及示例. http://www.openkg.cn/dataset/refo-kbqa/resource/76311e62-2a93-4696-9a92-8e73c812be11

3. AIML. https://www.tutorialspoint.com/aiml/index.htm

4. Chat. https://github.com/bwilcox-1234/Chat

5. Rive https://www.rive.com/

6. Super. http://superjs.com/

7. https://en.wikipedia.org/wiki/Loebner_Prize.

8. RASA官方文档. https://rasa.com/docs/

9. Rasa NLU和RasaCore中文实战案例. http://www.crownpku.com/

10. Rasa Core源码之Policy训练. https://www.jianshu.com/p/52c13eb39ab5

11. RASA UI. https://github.com/paschmann/rasa-ui

12. 一个AI. http://docs.yige.ai/

13. 如何成为一名对话系统工程师. https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/78746434

作者:阿闯

江湖人称“闯哥”,闷骚型男,隐形麦霸,自动化专业博士,大数据分析攻城狮,满腔工业情怀及matlab/R数据建模与分析经验。