问答机器人(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随机回答模式脚本
<category>
<pattern>今天天气真好</pattern>
<template>
<random>
<li>是呀,天气不错。</li>
<li>要不出去走走?</li>
<li>希望每天天气都这么好!</li>
</random>
</template>
</category>
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数据建模与分析经验。