作者:家牛 筱豪 莫残 简枫
关于老和山炼丹所
大家好,我是炼丹师家牛,来自老和山炼丹所,我们所坐落于西子湖畔美丽的老和山脚下,平日专职炼制各种NLP灵丹妙药,包括对话系统、问答系统、图学习、强化学习、对抗学习等。
这是我们炼丹所第一篇文章,讲述我们去年在智源 BAAI-JDDC 多轮对话比赛的夺冠历程。
前言
去年国庆节前夕,我们在网上看到智源主办京东承办的多轮对话比赛,想到我们所主要的业务就是在炼制多轮对话的丹药,和这方向挺接近的,并且也想将之前做的技术创新在这份数据上验证下,就联合所里几个炼丹师报了名。基本都是晚上及周末业余时间在做,可能是这次多轮比赛题目和我们平时做的业务场景比较匹配,最后在参赛的254支队伍中以较大优势夺得了冠军。
比赛介绍
京东提供了100万条已脱敏的用户与在线客服对话数据,比赛分为初赛复赛和决赛三个阶段。
初赛是只提供了用户与客服对话的前三轮为要预测的对话前文,从第四轮对话开始只提供用户问题,需要程序输出针对每个问题的回复,由系统自动计算程序输出与真实人工回复之间的 BLEU 值。如下图所示,在给定的前三轮对话前文里面,针对每一个客户的问题,给出一个或者多个候选的客服回答。赛题详细说明可以参考 http://jddc.jd.com/description。

复赛则是采用人工评测的方式,找了10位资深的客服小二,以一些 Topic(如退货、购物等)来与每支队伍提交的程序进行真实的对话,并按"任务完成率 x 50% + 对话满意度 x 30% + 任务完成效率x 20%”三个维度进行打分,总分100分。复赛前6名,再进行现场答辩,角逐一二三等奖。
比赛思路
首先说下我们看到比赛题目之后的一些思路。
做业务相关的问答对话,一般做法是建立知识库,再做基于知识库的问答。但建设一个完备的知识库比较麻烦,需要懂业务的人员参与审核,且成本高。因为我们对京东的业务并不熟悉,所以说这个方案是行不通的。于是我们的思路是采用检索模型和生成模型做整体的召回,再通过一个打分模型对召回的内容做排序,最后将排序结果高的内容作为回答展示给用户。
在我们设计的方案中,只会去利用人工对话的数据,并且不需要额外做打标。整体的方案处理流程如下图所示。

下面详细介绍一下我们这次比赛取得第一的方案。
方案介绍
我们设计的方案包含检索模型、生成模型,打分模型三部分,下面分别来介绍。
检索模型
对于某个用户问题,如果在历史对话记录中有相同或相近的问题出现过,那么之前客服的回复很可能就是最适合回复。
检索模型的主要工作是问答对的挖掘,以及问题的表示和召回处理。
我们整体检索方案如下图所示。

问答挖掘,把对话中用户说的话当作问题,客服说的话当成答案,拆分成问答对,如果多条回答都对应同一相同问题,只选其中 TopN 条答案。
每个问题都表示为一个多维向量,使用 WAM 字向量求平均的方式表示。 向量索引使用的是 HNSW 库,是一个非常高效和高质量的向量检索库。
另外,针对多轮对话场景,在每轮对话的检索中还加入上文信息。我们做了一个业务闲聊分类的模型,判断每一句用户说的话是业务还是闲聊,在每次检索时,会把用户前面两轮的业务问题也作为输入加上。
闲聊和业务分类模型是用的 FastText。
检索模型这一块整体来说,速度快,并且返回的回答和问题还比较相关。
生成模型
检索模型效率高,并且效果也不错,但是有个很明显的缺点就是因为检索得到的对话都是以前出现过的,对于之前没有出现过的新问题则处理的不太好。为了解决这个问题,我们很自然的想到了要使用生成模型。
生成模型可以看作是一种归纳和总结知识的方式,根据对话前文,生成客服可能说的话。 生成模型一般是 seq2seq 先把文本编码为向量再做解码,比如 LSTM、GRU等。GPT/GPT2 是很强大的生成模型,但是当时业界并没有发布中文的预训练模型和代码。BERT 虽然有发布中文版模型,但它是双向前后文都看的,不适合作为生成模型的训练。于是我们把 BERT 的MASK 机制改了下,让在训练过程中每个待生成的词只能看到它前面的词,如下图。在生成时,就按 GPT 的方式,每次生成一个词直到结束符。

