智能客服打造系列(下)

说在前面的话

持续了 N 久的智能客服项目也算告一段落,该踩的坑也踩得七七八八,作为「智能客服打造系列」的结尾篇,我打算大致讲讲一些可行的解决方案。

常用解决方案

根据解决方案所用到的知识点的侧重点,我把它划分为三类,分别是传统机器学习方法、深度学习方法和知识图谱方式。其中,前两种方法都需要计算用户问题与知识库中的问题的匹配程度,找出最匹配的一项。

传统方法

数据库模糊查询

最简单粗暴的方法莫过于直接字符串匹配,比如 mysql 中的 LIKE %question% 查询语句。这种方式的缺点很明显:召回率低。只有当知识库中的问题完全包含用户问题时,才认为匹配成功。为了提高召回率,需要在录入知识库时,对同一个问题创造出多种多样的问法。

ElasticSearch

聪明一点的做法,可以使用 ElasticSearch 来存储知识库。ES 基于 Lucene,具有强大的全文检索功能。通过 ES 插入数据时,它会对文本进行切词,然后采用一种倒排索引的方式,记录词与数据之间的关系。

问题匹配时,同样会对用户提问作切词处理,然后从之前建立的索引中查找,按照匹配程度排序并返回记录。

词袋模型

词袋模型可以看看之前的 智能客服打造系列(上)

可以把所有的词都放进词袋中,也可以作过滤,根据过滤规则的不同,又可以衍生出不同的匹配算法。比如,可以过滤停用词或者是仅保留文本中的主体(名词)和意图(动词)。

深度学习

使用深度神经网络实现问题匹配的都应归属在这个范畴,根据特征提取所使用的网络结构不同,又可以细分为 CNN、RNN、Transformer 等。最终都需要将文本转换为句子向量,再加上一层神经网络计算句子向量间的相似值,训练则是不断提高相似文本的相似值的过程。

CNN 方向可以看下 TextCNN、ABCNN,部分实现可以参考 智能客服打造系列(中) 提到的 InsuranceQA。RNN 则建议了解下 ESIM(Enhanced LSTM for Natural Language Inference),附 论文地址代码实现

Transformer 方面可以直接看谷歌开源的 BERT,我们项目用 BERT 在 fine-tune 情况下做了个文本分类的尝试,准确率高达 99.9%。没有 fine-tune 的情况下,使用 BERT 提供词向量服务,外接了个全连接层并简单调了参,二分类的准确率也能达到 93%。

知识图谱

深度神经网络试图去模拟大脑的运转,通过一次次地训练,使用模型可以应对特定的任务。虽然目前深度学习极度火热,由于其较高的准确率,应用范围也比较广,但是其不可解释性是不容忽视的。大多数情况下,是根据模型的实际效果来解释网络结构、参数设置,需要通过大量的实践来优化模型。

知识图谱将知识以图的形式存储,赋予字符串新的意义而不再是单纯的字符串或者一堆无法解释的数字。目前知识图谱技术用得最好的应该是谷歌了,其次是国内的搜索引擎大咖 —— 百度。

对知识图谱的建立和使用感兴趣的,推荐了解 neo4j —— 目前最完善的图数据库。