写点什么

语义检索系统:基于 Milvus 搭建召回系统抽取向量进行检索,加速索引

  • 2023-08-02
    浙江
  • 本文字数:15249 字

    阅读完需:约 50 分钟

语义检索系统:基于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 的使用场景如下所示:


2. 环境依赖和安装说明

环境依赖


  • python >= 3.6.2

  • paddlepaddle >= 2.2

  • paddlenlp >= 2.2

  • milvus >= 2.1.0

  • pymilvus >= 2.1.0

  • 代码结构


|—— scripts    |—— feature_extract.sh  提取特征向量的bash脚本    |—— search.sh  插入向量和向量检索bash脚本├── base_model.py # 语义索引模型基类├── config.py  # milvus配置文件├── data.py # 数据处理函数├── milvus_ann_search.py # 向量插入和检索的脚本├── inference.py # 动态图模型向量抽取脚本├── feature_extract.py # 批量抽取向量脚本├── milvus_util.py # milvus的工具类└── README.md
复制代码

4. 数据准备

数据集的样例如下,有两种,第一种是 title+keywords 进行拼接;第二种是一句话。


煤矸石-污泥基活性炭介导强化污水厌氧消化煤矸石,污泥,复合基活性炭,厌氧消化,直接种间电子传递睡眠障碍与常见神经系统疾病的关系睡眠觉醒障碍,神经系统疾病,睡眠,快速眼运动,细胞增殖,阿尔茨海默病城市道路交通流中观仿真研究智能运输系统;城市交通管理;计算机仿真;城市道路;交通流;路径选择....
复制代码

数据集下载

├── milvus # milvus建库数据集    ├── milvus_data.csv.  # 构建召回库的数据├── recall  # 召回(语义索引)数据集    ├── corpus.csv # 用于测试的召回库    ├── dev.csv  # 召回验证集    ├── test.csv # 召回测试集    ├── train.csv  # 召回训练集    ├── train_unsupervised.csv # 无监督训练集├── sort # 排序数据集    ├── test_pairwise.csv   # 排序测试集    ├── dev_pairwise.csv    # 排序验证集    └── train_pairwise.csv  # 排序训练集
复制代码


!pip install -r requirements.txt
复制代码


#解压数据集# !unzip -d /home/aistudio/literature_search_data /home/aistudio/data/data225060/literature_search_data.zip
复制代码


#数据查看import csv
def show_data(filename, num_rows=10): with open(filename, 'r') as f: reader = csv.reader(f) header = next(reader) # 获取表头 print(header) # 打印表头
for i, row in enumerate(reader): if i < num_rows: # 打印前num_rows行数据 print(row) else: break line = '-' * 100 print(line)
show_data('/home/aistudio/literature_search_data/milvus/milvus_data.csv', num_rows=5)
复制代码


['wodem又出了花月瑶的鞋']['黄电容信仰加持']['15、andy从废柴到欧洲巡演发唱片到学会了一个人生活,errol长大了声线粗了也有了自己的同龄朋友,这是我看过最好的英剧前三。']['结语:随着国家“二孩”政策的放开,越来越多的消费者倾向于购买空间更宽敞,舒适性更强的mpv车型。']['玩一慧?']['Study of New Driving Force for Quality Improvement of the Cultivation of Applied College Talents - Centering on Career Planning for College Students']----------------------------------------------------------------------------------------------------
复制代码

5. 向量检索

5.1 基于 Milvus 的向量检索系统搭建

数据准备结束以后,开始搭建 Milvus 的语义检索引擎,用于语义向量的快速检索,使用Milvus开源工具进行召回,Milvus 的搭建教程请参考官方教程 Milvus官方安装教程本案例使用的是 Milvus 的 2.1 版本,建议使用官方的 Docker 安装方式,简单快捷。


Milvus 搭建完系统以后就可以插入和检索向量了,首先生成 embedding 向量,每个样本生成 256 维度的向量,使用的是 32GB 的 V100 的卡进行的提取:

5.1.1 生成 embedding 向量

