语义检索系统:基于 Milvus 搭建召回系统抽取向量进行检索,加速索引
语义检索系统:基于 Milvus 搭建召回系统抽取向量进行检索,加速索引
目标:使用 Milvus 搭建召回系统,然后使用训练好的语义索引模型,抽取向量,插入到 Milvus 中,然后进行检索。
语义搜索系列文章全流程教学:
更多文本匹配方案参考:
这个项目完成的同学,那我们举例整体的推荐系统就只差排序环节,这次基于 milvus 向量索引会遇到一些问题,请大家耐心看我给出的文档说明,慢慢解决。
1.Milvus 简介(2019)
1.1 什么是向量检索
向量是具有一定大小和方向的量,可以简单理解为一串数字的集合,就像一行多列的矩阵,比如:[2,0,1,9,0,6,3,0]。每一行代表一个数据项,每一列代表一个该数据项的各个属性。
特征向量是包含事物重要特征的向量。大家比较熟知的一个特征向量是 RGB (红-绿-蓝)色彩。每种颜色都可以通过对红(R)、绿(G)、蓝(B)三种颜色的比例来得到。这样一个特征向量可以描述为:颜色 = [红,绿,蓝]。
向量检索是指从向量库中检索出距离目标向量最近的 K 个向量。一般我们用两个向量间的欧式距离,余弦距离等来衡量两个向量间的距离,一次来评估两个向量的相似度。
1.2 Milvus 简介
点击进入 Milvus 官网。
Milvus 创建于 2019 年,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习(ML)模型生成的大量嵌入向量。作为一个专门设计用于处理输入向量查询的数据库,它能够在万亿规模上对向量进行索引。与现有的关系数据库主要按照预定义的模式处理结构化数据不同,Milvus 是从自底向上设计的,以处理从非结构化数据转换而来的嵌入向量。
Milvus 是一款开源的向量数据库,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点。Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,Milvus 支持数据分区分片、数据持久化、增量数据摄取、标量向量混合查询、time travel 等功能,同时大幅优化了向量检索的性能,可满足任何向量检索场景的应用需求,提供了一整套简单直观的 API,让你可以针对不同场景选择不同的索引类型。此外,Milvus 还可以对标量数据进行过滤,进一步提高了召回率,增强了搜索的灵活性。
Milvus 采用共享存储架构,存储计算完全分离,计算节点支持横向扩展。从架构上来看,Milvus 遵循数据流和控制流分离,整体分为了四个层次:分别为接入层(access layer)、协调服务(coordinator service)、执行节点(worker node)和存储层(storage)。各个层次相互独立,独立扩展和容灾。
随着互联网的发展和发展,非结构化数据变得越来越普遍,包括电子邮件、论文、物联网传感器数据、Facebook 照片、蛋白质结构等等。为了让计算机理解和处理非结构化数据,使用嵌入技术将这些数据转换为向量。Milvus 存储并索引这些向量。Milvus 能够通过计算两个向量的相似距离来分析它们之间的相关性。如果两个嵌入向量非常相似,则表示原始数据源也非常相似。Milvus 向量数据库专为向量查询与检索设计,能够为万亿级向量数据建立索引。与现有的主要用作处理结构化数据的关系型数据库不同,Milvus 在底层设计上就是为了处理由各种非结构化数据转换而来的 Embedding 向量而生。
在服务端,Milvus 由 Milvus Core 和 Meta Store 两部分组成:
Milvus Core 存储与管理向量和标量数据。
Meta Store 存储与管理 SQLite 和 MySQL 中的元数据,分别用于测试和生产。
Milvus 服务器采用主从式架构 (Client-server model),整体架构:
1.3 产品优势
全面的相似性指标
:Milvus 支持各种常用的向量相似度计算指标,包括欧氏距离、内积、汉明距离和杰卡德距离等。高性能
:Milvus 基于高度优化的 Approximate Nearest Neighbor Search (ANNS) 索引库构建,包括 faiss、 annoy、和 hnswlib 等。您可以针对不同使用场景选择不同的索引类型。动态数据管理
:您可以随时对数据进行插入、删除、搜索、更新等操作而无需受到静态数据带来的困扰。高成本效益
:Milvus 充分利用现代处理器的并行计算能力,可以在单台通用服务器上完成对十亿级数据的毫秒级搜索。近实时搜索
:在插入或更新数据之后,您可以几乎立刻对插入或更新过的数据进行搜索。Milvus 负责保证搜索结果的准确率和数据一致性。支持多种数据类型和高级搜索
: Milvus 的数据记录中的字段支持多种数据类型。高扩展性和可靠性
:您可以在分布式环境中部署 Milvus。如果要对集群扩容或者增加可靠性,您只需增加节点。云原生
:您可以轻松在公有云、私有云、或混合云上运行 Milvus。简单易用
:Milvus 提供了易用的 Python、Java、Go 和 C++ SDK,另外还提供了 RESTful API。
1.4 Milvus 应用场景
你可以使用 Milvus 搭建符合自己场景需求的向量相似度检索系统。Milvus 的使用场景如下所示:
图片检索系统
:以图搜图,从海量数据库中即时返回与上传图片最相似的图片。视频检索系统
:将视频关键帧转化为向量并插入 Milvus,便可检索相似视频,或进行实时视频推荐。音频检索系统
:快速检索海量演讲、音乐、音效等音频数据,并返回相似音频。分子式检索系统
:超高速检索相似化学分子结构、超结构、子结构。推荐系统
:根据用户行为及需求推荐相关信息或商品。智能问答机器人
:交互式智能问答机器人可自动为用户答疑解惑。DNA 序列分类系统
:通过对比相似 DNA 序列,仅需几毫秒便可精确对基因进行分类。文本搜索引擎
:帮助用户从文本数据库中通过关键词搜索所需信息。更多资料参考:
2. 环境依赖和安装说明
环境依赖
python >= 3.6.2
paddlepaddle >= 2.2
paddlenlp >= 2.2
milvus >= 2.1.0
pymilvus >= 2.1.0
代码结构
4. 数据准备
数据集的样例如下,有两种,第一种是 title+keywords 进行拼接;第二种是一句话。
数据集下载
5. 向量检索
5.1 基于 Milvus 的向量检索系统搭建
数据准备结束以后,开始搭建 Milvus 的语义检索引擎,用于语义向量的快速检索,使用Milvus开源工具进行召回,Milvus 的搭建教程请参考官方教程 Milvus官方安装教程本案例使用的是 Milvus 的 2.1 版本,建议使用官方的 Docker 安装方式,简单快捷。
Milvus 搭建完系统以后就可以插入和检索向量了,首先生成 embedding 向量,每个样本生成 256 维度的向量,使用的是 32GB 的 V100 的卡进行的提取:
5.1.1 生成 embedding 向量
执行过程部分展示:
其中 output 目录下存放的是召回的 Paddle Inference 静态图模型。参考项目,导出自己的静态图模型:语义检索系统:基于in-batch Negatives策略的有监督训练语义召回
运行结束后会生成 corpus_embedding.npy
5.1.2 把向量插入到 Milvus 库
生成了向量后,需要把数据插入到 Milvus 库中,首先修改配置:
修改 config.py 的配置 ip 和端口,本项目使用的是 8530 端口,而 Milvus 默认的是 19530,需要根据情况进行修改:
然后运行下面的命令把向量插入到 Milvus 库中:
这里会有比较多的坑下面总结一下:
issue 总结
解决方案:
针对第一个问题:我在 aistudio 中运行,是不能访问外网还, 在本地就可以很好的运行
针对第二个问题:这里会遇到两个错误,总结一下就是:--batch_size 不能设置太大;要小于 64MB,不然通信数据传输会出错 2.词嵌入字符长度不能超过 1000,暂时影响不大
RPC error: [batch_insert], <MilvusException: (code=1, message=the length (1027) of 7940th string exceeds max length (1000))>, <Time:{'RPC start': '2023-07-21 17RPC error: [batch_insert], <MilvusException: (code=1, message=the length (1092) of 734th string exceeds max length (1000))>, <Time:{'RPC start': '2023-07-21 17:44:15.949226', 'RPC error': '2023-07-21 17:44:16.494690'}>
Milvus insert error: <MilvusException: (code=1, message=the length (1092) of 734th string exceeds max length (1000))>RPC error: [batch_insert], <MilvusException: (code=1, message=the length (1074) of 121th string exceeds max length (1000))>, <Time:{'RPC start': '2023-07-21 17:45:46.076491', 'RPC error': '2023-07-21 17:45:46.115044'}>Milvus insert error: <MilvusException: (code=1, message=the length (1074) of 121th string exceeds max length (1000))>
针对第三个问题:Milvus 只起到加速的效果,这个跟模型相关,并且关键字匹配不推荐使用语义检索,如果是句子级别的匹配,使用语义检索更合适;推荐进行双路召回【语义+关键字】
进入重点如何启动 milvus 向量库以及涉及到 docker 使用等,我把遇到问题总结成一份文档,遇到问题请参考下文:
一文带你入门向量数据库milvus:含docker安装、milvus安装使用、attu 可视化,完整指南启动 Milvus 进行了向量相似度搜索
其中:docker-compose.yml 文件也放在项目根目录了。
参数含义说明
data_path
: 数据的路径embedding_path
: 数据对应向量的路径index
: 选择检索向量的索引,用于向量检索insert
: 是否插入向量search
: 是否检索向量batch_size
: 表示的是一次性插入的向量的数量
插入过程进程:
另外,Milvus 提供了可视化的管理界面,可以很方便的查看数据,安装地址为Attu.
运行以后的结果的输出为:
返回的是向量的距离,向量的 id,以及对应的文本。
也可以一键执行上述的过程:
5.2 文本检索
首先修改代码的模型路径和样本:
运行的输出为,分别是抽取的向量和召回的结果:
6.FAQ
6.1 抽取文本语义向量后,利用 Milvus 进行 ANN 检索查询到了完全相同的文本,但是计算出的距离为什么不是 0?
Milvus 是一个基于向量的相似度搜索引擎,它使用欧氏距离或内积来度量向量之间的相似性。尽管两个向量可能代表完全相同的文本内容,但由于计算过程中的浮点数舍入误差等原因,计算出的距离可能会接近于 0,但不会完全等于 0。因此,在实际应用中,当使用 Milvus 进行 ANN(Approximate Nearest Neighbor)近似最近邻搜索时,我们通常会设置一个阈值来判断两个向量是否相似。可以根据实际需求,选择一个适当的阈值来确定相似度的界限,并根据距离的大小进行筛选和排序。
使用的是近似索引,详情请参考 Milvus 官方文档,索引创建机制
7.更多 Milvus 信息
7.1 API 参考文档
Python SDK 项目源码: Pymilvus
pymilvus:使用手册
Java SDK 项目源码: milvus-sdk-java
java SDk: 使用手册
Go SDK 项目源码: milvus-sdk-go
Go SDK:使用手册
RESTful SDK 项目源码及使用手册: milvus-sdk-restful
C++ SDK 项目源码及使用手册: milvus-sdk-c++
7.2 Milvus 系统配置相关文档
7.3 Milvus 技术细节相关文档
7.4 milvus 常见问题
还有其他问题? 请参考以下文档
7.5 Milvus 相关工具
为来优化开发者的 Milvus 体验,我们推出来一下几款工具:
Milvus Enterprise Manager: Milvus 服务端图形化交互与管理工具
Milvus Sizing Tool: 硬件配置估算工具
MilvusDM:Milvus 数据迁移工具
7.6 应用示例
为了使开发者更好的了解和使用 Milvus,我们创建了一系列完整的示例应用。
这些项目源码都已经上传在 Github 上,也给出了详细的快速搭建和代码详解文档。
图像视频检索
深度学习模型最开始就是用来对图像、视频等进行处理,通过训练可以精准的提取图片、视频中的特征从而对图片、视频进行分类,打标签,以图搜图,以图搜视频等等。Milvus 凭借其出色的性能和数据管理能力,可以支持各种深度学习模型,实现对海量图片和视频的高性能分析检索能力。
智能问答机器人
传统的问答机器人大都是基于规则的知识图谱方式实现,这种方式需要对大量的语料进行分类整理。而基于深度学习模型的实现方式可以彻底摆脱对语料的预处理,只需提供问题和答案的对应关系,通过自然语言处理的语义分析模型对问题库提取语义特征向量存入 Milvus 中,然后对提问的问题也进行语义特征向量提取,通过对向量特征的匹配就可以实现自动回复,轻松实现智能客服等应用。
音频数据处理
利用深度学习模型对音频数据进行分析和处理能够大大提高语音识别的准确率,而其核心也是对相关音频切片进行向量化处理并且通过向量距离的计算来判断其表达的含义,因此,Milvus 在语音、音乐等音频数据处理领域的也有丰富的应用。
化学分子式相似性分析
在传统的数据处理领域也存在大量向量计算的场景,使用传统的计算方式需要消耗大量的算力而 Milvus 凭借先进的算法可以在同等算力资源下将向量数据处理能力提高至少两个数量级。
推荐系统
该项目是 Milvus 结合 PaddleRec 实现的一个电影推荐系统中的召回服务,已经发布在 AI Studio 上,你可以进入该项目中快速体验。
PaddleRec与Milvus深度结合,手把手带你体验工业级推荐系统召回速度
7.7 在线项目体验
不会搭建?搭建太耗时?想要一秒体验上述项目。
不用担心,上述应用示例中给出的项目,我们都提供了在线服务供用户体验。
7.8 用户案例
由于大量视频内容高度重复,为提升视频内容推荐的体验,多媒体处理平台需要在视频审核时过滤内容过于相似的视频。本案例中,通过将一个视频抽取为多个关键帧的特征向量(这里将一个视频视为多张图片的集合)。在查询相似视频时,先计算图⽚相似度,再计算图⽚集间的相似度,最终得出视频间的相似度。对于图片间的相似度计算,可以将图片通过深度学习模型转化为特征向量,然后利用 Milvus 向量搜索引擎来计算图片特征向量的相似度。
近几年,网络购物平台日益流行,大众对网购的热情也日益高涨。但是大部分传统购物网站只支持关键词搜索,当用户无法用词汇准确描述商品时,就很难搜索到心仪的商品。因此,通过图片搜索相似产品,能够帮助用户更准确地找到想要的商品。为方便用户体验快捷的一站式购物,本案例的用户推出拍照购功能。如果消费者在影视屏幕、广告牌、报刊杂志、行人身上等任何地方看到自己喜欢的商品,他们只需拍照并上传,便可找到相似商品。
本项目主要用于构建移动安全 APP。工作流程为爬取 Google play 等平台上的外部 APK (Android application package,即 Android 应用程序包),运用特定算法检测出携带病毒的 APK,然后将表示该 APK 的向量存入 Milvus 中。然后使用 Milvus 在 APK 病毒库中对外部 APK 进行相似性检索。如发现外部某 APK 与库中携带病毒的 APK 相似,需要及时通知企业与个人用户相关的病毒信息。
在海量信息中,不乏非法分子利用网络骗取用户信任并从中获利,钓鱼网站就是其中之一。“钓鱼”网站的网址、网页内容、布局等与真实网站极其相似,没有安全意识的网民容易因此上当受骗,造成严重后果。现有的比较典型的检测钓鱼网站的方法有:基于黑白名单机制的检测,基于文本特征或网页图像特征的匹配检测,和基于机器学习的分类检测。然而,基于黑白名单的检测方法时效性较差,名单范围也存在着不足;基于特征的算法的准确性和鲁棒性又不是很理想。近年来,机器学习应用于各领域并取得巨大成功,尤其是将深度学习应用于检测识别可以有效得提高检测效率。因此我们结合深度学习与 Milvus 向量搜索引擎,以提高对钓鱼网站的正确检测率和检测速度。
本案例主要用于浏览器的推荐系统中,用以寻找用户可能感兴趣的新闻。首先通过提取用户历史浏览新闻的关键词,获得用户感兴趣的关键词。之后,基于这些关键词从海量文章中快速查找用户感兴趣的文章,根据点击率判断新闻热度,最终确定推荐给用户的新闻。这里我们将新闻语义向量存入 Milvus 中,然后将用户历史浏览新闻的关键词转化为语义向量,在库中查找语义相似的新闻。
在用户的音乐平台库中有海量的音乐,其首要任务是如何基于用户的历史行为,从海量音乐中筛选出用户感兴趣的音乐。在本案例中首先将歌曲转成梅尔频谱图,然后设计 CNN 网络来提取特征向量,作为歌曲的表征。最后通过查找相似向量来实现音乐推荐。
更多 Milvus 用户案例请参考 https://zilliz.blog.csdn.net/
更多内容请关注:公众号:汀丶人工智能
参考链接:
Milvus 介绍:https://aistudio.baidu.com/aistudio/projectdetail/1910614
版权声明: 本文为 InfoQ 作者【汀丶人工智能】的原创文章。
原文链接:【http://xie.infoq.cn/article/938f8c27013e3b773f56ef6fe】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论