如何让你的客服问答系统从“人工智障”到“人工智能”

前段时间接手了公司遗留的一个所谓“智能客服机器人”的项目,改进了之前团队的“人工智障”设计,颇有收获。今天是 1024,程序员节。我们就来整点干货,八一八整个项目的血泪教训。

 

这个项目是给某医院做的自动客服系统,对接了微信公众号,要求能回复一些固定种类的问题。比如:

1. 住院部在几楼?(问路)

2. 帮我预约一下张医生门诊(预约)

3. 查询刘医生主治的内科病人(查询)

……

当然,实际种类有十几个,就不一一列举了。

当我拿到上任“资深自然语言处理架构师”老胡发给我的代码时,我的内心是拒绝的。这并不是因为他没有头发,而是因为这些代码太“硬”了。几乎所有逻辑都是硬编码进去的,基本流程如下:

基本流程就是正则匹配问句,根据匹配上的正则表达式判断问题种类,然后执行相应逻辑。包括查询相应的数据表或 ElasticSearch 索引,或者向业务系统请求预约等。当然,实际代码里正则表达式比这个复杂一百倍,毕竟这套系统上线了好几年,收获差评数万呢。差评原因无非以下四个方面:

1. 问句种类匹配不准,比如“查询刘医生在内科主治的病人”会同时匹配到“问路”和“查询”两个类型。旧系统又编码了很多优先级规则,一团乱麻。我猜这团乱麻是老胡呕心沥血用自己头发编织出来的。

2. 问句成分匹配不准,用户输入千奇百怪。比如“张医生”“张主任”“ 张大庆”“张大庆医生”,我看搜索日志,还有用户爱称“张神医”“大庆”“大庆医生”的,也不嫌肉麻。用户随便输入,但旧系统硬编码的名单都是真实姓名,匹配不上各种称呼。另外,每次新医生入职,要过好久才对接名单更新。

3. 不支持多轮对话。用户经常没法一次性输入全所有信息,比如“帮我查一下刘医生的病人”,但是检索系统又要求必须指定科室。这时候旧系统就只能回复“请同时指定医生和科室”。用户于是回复“就是内科啊”,可这次旧系统居然匹配上了问路的正则表达式,于是返回了去内科怎么走。这下用户就被彻底被激怒了,体验极差。特别是这种查询功能一般都是医院的大领导们用的,听说间接导致了老胡的离职。

4. 检索系统搜索不准。即使“张大庆”被正则匹配上了,但在检索系统中却被切分成“张+大庆”,导致结果第一条是“住院部挂着一张大庆油田的风景画”,完全答非所问。旧系统好像用的是什么 IK 分词器,错误百出。我虽然不是科班出身,但是一看专业教材就浑身难受。

我还是找到了一些资料,并且根据这些资料将系统重新设计了一下。这种客服系统属于自然语言处理领域,学名应该叫任务型问答系统,基本就包括“意图分类”“槽识别”和“业务逻辑”三个模块,如下图所示:

其中,意图指的就是问题的类型,槽指的是每种意图中的特定名词。比如在问路型意图中,科室名称“内科”“耳鼻喉科”就是槽。也就是说,意图分类和槽识别代替了正则表达式,提供了更精确的结果,解决了 bug① 和 ②。

具体实施的时候,我自豪地面向开源项目编程,直接用了 HanLP 中的文本分类器和命名实体识别做意图分类和槽识别,一步到位不要太爽。

HanLP 是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。HanLP 具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点;提供词法分析(中文分词、词性标注、命名实体识别)、句法分析、文本分类和情感分析等功能。被广泛用于 Lucene、Solr、ElasticSearch、Hadoop、Android、Resin 等平台,有大量开源作者开发各种插件与拓展,并且被包装或移植到 Python、C#、R、JavaScript 等语言上去。项目详见:https://github.com/hankcs/HanLP

所谓文本分类器,就是给定一段文本,HanLP 自动判断类别。怎么个判断法呢?HanLP 怎么知道你要判断医院的“问路”“查询”“预约”还是新闻网站的“经济”“财经”“教育”呢?这时候就需要用户提供一些例子给 HanLP 学习,这些例子在自然语言处理里面叫语料。不是随便什么爬虫爬下来的文本都是语料,必须得有具体业务所需要的答案才行。

比如,在医院的人工客服系统中,累积了很多用户的查询问句,以及客服小姐姐给查询语句打的标签(问路、查询还是预约)。这些问句+标签就是文本分类的语料,可以直接丢给 HanLP 让它学习。

学习得到一个文件,储存着如何把问句分类为“问路型”“查询型”“预约型”等等类别的知识,这个文件叫做模型。存起来丢给线上的 HanLP 分类器加载一下就可以执行分类了。这里比较推荐基于 SVM 的文本分类器,据说速度和准确率都是最高的。

所谓命名实体识别,就是识别人名、地名、机构名之类专有名词的工具。我这个医疗客服系统里面主要就是医生的姓名了。听说 HanLP 的感知机分词器是在一亿字的语料库上训练出来的,准确率的确不知道比其他同类工具高到哪里去了。