#默认GPU,A100下需要转换1h20min!CUDA_VISIBLE_DEVICES=0 python feature_extract.py \        --model_dir=./output \        --model_name_or_path rocketqa-zh-base-query-encoder \        --corpus_file "/mnt/data_1/model/Vector_retrieval/literature_search_data/milvus/milvus_data.csv"
复制代码


/opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.  warnings.warn("Setuptools is replacing distutils.")--- Running analysis [ir_graph_build_pass]I0713 16:49:07.969594  6532 executor.cc:187] Old Executor is Running.--- Running analysis [ir_analysis_pass]--- Running IR pass [map_op_to_another_pass]--- Running IR pass [identity_scale_op_clean_pass]--- Running IR pass [is_test_pass]--- Running IR pass [simplify_with_basic_ops_pass]--- Running IR pass [delete_quant_dequant_linear_op_pass]--- Running IR pass [delete_weight_dequant_linear_op_pass]--- Running IR pass [constant_folding_pass]--- Running IR pass [silu_fuse_pass]--- Running IR pass [conv_bn_fuse_pass]--- Running IR pass [conv_eltwiseadd_bn_fuse_pass]--- Running IR pass [embedding_eltwise_layernorm_fuse_pass]--- Running IR pass [multihead_matmul_fuse_pass_v2]I0713 16:49:08.685951  6532 fuse_pass_base.cc:59] ---  detected 12 subgraphs--- Running IR pass [vit_attention_fuse_pass]--- Running IR pass [fused_multi_transformer_encoder_pass]--- Running IR pass [fused_multi_transformer_decoder_pass]--- Running IR pass [fused_multi_transformer_encoder_fuse_qkv_pass]--- Running IR pass [fused_multi_transformer_decoder_fuse_qkv_pass]--- Running IR pass [multi_devices_fused_multi_transformer_encoder_pass]--- Running IR pass [multi_devices_fused_multi_transformer_encoder_fuse_qkv_pass]--- Running IR pass [multi_devices_fused_multi_transformer_decoder_fuse_qkv_pass]--- Running IR pass [fuse_multi_transformer_layer_pass]--- Running IR pass [gpu_cpu_squeeze2_matmul_fuse_pass]--- Running IR pass [gpu_cpu_reshape2_matmul_fuse_pass]--- Running IR pass [gpu_cpu_flatten2_matmul_fuse_pass]--- Running IR pass [gpu_cpu_map_matmul_v2_to_mul_pass]I0713 16:49:09.470413  6532 fuse_pass_base.cc:59] ---  detected 38 subgraphs--- Running IR pass [gpu_cpu_map_matmul_v2_to_matmul_pass]--- Running IR pass [matmul_scale_fuse_pass]--- Running IR pass [multihead_matmul_fuse_pass_v3]--- Running IR pass [gpu_cpu_map_matmul_to_mul_pass]--- Running IR pass [fc_fuse_pass]I0713 16:49:09.519965  6532 fuse_pass_base.cc:59] ---  detected 38 subgraphs--- Running IR pass [fc_elementwise_layernorm_fuse_pass]I0713 16:49:09.542423  6532 fuse_pass_base.cc:59] ---  detected 24 subgraphs--- Running IR pass [conv_elementwise_add_act_fuse_pass]--- Running IR pass [conv_elementwise_add2_act_fuse_pass]--- Running IR pass [conv_elementwise_add_fuse_pass]--- Running IR pass [transpose_flatten_concat_fuse_pass]--- Running IR pass [conv2d_fusion_layout_transfer_pass]--- Running IR pass [transfer_layout_elim_pass]--- Running IR pass [auto_mixed_precision_pass]--- Running IR pass [inplace_op_var_pass]I0713 16:49:09.547497  6532 fuse_pass_base.cc:59] ---  detected 1 subgraphs--- Running analysis [save_optimized_model_pass]W0713 16:49:09.548242  6532 save_optimized_model_pass.cc:28] save_optim_cache_model is turned off, skip save_optimized_model_pass--- Running analysis [ir_params_sync_among_devices_pass]I0713 16:49:09.548257  6532 ir_params_sync_among_devices_pass.cc:51] Sync params from CPU to GPU--- Running analysis [adjust_cudnn_workspace_size_pass]--- Running analysis [inference_op_replace_pass]--- Running analysis [ir_graph_to_program_pass]I0713 16:49:09.937587  6532 analysis_predictor.cc:1660] ======= optimize end =======I0713 16:49:09.937990  6532 naive_executor.cc:164] ---  skip [feed], feed -> token_type_idsI0713 16:49:09.938001  6532 naive_executor.cc:164] ---  skip [feed], feed -> input_idsI0713 16:49:09.938807  6532 naive_executor.cc:164] ---  skip [elementwise_div_1], fetch -> fetch[2023-07-13 16:49:09,939] [    INFO] - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'rocketqa-zh-base-query-encoder'.[2023-07-13 16:49:09,939] [    INFO] - Downloading https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_base_zh_vocab.txt and saved to /home/aistudio/.paddlenlp/models/rocketqa-zh-base-query-encoder[2023-07-13 16:49:10,063] [    INFO] - Downloading ernie_3.0_base_zh_vocab.txt from https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_base_zh_vocab.txt100%|████████████████████████████████████████| 182k/182k [00:00<00:00, 3.51MB/s][2023-07-13 16:49:10,249] [    INFO] - tokenizer config file saved in /home/aistudio/.paddlenlp/models/rocketqa-zh-base-query-encoder/tokenizer_config.json[2023-07-13 16:49:10,249] [    INFO] - Special tokens file saved in /home/aistudio/.paddlenlp/models/rocketqa-zh-base-query-encoder/special_tokens_map.json  0%|                                              | 0/10000000 [00:00<?, ?it/s]W0713 16:49:20.130687  6532 gpu_resources.cc:119] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 11.2, Runtime API Version: 11.6W0713 16:49:20.137218  6532 gpu_resources.cc:149] device: 0, cuDNN Version: 8.4.100%|███████████████████████████| 10000000/10000000 [1:27:15<00:00, 1910.02it/s]
复制代码


执行过程部分展示:


8.0, Driver API Version: 11.2, Runtime API Version: 11.6W0713 16:49:20.137218  6532 gpu_resources.cc:149] device: 0, cuDNN Version: 8.4.100%|███████████████████████████| 10000000/10000000 [1:27:15<00:00, 1910.02it/s]运行时长:5269.243秒结束时间:2023-07-13 18:16:52
复制代码


其中 output 目录下存放的是召回的 Paddle Inference 静态图模型。参考项目,导出自己的静态图模型:语义检索系统:基于in-batch Negatives策略的有监督训练语义召回



运行结束后会生成 corpus_embedding.npy

5.1.2 把向量插入到 Milvus 库

生成了向量后,需要把数据插入到 Milvus 库中,首先修改配置:


修改 config.py 的配置 ip 和端口,本项目使用的是 8530 端口,而 Milvus 默认的是 19530,需要根据情况进行修改:


MILVUS_HOST='your milvus ip'MILVUS_PORT = 8530
复制代码


然后运行下面的命令把向量插入到 Milvus 库中:


这里会有比较多的坑下面总结一下:



其中:docker-compose.yml 文件也放在项目根目录了。


# !python milvus_ann_search.py --data_path /home/aistudio/literature_search_data/milvus/milvus_data.csv \#                             --embedding_path corpus_embedding.npy \#                             --batch_size 1000 \#                             --insert
复制代码


参数含义说明


  • data_path: 数据的路径

  • embedding_path: 数据对应向量的路径

  • index: 选择检索向量的索引,用于向量检索

  • insert: 是否插入向量

  • search: 是否检索向量

  • batch_size: 表示的是一次性插入的向量的数量



  • 插入过程进程:


Number of entities in Milvus: 9406000Does collection literature_search exist in Milvus: TrueNumber of entities in Milvus: 9406000100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 9975/10000 [23:27<00:02, 11.53it/s]Does collection literature_search exist in Milvus: TrueNumber of entities in Milvus: 9406000
复制代码


另外,Milvus 提供了可视化的管理界面,可以很方便的查看数据,安装地址为Attu.



# #运行召回脚本:# !python milvus_ann_search.py --data_path /home/aistudio/literature_search_data/milvus/milvus_data.csv \#                             --embedding_path corpus_embedding.npy \#                             --batch_size 1000 \#                             --index 18 \#                             --search
复制代码


运行以后的结果的输出为:


=== start connecting to Milvus     ===

=== Connect collection literature_search ===
time cost 0.28903651237487793 shit: id: 18, distance: 0.0, entity: {'pk': 18, 'text': '吉林铁合金集团资产管理现状分析及对策资产管理;资金控制;应收帐款风险;造价控制;集中化财务控制'}, text field: 吉林铁合金集团资产管理现状分析及对策资产管理;资金控制;应收帐款风险;造价控制;集中化财务控制hit: id: 3447131, distance: 0.4164842963218689, entity: {'pk': 3447131, 'text': '完善国有资产经营管理体制和有效监管形式,防止国有资产流失,实现保值增值。'}, text field: 完善国有资产经营管理体制和有效监管形式,防止国有资产流失,实现保值增值。hit: id: 9189138, distance: 0.42778316140174866, entity: {'pk': 9189138, 'text': '加强国有企业资产管理的有效措施探析国有企业,资产管理,保值增值'}, text field: 加强国有企业资产管理的有效措施探析国有企业,资产管理,保值增值hit: id: 9702226, distance: 0.43116235733032227, entity: {'pk': 9702226, 'text': '国有资产管理工作的理论基础与合理策略国资,国有资产保值增值,理论基础,国有资产管理'}, text field: 国有资产管理工作的理论基础与合理策略国资,国有资产保值增值,理论基础,国有资产管理hit: id: 4845361, distance: 0.43486106395721436, entity: {'pk': 4845361, 'text': '加强国有资产管理、保障国有资产安全社会主义制度,资产安全,国有资产保值增值,国有资产管理体制改革,物质基础,社会职能,国有资产管理体系,财产权利,经济建设,资产管理制度'}, text field: 加强国有资产管理、保障国有资产安全社会主义制度,资产安全,国有资产保值增值,国有资产管理体制改革,物质基础,社会职能,国有资产管理体系,财产权利,经济建设,资产管理制度hit: id: 8007081, distance: 0.4396001100540161, entity: {'pk': 8007081, 'text': '以核心企业主导的装配式建筑供应链金融风险研究与应用建筑企业;供应链金融;财务管理;风险识别'}, text field: 以核心企业主导的装配式建筑供应链金融风险研究与应用建筑企业;供应链金融;财务管理;风险识别hit: id: 8771703, distance: 0.44080764055252075, entity: {'pk': 8771703, 'text': '拟定国有资产管理的有关政策和规章;'}, text field: 拟定国有资产管理的有关政策和规章;hit: id: 1728735, distance: 0.4446617662906647, entity: {'pk': 1728735, 'text': '基于价值链会计的钢铁制造企业成本管理研究钢铁行业;成本管理体系;价值链会计;财务框架'}, text field: 基于价值链会计的钢铁制造企业成本管理研究钢铁行业;成本管理体系;价值链会计;财务框架hit: id: 4639662, distance: 0.446344792842865, entity: {'pk': 4639662, 'text': '关于加强国有企业资产管理的思考国有企业,资产管理,国有资产'}, text field: 关于加强国有企业资产管理的思考国有企业,资产管理,国有资产hit: id: 2088649, distance: 0.44682809710502625, entity: {'pk': 2088649, 'text': '加强国有资产监管,确保国有资产保值增值。'}, text field: 加强国有资产监管,确保国有资产保值增值。hit: id: 9613810, distance: 0.44720369577407837, entity: {'pk': 9613810, 'text': '关于加强国有企业资产管理的思考国有企业,资产管理,思考'}, text field: 关于加强国有企业资产管理的思考国有企业,资产管理,思考hit: id: 8809465, distance: 0.4491455852985382, entity: {'pk': 8809465, 'text': '负责市级直接管理企业的国有资产的基础管理工作,监交国有资产收益,并提出国有资产预算编制草案;'}, text field: 负责市级直接管理企业的国有资产的基础管理工作,监交国有资产收益,并提出国有资产预算编制草案;hit: id: 393027, distance: 0.4522324204444885, entity: {'pk': 393027, 'text': '调查研究国有资产管理中的重大问题,提出国有资产调整方案以及加强国有资产管理的政策建议;'}, text field: 调查研究国有资产管理中的重大问题,提出国有资产调整方案以及加强国有资产管理的政策建议;hit: id: 5888623, distance: 0.45243215560913086, entity: {'pk': 5888623, 'text': '我国国有资产管理现状分析与对策研究国有资产;管理;研究'}, text field: 我国国有资产管理现状分析与对策研究国有资产;管理;研究hit: id: 6423627, distance: 0.4537673890590668, entity: {'pk': 6423627, 'text': '强化国有资产监督管理,确保国有资产收益最大化。'}, text field: 强化国有资产监督管理,确保国有资产收益最大化。hit: id: 2038200, distance: 0.45380961894989014, entity: {'pk': 2038200, 'text': '浅谈企业如何提高资产管理水平企业,资产管理,提高水平,措施'}, text field: 浅谈企业如何提高资产管理水平企业,资产管理,提高水平,措施
...
复制代码


