MDDR:能够实现文本或图片两种模态多轮对话的检索,通过对海量多模态历史交互信息的检索召回与排序,实现对当前问题的应答。模型结构见下图。
模型子模块:
- 闲聊分类模块:
针对多轮对话场景,判断当前用户问题是否含有充足的业务信息。在对话过程中,系统会使用该模块对用户问题进行判断,如果当前信息不足以进行有意义的应答,则系统会加上上一轮的用户问题,进行检索召回。该模块示例使用fasttext模型实现,并随机挑选了2200条此次比赛训练集中出现的数据进行标注,其中标签**"1"表示该问题是缺乏业务知识的闲聊**,标签**"0"表示该问题含有业务知识**。 - 问答挖掘模型:
该模块处理大赛发布的文本训练集数据,按照原始数据中的自然顺序将用户的消息当做问题,将客服的消息当做当前问题的应答,并根据人为制定的规则和闲聊分类模型的结果,将含有充足业务信息的问题和应答作为文档知识库保存下来。通过训练多轮对话数据集构建QA文本知识库(注:当前示例业务逻辑依赖于闲聊分类模型,请先训练闲聊模型)。疑问点:构建QA文本知识库,并没有说如果当前Q的意图是chat, 而将上一次的Q作为当前A的Q, 而是直接将当前的QA对丢弃,不对此条数据构建知识库(这样势必会造成数据的损失), 而inference过程如果Q意图是chat, 会使用上轮Q的索引做当前轮的检索召回。 - 问答索引模块:
该模块将句子或图片转换成为稠密向量后,再建立相关索引,可以通过向量之间的的相似性,得到请求向量的相似向量,并可以得到索引前的原始对象。- 文本问答对知识库:
该模块将句子或图片转换成为稠密向量后,再建立相关索引,可以通过向量之间的的相似性,得到请求向量的相似向量,并可以得到索引前的原始对象。 - 图片问答对知识库:
会通过预训练Resent18模型提取问题图片特征,需要从Pytorch官网下载预训练esent18模型https://download.pytorch.org/models/resnet18-5c106cde.pth,并在程序运行前export相关路径。本示例将图片问答知识库中的图片问题提取特征建立了索引,在后面的处理中通过问图片问题的相似性进行候选应答的召回。
- 文本问答对知识库:
- 应答文本分类模块:
该模型以预训练的bert-base-chinese为基础,在大赛数据上自动构建Q-A对训练数据,使用bert中Next Sentence Prediction (NSP)(原理:简单的做分类任务,就是判断两个句子序列是不是前后关系,True->label_1, False->label_0)的任务对模型进行fine-tune。该模型可以对检索模型的召回结果进行排序, 从而得到最终的用户问题应答。 该模块以问答挖掘模块产生的文本问答知识库为数据资源,其中以知识库中存在的QA对,Q_n与A_n问答对作为正例,以Q_n与A_random问答对作为负例,构建用于该模型训练的数据。在生成了模型所需的训练数据后,即可进行该模型的训练。 - 召回与排序模块:
- 召回:
召回模块读取用户问题,并用闲聊模型进行判断,如果认为当前信息不充足,则会使用上轮用户问题进行检索。用户请求的句子会转换成平均词向量检索先前建立好的知识库,找出相似的候选QA对,并保存至临时文件test_text_recall.json;用户图片类问题请求通过预训练Resnet18提取特征后,检索图文问答知识库找出候选回答,并保存至临时文件test_safe_answer.json。代码详情如下:1. 获取有效Q,使用chat模型判断当前Q是否含有业务知识,不包含就获取上一轮的Q(但并没有判断上一轮的Q是否含有业务知识);2. 使用gensim.models.KeyedVectors模块计算Q的每个词向量的平均值作为句子的稠密向量;3. 与已建立的文本QA向量索引库进行匹配, 获取索引(即Q向量库对应向量的ID号,一般向量库的shape为(n, 200),n代表向量库一共有多少条向量,200代表每个向量长度,匹配获取就是最相似的是 0到n 中哪几条向量,并将其ID号返回,每个ID号在QA文本库中都对应一个A(答案),因为构建Q向量库就是根据QA文本知识库Q构建的,Q与A是一一对应的。向量索引检索召回,相似匹配距离是从大到小排序的,就是最相似的Q句子置于最后,一般不应该距离最近放最前面吗?);4. 根据索引在QA文档库中查找候选集。(image Q获取召回候选集的原理一样) - 排序:
排序模块会读取临时文件存储的召回结果,并通过应答文本分类模型判断召回的结果是否与用户问题相匹配,从而找到最优的文本召回答案,并结合先前图文检索的答案,得到最终答案并转换成线上评测所需要的文本格式。代码详情如下:1. 首先将召回候选文档集(一系列的QA对, sentence1(Q) 与sentence2(A)一一对应), 送入NSP模型分类, 判断QA对是否为上下文关系, 分类label为1代表有上下文关系,分类label为0代表没有上下文关系;2. 获取第一次NSP分类label为1的QA对, 以此时A作为当前文本问题的最佳回复;3. 图像问题的最佳回复, 就是最佳召回文本的第一条回复(sentence2)。
- 召回:
Reference: