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

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

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

文章插图
这个项目是给某医院做的自动客服系统,对接了微信公众号,要求能回复一些固定种类的问题 。比如:
1. 住院部在几楼?(问路)
2.帮我预约一下张医生门诊(预约)
3.查询刘医生主治的内科病人(查询)
……
当然,实际种类有十几个,就不一一列举了 。
当我拿到上任“资深自然语言处理架构师”老胡发给我的代码时,我的内心是拒绝的 。这并不是因为他没有头发,而是因为这些代码太“硬”了 。几乎所有逻辑都是硬编码进去的,基本流程如下:
如何让你的客服问答系统从“人工智障”到“人工智能”

文章插图
基本流程就是正则匹配问句,根据匹配上的正则表达式判断问题种类,然后执行相应逻辑 。包括查询相应的数据表或索引,或者向业务系统请求预约等 。当然,实际代码里正则表达式比这个复杂一百倍,毕竟这套系统上线了好几年,收获差评数万呢 。差评原因无非以下四个方面:
1. 问句种类匹配不准,比如“查询刘医生在内科主治的病人”会同时匹配到“问路”和“查询”两个类型 。旧系统又编码了很多优先级规则,一团乱麻 。我猜这团乱麻是老胡呕心沥血用自己头发编织出来的 。
如何让你的客服问答系统从“人工智障”到“人工智能”

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

文章插图
3. 不支持多轮对话 。用户经常没法一次性输入全所有信息,比如“帮我查一下刘医生的病人”,但是检索系统又要求必须指定科室 。这时候旧系统就只能回复“请同时指定医生和科室” 。用户于是回复“就是内科啊”,可这次旧系统居然匹配上了问路的正则表达式,于是返回了去内科怎么走 。这下用户就被彻底被激怒了,体验极差 。特别是这种查询功能一般都是医院的大领导们用的,听说间接导致了老胡的离职 。
4. 检索系统搜索不准 。即使“张大庆”被正则匹配上了,但在检索系统中却被切分成“张+大庆”,导致结果第一条是“住院部挂着一张大庆油田的风景画”,完全答非所问 。旧系统好像用的是什么 IK 分词器,错误百出 。我虽然不是科班出身,但是一看专业教材就浑身难受 。
如何让你的客服问答系统从“人工智障”到“人工智能”

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

文章插图

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

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