相似问答检索——汽车之家的 Milvus 实践

✏️  作者介绍:

王寒&翟羽佳- 汽车之家认知智能组 NLP 算法工程师

 

| 项目背景

汽车之家作为中国汽车互联网平台,拥有全球最大的汽车社区论坛。多年来积累了丰富的用户问答数据,能够解决用户在看车、买车、用车等方面遇到的各种问题。针对用户在平台上提出的各种问题,从海量的高质量问答库中匹配语义最相似的问题和答案,能够及时满足用户需求,大大提升用户体验。

但汽车垂直领域的文本具有表达多样化、用语不规范(如:车型车系用语存在大量缩写、简写、语序颠倒等现象)、歧义性强(如:“北京”可能指汽车品牌,也可能指城市)等特点,这给传统基于关键词匹配的搜索方法带来了很大挑战。因此,我们在传统关键词匹配的基础上,进一步引入语义搜索技术,将精华问答库的问题映射为多维向量,进行语义匹配,提升问题匹配准确性。

在整个语义匹配搜索的实践过程中,我们也调研试用了 Annoy、Faiss、Elasticsearch(dense_vector) 和 Milvus 等工具。其中,Milvus 不仅集成了 Faiss、NMSLIB、Annoy 等向量索引算法库,而且提供了统一易用的接口、向量数据的高效管理和高性能部署等功能,能够较好地满足我们的项目需求,大大节约了开发成本。因此,我们选择 Milvus 作为后台问答数据的语义向量搜索引擎。

 

| 整体流程

相似问答检索项目是根据用户输入的问题,从已有的精华问答库中返回给用户最相似的 K 个问答。精华问答库是由人工收集、总结、整理的,涵盖了大量汽车领域的常用问答。整体流程主要分为两个阶段:召回和排序。

召回阶段我们采用两路召回的方式,分别是关键词召回和向量召回。在进行召回前,我们先将精华问答库存储在 Elasticsearch 中,并将其通过编码器输出的向量表示存储在 Milvus 数据库中。关键词召回是用户输入问题直接从 Elasticsearch 中检索出完全匹配的问答对;向量召回是用户输入问题,通过编码器编码后得到向量表示,然后在 Milvus 中进行向量检索,返回语义相近的问答对。请注意,对用户输入的问题使用的编码器和对精华问题使用的编码器必须是同一个编码器。

在排序阶段,召回阶段的输出作为排序阶段的输入,召回的文本根据排序模型的打分确定最终的排序结果。

整体流程如下图所示:

 

召回

召回阶段是将相似问答从精华问答库中取出,减少待排序问答的数据量。此处用了两种召回方式:关键词召回和向量召回。召回阶段需要保证召回率,而且面对全量数据,对处理速度的要求非常高。

 

关键词召回

用户输入的问题通过分词、纠错等预处理流程后,利用 BM25 算法对文本进行召回。此种召回方式的优势是精确匹配,准确率高,但同时也带来了一些问题。对于一些近义词,例如“宝马3系”和“宝马320”、“雷车”和“雷克萨斯”、“发动机”和“引擎”等召回率会偏低,而且分词等预处理流程中的错误也会带来一定的影响。

 

向量召回

向量召回就是给定一个向量,从向量库中找到与该向量最相似的 K 个向量。我们这里将精华问题构建成一个索引,用户输入问题和精华问题会被映射到同一个语义向量空间,通过 ANN 算法快速获得最相似的 K 个问答。在向量召回中有两个核心问题,一个是对文本的编码问题,也就是编码器的选择和训练方式;另一个是对向量索引的构建和检索的问题。

模型选择方面,我们选择 Sentence-BERT 模型[1]作为编码器来输出文本的向量表示,向量的余弦值用来度量两个文本语义的相似度。模型的网络结构如下图所示:

模型训练方面,我们先利用汽车之家的汽车领域语料进行模型预训练,然后利用人工标注数据对 Sentence-BERT 进行微调,模型结果可以达到业务要求。