返回的是向量的距离,向量的 id,以及对应的文本。


也可以一键执行上述的过程:


sh scripts/search.sh
复制代码

5.2 文本检索

首先修改代码的模型路径和样本:


params_path='checkpoints/model_40/model_state.pdparams'id2corpus={0:'国有企业引入非国有资本对创新绩效的影响——基于制造业国有上市公司的经验证据'}
复制代码


# !unzip /home/aistudio/data/data225060/checkpoints.zip
复制代码


Archive:  /home/aistudio/data/data225060/checkpoints.zip  inflating: checkpoints/inbatch/model_90/vocab.txt    inflating: checkpoints/inbatch/model_90/model_state.pdparams    inflating: checkpoints/inbatch/model_90/tokenizer_config.json    inflating: checkpoints/inbatch/model_90/special_tokens_map.json    inflating: checkpoints/inbatch/recall_log/default.talqnj.log    inflating: checkpoints/inbatch/recall_log/workerlog.0    inflating: checkpoints/inbatch/recall_log/default.gpu.log    inflating: checkpoints/simcse_inbatch_negative/model_300/special_tokens_map.json    inflating: checkpoints/simcse_inbatch_negative/model_300/vocab.txt    inflating: checkpoints/simcse_inbatch_negative/model_300/tokenizer_config.json    inflating: checkpoints/simcse_inbatch_negative/model_300/model_state.pdparams  
复制代码


#运行命令# !python inference.py
复制代码


# cd /home/aistudio/checkpoints
复制代码


/home/aistudio/checkpoints
复制代码


运行的输出为,分别是抽取的向量和召回的结果:


