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 整体架构如图所示:
(注:深蓝色线为数据导入过程,橘黄色线为用户查询过程。)
- 首先,本文项目使用开源的 bert-as-service ,使用 BERT 做为句子编码器,将新闻标题数据转化为固定长度为 728 维的特征向量,并导入 Milvus 库。
- 然后,对存入 Milvus 库中的特征向量进行存储并建立索引,同时 Milvus 会给这些特征向量分配一个 ID,将 ID 和对应的新闻标题和文本存储在 PostgreSQL 中。
- 最后,用户输入一个新闻标题,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