模型优化方面,我们在训练过程中加入对抗训练,其基本原理就是通过添加扰动构造一些对抗样本,放给模型去训练。在加入对抗训练后,模型的泛化能力和鲁棒性有很大提升,不过训练过程收敛变慢,训练时间会变长。

向量检索方面,我们使用 Milvus 数据库来实现向量检索。Milvus 对全量精华问题的向量进行存储并建立索引,然后通过问题向量在 Milvus 中进行检索,Milvus 返回与问题向量最相似的 K 个结果。

 

排序

本阶段的目标是对上一阶段召回结果进行排序,既要保证响应时间,又要达到准确度的要求。主要思路是利用特征工程学习一个分类器,将类别“1”的概率值作为排序的分数,因此要点在于特征的设计和分类器的选择。

这个问题的本质是判断两个文本对象的关系,因此设计的特征尽量要从多个维度反映两个问题之间的关系。在这里我们参考了 IBM Watson 问答机器人在判断潜在答案是否正确上所做的工作[2][3]。该工作的主要任务是判断问题和答案之间的关系,与我们的任务相似。

我们在这里仿照 IBM 的思路构建了基本的评分器和特征提取器来获得基本的匹配得分和特征,主要包括:

  • 两个问题的长度

  • Skip-Gram Scorer

Psb  和 Qsb表示问题中的 skip-ngram 集合。

最终得分是上述两个分值的调和平均:

  • Term Match Scorer

对每一个 passage 计算匹配到的 term 的 idf 之和以及问题中所有 term 的 idf 之和。之所以用 idf,是因为不同词汇的重要性不一样。

  • Text Alignment Scorer

这里利用 Waterman-Smith 距离来计算对齐得分。和编辑距离或 Needleman-Wunsch 距离相比,此距离更偏重局部对齐,也就是最优的子序列的对齐。

  • Embedding Scorer

利用词向量平均获得问题向量,计算两个问题向量的相似性,包括基于字和基于词的相似性。

  • Entity Scorer

实体重合度得分。

  • Neural Scorer

可输入神经网络的输出。

在获得基本特征后,我们利用 GBDT 训练得到最终模型。

如上所述,本模块的优点在于结合了多种匹配特征,并可灵活进行配置和添加以达到预期的效果。实际应用表明,特征工程的分类器能够有效地综合关键词和语义的信息,对输出列表进行排序。

 

| 结语

本文介绍了汽车之家在相似问答检索上的实践,我们采用召回 + 排序的两阶段处理流程。在召回阶段,关键词和语义方面的两路召回能够取得较高的召回率,为下一阶段打好基础。在排序阶段,丰富的特征工程对召回文本从语义和字面信息的多重挖掘,使得排序模型输出的列表效果非常好;兼顾了准确性和响应时间,满足了业务需求,带给用户很好的体验。后期我们还将对排序过程进行优化,引入一些点赞数、回答者人物画像等特征来提升模型效果,带来更好的用户体验。

在当前这个文本、图像、音频等非结构化数据爆发增长的时代,通过 Embedding 技术将非结构化数据映射成多维向量后再进行检索已成为一个趋势。Milvus 作为分布式向量检索引擎,具有高性能、易部署的特性,极大地节省了项目开发成本,并显著提高了系统检索性能,很好地满足了技术和业务需求。期待在未来更丰富的业务场景中和 Milvus 再度合作。

 

 

参考文献

  1. Reimers, Nils, and Iryna Gurevych. "Sentence-bert: Sentence embeddings using siamese bert-networks." arXiv preprint arXiv:1908.10084 (2019).

  2. Gondek, David C., et al. "A framework for merging and ranking of answers in DeepQA." IBM Journal of Research and Development 56.3.4 (2012): 14-1.

  3. Murdock, J. William, et al. "Textual evidence gathering and analysis." IBM Journal of Research and Development 56.3.4 (2012): 8-1.

 

| 欢迎加入 Milvus 社区

github.com/milvus-io/milvus | 源码

milvus.io | 官网

milvusio.slack.com | Slack 社区

zhihu.com/org/zilliz-11/columns | 知乎

zilliz.blog.csdn.net | CSDN 博客

space.bilibili.com/478166626 | Bilibili