2.2.2 召回模块

召回模块需要从千万量级数据中快速召回候选数据。首先需要抽取语料库中文本的 Embedding,然后借助向量搜索引擎实现高效 ANN,从而实现候选集召回。

我们针对不同的数据情况推出三种语义索引方案,如下图所示,您可以参照此方案,快速建立语义索引:

⭐️ 无监督数据

⭐️ 有监督数据

召回方案



SimCSE



In-batch Negatives



SimCSE+ In-batch Negatives

最基本的情况是只有无监督数据,我们推荐您使用 SimCSE 进行无监督训练;另一种方案是只有有监督数据,我们推荐您使用 In-batch Negatives 的方法进行有监督训练。

如果想进一步提升模型效果:还可以使用大规模业务数据,对预训练模型进行 Domain-adaptive Pretraining,训练完以后得到预训练模型,再进行无监督的 SimCSE。

此外,如果您同时拥有监督数据和无监督数据,我们推荐将两种方案结合使用,这样能训练出更加强大的语义索引模型。

2.2.3 排序模块

排序模块基于前沿的预训练模型 ERNIE-Gram,训练 Pair-wise 语义匹配模型。召回模型负责从海量(千万级)候选文本中快速(毫秒级)筛选出与 Query 相关性较高的 TopK Doc,排序模型会在召回模型筛选出的 TopK Doc 结果基础之上针对每一个 (Query, Doc) Pair 对进行两两匹配计算相关性,排序效果更精准。

3. 文献检索实践

3.1 技术方案和评估指标

3.1.1 技术方案

语义索引:由于我们既有无监督数据,又有有监督数据,所以结合 SimCSE 和 In-batch Negatives 方案,并采取 Domain-adaptive Pretraining 优化模型效果。

首先是利用 ERNIE 1.0 模型进行 Domain-adaptive Pretraining,在得到的预训练模型基础上,进行无监督的 SimCSE 训练,最后利用 In-batch Negatives 方法进行微调,得到最终的语义索引模型,把建库的文本放入模型中抽取特征向量,然后把抽取后的向量放到语义索引引擎 milvus 中,利用 milvus 就可以很方便得实现召回了。

排序:使用 ERNIE-Gram 的单塔结构对召回后的数据精排序。

3.1.2 评估指标

模型效果指标

  • 在语义索引召回阶段使用的指标是 Recall@K,表示的是预测的前topK(从最后的按得分排序的召回列表中返回前K个结果)结果和语料库中真实的前 K 个相关结果的重叠率,衡量的是检索系统的查全率。
  • 在排序阶段使用的指标为AUC,AUC反映的是分类器对样本的排序能力,如果完全随机得对样本分类,那么AUC应该接近0.5。分类器越可能把真正的正样本排在前面,AUC越大,分类性能越好。

性能指标

  • 基于 Paddle Inference 快速抽取向量
  • 建库性能和 ANN 查询性能快

3.2 数据说明

数据集来源于某文献检索系统,既有大量无监督数据,又有有监督数据。

(1)采用文献的 query, title,keywords,abstract 四个字段内容,构建无标签数据集进行 Domain-adaptive Pretraining;

(2)采用文献的 query,title,keywords 三个字段内容,构造无标签数据集,进行无监督召回训练SimCSE;

(3)使用文献的的query, title, keywords,构造带正标签的数据集,不包含负标签样本,基于 In-batch Negatives 策略进行训练;

(4)在排序阶段,使用点击(作为正样本)和展现未点击(作为负样本)数据构造排序阶段的训练集,使用ERNIE-Gram模型进行精排训练。

阶段

模型

训练集

评估集(用于评估模型效果)

召回库

测试集

召回

Domain-adaptive Pretraining

2kw

-

-

-

召回

无监督预训练 - SimCSE

798w

20000

300000

1000

召回

有监督训练 - In-batch Negatives

3998

20000

300000

1000

排序

有监督训练 - ERNIE-Gram单塔 Pairwise

1973538

57811

-

1000

我们将除 Domain-adaptive Pretraining 之外的其他数据集全部开源,下载地址:

├── milvus # milvus建库数据集
    ├── milvus_data.csv.  # 构建召回库的数据(模拟实际业务线上的语料库,实际语料库远大于这里的规模),用于直观演示相关文献召回效果
├── recall  # 召回阶段数据集
    ├── train_unsupervised.csv # 无监督训练集,用于训练 SimCSE
    ├── train.csv  # 有监督训练集,用于训练 In-batch Negative
    ├── dev.csv  # 召回阶段验证集,用于评估召回模型的效果,SimCSE 和 In-batch Negative 共用
    ├── corpus.csv # 构建召回库的数据(模拟实际业务线上的语料库,实际语料库远大于这里的规模),用于评估召回阶段模型效果,SimCSE 和 In-batch Negative 共用
    ├── test.csv # 召回阶段测试数据,预测文本之间的相似度,SimCSE 和 In-batch Negative 共用
├── sort # 排序阶段数据集
    ├── train_pairwise.csv  # 排序训练集
    ├── dev_pairwise.csv    # 排序验证集
    └── test_pairwise.csv   # 排序测试集

3.3 运行环境和安装说明

(1)运行环境

本实验采用了以下的运行环境进行,详细说明如下,用户也可以在自己 GPU 硬件环境进行:

a. 软件环境:

  • python >= 3.6
  • paddlenlp >= 2.2.1
  • paddlepaddle-gpu >=2.2
  • CUDA Version: 10.2
  • NVIDIA Driver Version: 440.64.00
  • Ubuntu 16.04.6 LTS (Docker)

b. 硬件环境:

  • NVIDIA Tesla V100 16GB x4卡
  • Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz

c. 依赖安装:

pip install -r requirements.txt