Milvus 实战 | Milvus 与 BERT 搭建文本搜索

2020-08-05 14:20:10 浏览数 (1)

Google 的 BERT 模型在 NL 领域中具有巨大的影响力。它是一个通用的语言表示模型,可以应用于诸多领域。本文的项目是将 Milvus 与 BERT 模型结合搭建文本搜索引擎,使用 BERT 模型将文本数据转成向量,结合 Milvus 特征向量相似度搜索引擎可以快速搜索相似文本。

| 关键技术

1

Milvus

Milvus 是一款开源向量相似度搜索引擎,建立在 Faiss、NMSLIB、Annoy 等向量索引库基础之上,具有功能强大、稳定可靠以及易于使用等特点。Milvus 集成了这些向量索引库,对外提供了一套简单而一致的 API 。除了提供针对向量的近实时搜索能力外,Milvus 可以对标量数据进行过滤。随着数据和查询规模的增加,Milvus 还提供了集群分片的解决方案,支持读写分离、水平扩展、动态扩容等功能,实现了对于超大数据规模的支持。

2

BERT

BERT 模型是 Google 发布的一个新的语言表达模型(Language Representation Model),全称是 Bidirectional Encoder Representations from Transformers,即双向编码表征模型。BERT 模型的优势体现在两方面。

  • 一方面,它使用基于特别设计的注意力机制(Attention Mechanism)的简单全连接网络取代了复杂的 CNN 和 RNN 网络。不但大大减少了训练时间,同时有效地提升了网络性能。
  • 另一方面,BERT 模型是第一个真正捕获上下文语义信息的预训练语言表示模型。这是因为 BERT 模型使用了 Transformer 作为算法的主要框架,而 Transformer 框架能更彻底地捕捉语句中的双向关系。

Google 提供了一些预先训练的模型,其中最基本的两个模型是BERT-base 模型和 BERT-large 模型。具体参数如下表所示:

BERT-base 模型和 BERT-large 模型的参数总量大小和网络层数不同,BERT-large 模型所占计算机内存较多,所以本文项目选用 BERT-base 模型对文本数据进行向量转化。(注:其中,层数(即 Transformer 块个数)表示为 L,隐藏尺寸表示为 H ,自注意力头数表示为 A 。)

数据来源

本项目所需的新闻数据集包含两个部分:一个标题集,一个文本集。文本集与标题集是一一对应的,存在 data 目录下(data 目录下面的数据是经过预处理的)。数据集来源于和鲸社区的中文新闻数据集 (注1),有将近 14w 条数据。

整体架构

本文的文本搜索引擎项目使用的 Milvus 整体架构如图所示:

(注:深蓝色线为数据导入过程,橘黄色线为用户查询过程。)

  1. 首先,本文项目使用开源的 bert-as-service ,使用 BERT 做为句子编码器,将新闻标题数据转化为固定长度为 728 维的特征向量,并导入 Milvus 库。
  2. 然后,对存入 Milvus 库中的特征向量进行存储并建立索引,同时 Milvus 会给这些特征向量分配一个 ID,将 ID 和对应的新闻标题和文本存储在 PostgreSQL 中。
  3. 最后,用户输入一个新闻标题,BERT 将其转成特征向量。Milvus 对特征向量进行相似度检索,得到相似的新闻标题的 ID ,在 PostgreSQL 中找出 ID 对应的新闻标题和文本返回。在后续界面展示中可以看到新闻文本搜索的一个例子。

实现步骤

下面我们来看一下 BERT 模型与 Milvus 搭建的文本搜索引擎实现的关键步骤。详细步骤可参考 GitHub 项目(注2)。

1. 安装 Milvus

Milvus 提供两个发行版本:CPU 版本和 GPU 版本。为了得到更优的查询性能,项目中使用的是 GPU 版本。具体安装方法参考 Milvus 文档

2. 安装 PostgreSQL

PostgreSQL 是一个强大的、开源的对象关系数据库系统。PostgreSQL 在可靠性、稳定性、数据一致性等性能方面表现不错。具体安装方法参考PostgreSQL 官网

3. 安装 bert-as-service

使用 bert-as-service 将标题集转化为特征向量,以便 Milvus 后续进行相似度检索。更多安装细节可参考 bert-as-service 的 Github 存储库(注3)。

代码语言:javascript复制
代码语言:javascript复制
#下载模型
$ wget https://storage.googleapis.com/BERT_models/2018_11_03/chinese_L-12_H-768_A-12.zip
#启动服务
$ BERT-serving-start -model_dir chinese_L-12_H-768_A-12/ -num_worker=12 -max_seq_len=40
4. 数据导入
在项目中的 Milvus-bert-server 文件的 main.py 文本数据导入脚本。用户只需要修改脚本中的标题集路径和文本集路径,即可运行脚本进行文本数据导入。
代码语言:javascript复制
代码语言:javascript复制
python main.py --collection test11 --title data/title.txt --version data/version.txt --load
5. 启动查询服务
在项目中启动查询服务,然后在浏览器中进行文本搜索,得到最终的文本搜索结果。
代码语言:javascript复制
python app.py

| 界面展示

打开 http://127.0.0.1:3001/search,下面是一个文本搜索的例子。首先进入搜索页面,输入“中国股市”,点击 Search 进行搜索。

可以得到与“中国股市”相关的新闻文本。比如图中所示的文本“中国股市吸引外资......”等。

| 总结展望

在 AI 高速发展的时代,我们可以使用深度学习模型去处理各种类型的非结构化数据,例如图片、文本、视频和语音等。本文项目通过 BERT 模型可以将这些非结构化数据提取为特征向量,然后通过 Milvus 对这些特征向量进行计算,实现对非结构化数据的分析与检索。

本文利用 Milvus 搭建的文本搜索引擎也只是其中一个场景,展示了 Milvus 在非结构化数据处理中的应用。欢迎大家导入自己的数据建立自己的文本搜索引擎。Milvus 向量相似度检索引擎可以兼容各种深度学习平台,搜索十亿向量仅需毫秒响应时间。你可以使用 Milvus 探索更多 AI 用法!我们还提供了其他应用场景以供参考,详见 Milvus 应用场景(注4)。

参考资料:

和鲸社区的中文新闻数据集:https://www.kesci.com/home/dataset/5d8878638499bc002c1148f7/filesGitHub 项目:https://github.com/milvus-io/bootcamp/blob/0.10.0/solutions/Textsys/README.mdbert-as-service:https://github.com/hanxiao/BERT-as-serviceMilvus 应用场景:https://milvus.io/cn/scenarios/

| 欢迎加入 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

0 人点赞