同时,我们在 BERT 的 Embedding Layer 针对多轮对话里面的角色用 0 和 1 加以区分。
我们总结了这种做法的优缺点,如下,
优点:复用了预训练好的中文BERT模型,生成有质量比较高。
缺点:但在生成每一个词时,都要把整个前文计算一遍。所以它的速度比较慢。
另外我们尝试了,如果生成时采用 beam-search 的方式,生成的多个句子相似度都比较高,有覆盖面不够的风险;而如果使用随机采样的方式,生成的效果又可能不够好。
为了控制模型生成的质量和多样性,我们加入了 TopK 采样机制。 即每个位置在生成时,只以TopK 个概率最高的词为候选,把其它词被选中的概率都置为 0。
生成模型蒸馏
在提交人工评测结果前,了解到线上程序是在 CPU 上运行的,我们试了下生成模型在 CPU 上每次处理要 1-2 分钟,人工肯定是无法忍受的。于是我们在截止时期前一天晚上,紧急训练了一版蒸馏模型,且修改了调用逻辑,只在对检索回答打分比较低的情况下才调用生成模型。
蒸馏模型的训练如下图,经过把 12 层 BERT 模型蒸馏为 4 层,模型运行效率显著提升。因为总体打分考虑了任务的人工满意度,所以这个蒸馏技术也对最后复赛得分有较好的贡献。

打分模型
打分模型实际上是个在给定已有上文时,针对某条回复是否合适的分类模型。 借鉴 BERT 语言模型训练的 NSP(下一句话预测)方式,我们把一通对话按轮次进行拆分。如下图,假如一通对话有 M 轮 ,拆分为 2M 条样本,其中正样本和负样本各M条。训练一个正负样本识别的分类模型,模型准确率为93%。

有了打分模型之后,便可以对检索模型和生成模型产出的结果进行打分排序,然后再将得分高的结果展示给用户作为回答。
实验结果
我们将线上评测的结果当作模型的消融分析实验,能够体现出我们方案的一个迭代过程,如下表所示。

DLM-Gen-TopK-HNSW 即我们取得最好成绩的模型,这里简单介绍一下其他对比的模型
- Dialog Language Model (DLM):Baseline 模型,只使用了检索模型和打分模型。
- DLM-Generation:在 Baseline 模型的基础上,加入了生成模型的结果做融合打分排序。
- DLM-Gen-TopK:优化生成模型,加入 TopK 采样。
- DLM-Gen-TopK-HNSW:优化检索模型,加入 HNSW,提高向量检索的质量。
复赛和决赛
复赛时进行评测客服小二不知道大家的初赛得分和排名,比较客观公正的打分取前6名,导致之前预赛排第二的队伍没有能进到决赛。。。(替他们感到惋惜)。最终我们老和山炼丹所在预赛和初赛都以较大优势取得了第一(具体排名可以参考这个网站,特别注意下,“我要钱”这支队伍是比赛组织者系统测试的账号,不纳入实际排名)。
感谢
感谢智源和京东组织的多轮对话比赛。本次智源大会邀请了图灵奖、美国三院院士和 ACM Fellow 等众多知名学术界大牛,以及微软、华为、阿里巴巴、腾讯、滴滴、京东、依图科技等工业界代表来作报告。智源人工智能研究院是 2018 年在科技部和北京市政府支持下成立的,当时联合了北京多个 Top 高校和企业,投入巨大,政策支持非常充分,今后的影响力应该也会越来越大。另外京东为这次比赛提供了100多万通脱敏后的客服对话数据,对于大家之后相关的研究也起到了很好的帮助作用。
联系我们
我们炼丹所最近也在招实习炼丹师和社招炼丹师,欢迎给我们所来信。
邮箱地址:alexcui.chb@antfin.com
联系人:崔所长
欢迎优秀的炼丹师加入我们,一起打造更好的NLP灵丹妙药。
来源:oschina
链接:https://my.oschina.net/u/4321646/blog/4270098