[1, 256]Tensor(shape=[1, 256], dtype=float32, place=Place(gpu:0), stop_gradient=True,       [[ 0.07830613, -0.14036864,  0.03433795, -0.14967985, -0.03386058,          0.06630671,  0.01357946,  0.03531205,  0.02411086,  0.02000865,          0.05724005, -0.08119474,  0.06286906,  0.06509133,  0.07193415,   ....hit: (distance: 0.40141725540161133, id: 2742485), text field: 完善国有企业技术创新投入机制的探讨--基于经济责任审计实践国有企业,技术创新,投入机制hit: (distance: 0.40258315205574036, id: 1472893), text field: 企业技术创新与组织冗余--基于国有企业与非国有企业的情境研究hit: (distance: 0.4121206998825073, id: 51831), text field: 企业创新影响对外直接投资决策—基于中国制造业上市公司的研究企业创新;对外直接投资;制造业;上市公司hit: (distance: 0.42234909534454346, id: 8682312), text field: 政治关联对企业创新绩效的影响——国有企业与民营企业的对比政治关联,创新绩效,国有企业,民营企业,双重差分hit: (distance: 0.46187296509742737, id: 9324797), text field: 财务杠杆、股权激励与企业创新——基于中国A股制造业经验数据制造业;上市公司;股权激励;财务杠杆;企业创新....
复制代码



6.FAQ

6.1 抽取文本语义向量后,利用 Milvus 进行 ANN 检索查询到了完全相同的文本,但是计算出的距离为什么不是 0?

Milvus 是一个基于向量的相似度搜索引擎,它使用欧氏距离或内积来度量向量之间的相似性。尽管两个向量可能代表完全相同的文本内容,但由于计算过程中的浮点数舍入误差等原因,计算出的距离可能会接近于 0,但不会完全等于 0。因此,在实际应用中,当使用 Milvus 进行 ANN(Approximate Nearest Neighbor)近似最近邻搜索时,我们通常会设置一个阈值来判断两个向量是否相似。可以根据实际需求,选择一个适当的阈值来确定相似度的界限,并根据距离的大小进行筛选和排序。


使用的是近似索引,详情请参考 Milvus 官方文档,索引创建机制

7.更多 Milvus 信息

7.1 API 参考文档

7.2 Milvus 系统配置相关文档

7.3 Milvus 技术细节相关文档

7.4 milvus 常见问题

还有其他问题? 请参考以下文档


7.5 Milvus 相关工具

为来优化开发者的 Milvus 体验,我们推出来一下几款工具:


7.6 应用示例

为了使开发者更好的了解和使用 Milvus,我们创建了一系列完整的示例应用。


这些项目源码都已经上传在 Github 上,也给出了详细的快速搭建和代码详解文档。


  • 图像视频检索


深度学习模型最开始就是用来对图像、视频等进行处理,通过训练可以精准的提取图片、视频中的特征从而对图片、视频进行分类,打标签,以图搜图,以图搜视频等等。Milvus 凭借其出色的性能和数据管理能力,可以支持各种深度学习模型,实现对海量图片和视频的高性能分析检索能力。


十分钟轻松搭建以图搜图系统


视频分析 —— 教你如何快速检测视频中的目标物体


  • 智能问答机器人


传统的问答机器人大都是基于规则的知识图谱方式实现,这种方式需要对大量的语料进行分类整理。而基于深度学习模型的实现方式可以彻底摆脱对语料的预处理,只需提供问题和答案的对应关系,通过自然语言处理的语义分析模型对问题库提取语义特征向量存入 Milvus 中,然后对提问的问题也进行语义特征向量提取,通过对向量特征的匹配就可以实现自动回复,轻松实现智能客服等应用。


手把手教你快速搭建一个问答机器人


  • 音频数据处理


利用深度学习模型对音频数据进行分析和处理能够大大提高语音识别的准确率,而其核心也是对相关音频切片进行向量化处理并且通过向量距离的计算来判断其表达的含义,因此,Milvus 在语音、音乐等音频数据处理领域的也有丰富的应用。


音频分析 —— 相似音频检索


  • 化学分子式相似性分析


在传统的数据处理领域也存在大量向量计算的场景,使用传统的计算方式需要消耗大量的算力而 Milvus 凭借先进的算法可以在同等算力资源下将向量数据处理能力提高至少两个数量级。


分子结构相似性分析,助力药物分子虚拟筛选


  • 推荐系统


该项目是 Milvus 结合 PaddleRec 实现的一个电影推荐系统中的召回服务,已经发布在 AI Studio 上,你可以进入该项目中快速体验。


PaddleRec与Milvus深度结合,手把手带你体验工业级推荐系统召回速度

7.7 在线项目体验

不会搭建?搭建太耗时?想要一秒体验上述项目。


不用担心,上述应用示例中给出的项目,我们都提供了在线服务供用户体验。


7.8 用户案例

  • 基于 Milvus 的相似视频检索

  • 由于大量视频内容高度重复,为提升视频内容推荐的体验,多媒体处理平台需要在视频审核时过滤内容过于相似的视频。本案例中,通过将一个视频抽取为多个关键帧的特征向量(这里将一个视频视为多张图片的集合)。在查询相似视频时,先计算图⽚相似度,再计算图⽚集间的相似度,最终得出视频间的相似度。对于图片间的相似度计算,可以将图片通过深度学习模型转化为特征向量,然后利用 Milvus 向量搜索引擎来计算图片特征向量的相似度。

  • 电商平台中基于 Milvus 的拍照购物的实现

  • 近几年,网络购物平台日益流行,大众对网购的热情也日益高涨。但是大部分传统购物网站只支持关键词搜索,当用户无法用词汇准确描述商品时,就很难搜索到心仪的商品。因此,通过图片搜索相似产品,能够帮助用户更准确地找到想要的商品。为方便用户体验快捷的一站式购物,本案例的用户推出拍照购功能。如果消费者在影视屏幕、广告牌、报刊杂志、行人身上等任何地方看到自己喜欢的商品,他们只需拍照并上传,便可找到相似商品。

  • 病毒 APK 检测

  • 本项目主要用于构建移动安全 APP。工作流程为爬取 Google play 等平台上的外部 APK (Android application package,即 Android 应用程序包),运用特定算法检测出携带病毒的 APK,然后将表示该 APK 的向量存入 Milvus 中。然后使用 Milvus 在 APK 病毒库中对外部 APK 进行相似性检索。如发现外部某 APK 与库中携带病毒的 APK 相似,需要及时通知企业与个人用户相关的病毒信息。

  • 基于 Milvus 的钓鱼网站的检测

  • 在海量信息中,不乏非法分子利用网络骗取用户信任并从中获利,钓鱼网站就是其中之一。“钓鱼”网站的网址、网页内容、布局等与真实网站极其相似,没有安全意识的网民容易因此上当受骗,造成严重后果。现有的比较典型的检测钓鱼网站的方法有:基于黑白名单机制的检测,基于文本特征或网页图像特征的匹配检测,和基于机器学习的分类检测。然而,基于黑白名单的检测方法时效性较差,名单范围也存在着不足;基于特征的算法的准确性和鲁棒性又不是很理想。近年来,机器学习应用于各领域并取得巨大成功,尤其是将深度学习应用于检测识别可以有效得提高检测效率。因此我们结合深度学习与 Milvus 向量搜索引擎,以提高对钓鱼网站的正确检测率和检测速度。

  • 基于语义向量的内容召回

  • 本案例主要用于浏览器的推荐系统中,用以寻找用户可能感兴趣的新闻。首先通过提取用户历史浏览新闻的关键词,获得用户感兴趣的关键词。之后,基于这些关键词从海量文章中快速查找用户感兴趣的文章,根据点击率判断新闻热度,最终确定推荐给用户的新闻。这里我们将新闻语义向量存入 Milvus 中,然后将用户历史浏览新闻的关键词转化为语义向量,在库中查找语义相似的新闻。

  • Milvus 在音乐推荐平台的应用

  • 在用户的音乐平台库中有海量的音乐,其首要任务是如何基于用户的历史行为,从海量音乐中筛选出用户感兴趣的音乐。在本案例中首先将歌曲转成梅尔频谱图,然后设计 CNN 网络来提取特征向量,作为歌曲的表征。最后通过查找相似向量来实现音乐推荐。


更多 Milvus 用户案例请参考 https://zilliz.blog.csdn.net/


更多内容请关注:公众号:汀丶人工智能




参考链接:


Milvus 介绍:https://aistudio.baidu.com/aistudio/projectdetail/1910614

发布于: 22 分钟前阅读数: 5
用户头像

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引_自然语言处理_汀丶人工智能_InfoQ写作社区