来也对话机器人平台智能问答技术拆解
在我们的生活中,智能对话被广泛应用在客服、营销等重复性对话频繁发生的场景,或者作为GUI的补充,为用户提供高效、个性化的体验,甚至是直接集成到智能音箱、智能家居、智能导航等硬件设备中,独立承载人机交互的重担。
按照对话的智能程度,我们可以把智能问答分为5个阶段:单轮问答、多轮会话、意图推理、个性化以及情感互动。
而从问答的种类来讲,我们又可以将其分为Community QA、KBQA、TableQA、PassageQA、VQA这5大类。
智能问答工程实践
面对智能问答的广泛应用,本篇文章以如何搭建一套智能问答系统为切入点,深入浅出介绍一下在Community QA上所做的尝试。
1. 业务简介
我们再基于几个实际的例子看一下问答的使用场景:
- 第一类是常见的客服场景,询问产品、询问业务、询问经验,这类场景比较泛,他会衍生在生活中的各个方面,客服机器人相比传统的客服,他永不打烊,回答永远标准,而且面对各种刁钻甚至不友好的问题,都会永远积极正面地给出响应。
- 同时,该类问答机器人进一步深化拓宽到领域,会孵化出某些领域通用的机器人,比如HR领域,相信不同公司的HR,很大程度上面临的问题集合都是固定的,也就是说,垂直领域的问答机器人是可以有效渗透并横向复制给不同企业使用的。
- 在英语学习相关产品上,我们想给小孩报名英文课,但是不清楚课程内容和价格,那我们会问相关的问题。对于商家来讲,我们不仅是提问的人,还是潜在的商机,可能我们仅仅只想问一个问题,但是商家却希望能获得我们更多的信息,电话、小孩年纪、上课意向等,进而让我们留存下来最后能成功消费,类似的场景还有很多,我们把这一类应用场景叫营销机器人,它是商务团队的好帮手,能在多个平台自由切换,回答问题标准且及时,最终往往能通过更小的人力投入,获取更多的有效线索。
2. 问答建模
基于前面的例子,我们对问答场景有了更具体的画像,需要做什么已经很清晰了,那么怎么做呢,我们开始尝试对该问题进行建模。
首先是对知识的结构化表示:
- 用户问题我们用q表示;
- 一个问答对表示一条领域知识,我们把它叫做一个知识点ki;
- 答案我们定义为ai;
- 由于一个语义的问题可能有多种不同的表述方式,因此一个知识点的问题由多个不同的表述组成,这些表述都叫相似问pij;
- 一个领域的知识库,由多个知识点构成。
图2 知识库表示
我们为什么要用这种方式来管理知识,不用图表、也不用表格?
实际上,知识的管理方式是来源于实际业务场景的,这种方式非常易于维护,多个同义问题用一个知识点管理,也能减轻维护答案工作量,同一知识点下的问题也将会是很好的训练数据。
现在有了领域内知识库,用户提问后,我们还需要一个问答模型,这个模型能找到和用户query最匹配的问题,进而给出对应的答案,这里我们采用检索+匹配+排序的架构。
图3 问答建模流程
下图是基于知识库和问答模型在母婴场景的应用举例:
图4 QA应用举例
3.数据储备
图5 数据类型分布
在正式开始问答模型构建之前,我们需要思考目前有哪些数据可被我们使用,以及我们需要什么数据来支撑后续的工作。
通用领域的贴吧、豆瓣、微博、知道等问答数据,可被用来训练词向量,或是统计共现、互信息词典;人工标注的q/p对,可被用来训练有监督的分类模型;垂直领域的知识库可被用来训练领域相关的分类模型,也可用作词向量的fine-tune,当然也是有效的评估数据。
4. 模型迭代
图6 QA架构图
整体的QA架构图如图6所示,下面我们简单介绍一下历次迭代的思路。
1. BoW+LR
第一次迭代我们只引入了词袋(Bag of Words)模型,5维代表特征。
- Jaccard:q和p词交集个数与词并集个数的比值;
- Coverity:最长公共子串特征,q和p最长公共子串在p中的占比;
- Edit-Distance:最小编辑距离,q和p的最小编辑距离除以q、p长度的平均值;
- TM:共现特征,基于bigram/trigram词典,计算q、p共现词平均score、共现词最高score的平均值、共现词去除相同词后最高score的平均值共3维特征;
- MI:互信息特征,基于互信息词典,计算q、p两两词的互信息平均值。
上述特征集合,均由大数据文本的统计特征衍生而来,对句子的语义表示能力较弱。
2. BoW+WE+LR
第二次迭代我们给模型引入了一定的语义表示能力,对于了解深度学习、自然语言处理的同学来讲,word2vec在很多任务上都有着非常杰出的贡献,这一模型从不同角度刻画了周围词和当前词的关系。经过训练后,我们能得到一份词汇的向量表示。
图7 word2vec的2个模型
基于训练得到的词向量,我们采用IDF对词向量进行加权平均,以此得到q、p词粒度的句向量表示,并最终通过余弦相似度来度量两者的语义相关性。
图8 基于句子表示的w2v特征
通过余弦相似度给出的相似,本质上描述的还是两个词的相对一致,而且word2vec不考虑词序,余弦相似度大表示两个词搭配出现、或者和同一批词搭配出现的可能性较大,这一特征所显示出来的弊端就是往往相似度高的2个词具有可替换性但却语义不完全相同。
比如q=“宝宝感冒怎么办”,p=”宝宝发烧怎么办”,”感冒”和”发烧”互相替换,句子依然具有合理性,而且由于他们经常在同一批词汇中搭配出现,具有比较相似的分布特征,相关性比较高,然而他们语义并不同。
接下来我们引入另一种语义度量方法:WMD (the Word Mover’s Distance),它刻画了如何用最小的代价将q中的每个词以不同权重匹配到p中每个词上,这是一种基于句子间的交互来表示语义的方法。
图9 基于句子交互的WMD特征
在利用WMD计算q/p的相关性时,我们会对句子进行切词、去停,对于q中的每个词,找到p中的另一个词,进行语义转移,转移的代价我们用两个词汇间的word2vec余弦相似度来度量。
当2个词语义较相近时,我们可以多转移一点,如果语义相差很大,我们可以选择少转移或者不转移,最后使得所有转移的加权和最小,这里加权采用词频作为特征,具体示例如图10所示。
图10 the Word Mover’s Distance (WMD)
由于WMD也高度依赖word2vec词向量,因此上文提到的word2vec cosine特征所有的不足,WMD特征依旧存在,既没有考虑语序信息,同时对OOV (Out of Vocabulary)情况也很不友好,语义泛化能力弱,相似意图区分能力差。
3. BoW+WE+SE+fine-tune
前两次迭代都没有考虑知识库内的数据,比较适用于无语料或者语料较少的知识库,当知识库具有一定的规模后,正如前面提到的,同一个知识点下的相似问,将是很好的训练数据。
我们采用了fastText模型,充分利用知识点中的问题语义相同/相近这个事实作为监督信号,训练一个分类模型,直接用一个问题的词去预测问题所属的知识点。
FastText是Tomas Makolov为了弥补word2vec的某些不足而提出的改进方案,和word2vec中CBOW不同的是,它的输入不再是上下文,而是一整个句子,同时它接收子词和ngram特征,能捕捉到更多的信息。
比如单词的前后缀,以及词的语序特征等。相比其它深度学习模型,fastText结构简单,本质上是一个线性模型,不太适合处理较长或者线性不可分的样本,而对于偏线性的短文本分类任务却比较合适,能在较少训练集合的基础上,非常快速地得到不错的效果。
图11 fastText模型结构
同时fastText在训练过程中也会产生一份词向量,经实验验证,基于知识库训练fastText的词向量对基于大数据训练的word2vec词向量进行fine-tune,能一定程度上提升该领域的问答效果。
4. BoW+WE+SE+DM+fine-tune
前面我们利用一个知识库的相似问语义相近作为监督信号,从中抽取出了一个知识点的语义信息,但我们最终的目标是判断用户输入和相似问之间的相关性,这里我们使用一个深度学习的模型ESIM (Enhanced LSTM for Natural Language Inference),利用要比较的两句话的监督信号来训练模型,观察句对的交互对模型的影响。
图12 ESIM模型架构(左侧)
上图是ESIM的网络结构,它在众多短文本分类任务中都有不错的表现,主要在于输入2句话分别接embedding+BiLSTM, 利用BiLSTM学习一句话中的word和它上下文的关系后,在进行inference之前,会利用attention操作计算2个句子word之间的相似度来更新embedding,也就是说比较的两句话在模型训练中产生了交互,相比其它的类似网络只在最后一层求距离来讲,这种交互的影响能学到更全局的信息。
5. BERT+MTL+fine-tune
当然,学术界是在不断变化的,对于效果较好的模型,我们也需要进行尝试,寻找适合在工业界落地的条件和场景。
图13 BERT+多任务学习MTL框架图
在BERT横扫了11项NLP测评任务的效果后,我们把它应用在知识点分类任务上,期望利用BERT本身的优势,来提升分类任务的效果。同时我们还基于知识库数据,在BERT的基础上,通过MTL进行fine-tune,再以BERT-MTL为基础,通过单个任务分别进行fine-tune。
图14 BERT+MTL的fine-tune过程
5. 评估
图15 评估数据举例
效果变好了,有多好?肉眼可见显然不能作为一个反馈的指标,所以我们需要去科学地评估这些改进,评估这一环节我们选了6个不同领域,每个领域50个知识点,每个知识点12个相似问作训练,3个作评估测试,示例数据见图15,在此数据集基础上去评估准召和F1。具体结果见图16,大家可以看到在不卡阈值的情况下,准确率从0.8提升到了0.968。
图16 历次迭代评估数据表
迭代是一个循序渐进的过程,可能有人会有疑惑,我怎么知道要用什么特征、选哪个模型,从多次迭代的经验来讲,Badcase分析很重要,特征的设计一方面来源于你对问题的直观感知。
比如我们需要从多方面(统计层面、词汇表示、句子表示、句子间交互等)来设计方法对句子进行语义表示,另一方面来源于对模型现有Badcase的弥补,通过分析case表现出来的规律或者倾向来设计有针对性的特征。
同时学术界也在不断更新新的模型,3年前时兴的技术,到现在被完全替代的可能性是非常大的,因此我们需要与时俱进。
结语
整个智能问答系统升级的过程,主要围绕四个步骤进行,首先面对任务要理解问题的本质,对问题进行合理的建模,然后评估选择合适的语言工具去实现它,再由浅入深稳步迭代,形成数据、模型、反馈的闭环,最后就是要持续性学习,拥抱变化,拥抱技术。