HanLP 分词结果中,人名的词性标签是 nr,根据这个就拿到了医生姓名。至于科室名,HanLP 虽然能分出来但是词性标签就是名词 n。我的做法是把老胡正则表达式中的科室做成词典,指定词性为 ndep 交给 HanLP 挂载就行了。反正科室是一个很死板的东西,不会经常变化,一本用户词典管十年基本没毛病。

新系统 2.0 上线后调查数据显示,用户满意度果然提高了不少。搞搜索引擎的小伙伴听说了也把他们 ES 的 IK 分词器也换成了 HanLP 分词器,效果拨群。这样 bug④ 也解决啦。

后来领导看我这么快就把新系统上线了,马上给我发了奖金,马上给我派了新活儿——让我把院长上次提的多轮询问实现一下。这说明交差不能太快,闷声才能发大财啊。

根据资料,多轮对话的管理必须有一个对话管理器,负责综合对话历史和当前对话决定回复什么。在这个项目中,其实就是一个缓冲区的作用。当一句话里面的槽不全的时候,应该把这句话的意图和槽缓存起来,然后向用户询问更多有关缺失槽的信息。这样问答系统才更有意思,不仅负责回答问题,还能够向用户提问,帮助他们提出更准确的问题。

对话管理器的流程如下:

当然实际的对话管理器比这个复杂,有些问题涉及到好多槽,有时候对话的话题又会变化,总之还是需要消耗一些头发的。

3.0 上线后我以为项目总该庆功了吧,不料我还是太年轻。吹毛求疵的客户又报了几个工单上来,虽然相比旧系统少了很多,但总得给人解决吧。这次的问题是有些意图的区分度非常低,比如“查询张大庆负责的科室”和“查询科室负责的张大庆”这两个问句分别是要查“科室”和“张大庆”,但分类结果却是一样的。我找了找资料,原来分类算法使用了一种叫词袋模型的方法建模文档。词袋模型最大的问题是忽略了文档单词的顺序,也就是说,这两句话在词袋向量看来,都是下图的无序集合:

我动脑筋想了想,解决办法有两个。一是在分词的时候把相邻的两个单词组合起来形成一个“新单词”,这样就在一定程度上保留了文档的语序。二是利用 HanLP 的句法分析得出问句的语法结构,把语法结构作为一种特征信息提供给分类器。

比如“查询张大庆负责的科室”的语法结构如下:

查询的宾语是“科室”。

“查询负责科室的张大庆”的语法结构如下:

查询的宾语是“张大庆”。

我通过自定义 HanLP 的分词器和重载文本分类接口分别实现了两种方法,然后将语料划分为训练集和测试集。结果在测试集上第二种方案的准确率更高,说明句法分析对这种短文本分类还是有一定疗效的。至此,这个“智能客服机器人”项目基本一致好评,圆满庆功了。

啊哈!是不是突然觉得自然语言处理还是很有趣的。如果你问我是哪个师傅带我进门的,那可绝对不是老胡,是这本《自然语言处理入门》。这大概是市面上最友好的 NLP 入门书了,都是白话讲解,没有故弄玄虚的数学公式,另外还配备产品级代码。你不需要熬夜琢磨,地铁上也可以读懂,更重要的是对你的头发有好处。

(点击封面,即可抱回家)

Java 与 Python 双实现

助你零起点上手自然语言处理

本书作者是自然语言处理类库 HanLP 作者何晗。截至 2019 年 10 月初,该项目在 GitHub 上 Star 数已达 15 K,超过了宾夕法尼亚大学的 NLTK、斯坦福大学的 CoreNLP、哈尔滨工业大学的 LTP。

作者汇集多年经验,从基本概念出发,逐步介绍中文分词、词性标注、命名实体识别、信息抽取、文本聚类、文本分类、句法分析这几个热门问题的算法原理与工程实现。书中通过对多种算法的讲解,比较了它们的优缺点和适用场景,同时详细演示生产级成熟代码,助你真正将自然语言处理应用在生产环境中。

呐!HanLP 1.7.5 发布了,最后我们就来一起回顾下它的成长的历程。希望今天 1024 程序员节,大家能无 bug 早下班。

题图来源:动漫《Chobits》

   文末畅聊

细数那些年领导/客户给你提过的需求,你都是如何应对的?精选留言选出 5 位获得赠书一本。你可以选择《自然语言处理入门》也可以选择《程序员面试金典》,只要是图灵近两个月出版的新书,任你挑选。

1024 程序员节,也可以说说今天公司都为你准备了哪些活动?你今天都在忙哪些项目?精选留言选出 5 位,送出图灵书签一支。活动截至 2019.10.26。

PS:1024 程序员节,图灵社区电子书 5 折,仅此一天。另外,当当也有图书满 100 减 50 活动,小伙伴们该出手时就出手呀!

推荐阅读:

Spring Cloud之赵国的覆灭

只要会 Java 或 Python,普通程序员也能入门自然语言处理

热度直逼TensorFlow的深度学习框架,我用它画下女朋友最美的脸

当当满 100 减 50 活动正在进行中

☟☟  购书指南

发布了527 篇原创文章 · 获赞 898 · 访问量 214万+
展开阅读全文

没有更多推荐了,返回首页

分享到微信朋友圈

×

扫一扫,手机浏览