语义检索系统:基于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

  • 代码结构

  1. |—— scripts
  2. |—— feature_extract.sh 提取特征向量的bash脚本
  3. |—— search.sh 插入向量和向量检索bash脚本
  4. ├── base_model.py # 语义索引模型基类
  5. ├── config.py # milvus配置文件
  6. ├── data.py # 数据处理函数
  7. ├── milvus_ann_search.py # 向量插入和检索的脚本
  8. ├── inference.py # 动态图模型向量抽取脚本
  9. ├── feature_extract.py # 批量抽取向量脚本
  10. ├── milvus_util.py # milvus的工具类
  11. └── README.md

4. 数据准备

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

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

数据集下载

  1. ├── milvus # milvus建库数据集
  2. ├── milvus_data.csv. # 构建召回库的数据
  3. ├── recall # 召回(语义索引)数据集
  4. ├── corpus.csv # 用于测试的召回库
  5. ├── dev.csv # 召回验证集
  6. ├── test.csv # 召回测试集
  7. ├── train.csv # 召回训练集
  8. ├── train_unsupervised.csv # 无监督训练集
  9. ├── sort # 排序数据集
  10. ├── test_pairwise.csv # 排序测试集
  11. ├── dev_pairwise.csv # 排序验证集
  12. └── train_pairwise.csv # 排序训练集
  1. !pip install -r requirements.txt
  1. #解压数据集
  2. # !unzip -d /home/aistudio/literature_search_data /home/aistudio/data/data225060/literature_search_data.zip
  1. #数据查看
  2. import csv
  3. def show_data(filename, num_rows=10):
  4. with open(filename, 'r') as f:
  5. reader = csv.reader(f)
  6. header = next(reader) # 获取表头
  7. print(header) # 打印表头
  8. for i, row in enumerate(reader):
  9. if i < num_rows: # 打印前num_rows行数据
  10. print(row)
  11. else:
  12. break
  13. line = '-' * 100
  14. print(line)
  15. show_data('/home/aistudio/literature_search_data/milvus/milvus_data.csv', num_rows=5)
  1. ['wodem又出了花月瑶的鞋']
  2. ['黄电容信仰加持']
  3. ['15、andy从废柴到欧洲巡演发唱片到学会了一个人生活,errol长大了声线粗了也有了自己的同龄朋友,这是我看过最好的英剧前三。']
  4. ['结语:随着国家“二孩”政策的放开,越来越多的消费者倾向于购买空间更宽敞,舒适性更强的mpv车型。']
  5. ['玩一慧?']
  6. ['Study of New Driving Force for Quality Improvement of the Cultivation of Applied College Talents - Centering on Career Planning for College Students']
  7. ----------------------------------------------------------------------------------------------------

5. 向量检索

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

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

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

5.1.1 生成 embedding 向量

  1. #默认GPU,A100下需要转换1h20min
  2. !CUDA_VISIBLE_DEVICES=0 python feature_extract.py \
  3. --model_dir=./output \
  4. --model_name_or_path rocketqa-zh-base-query-encoder \
  5. --corpus_file "/mnt/data_1/model/Vector_retrieval/literature_search_data/milvus/milvus_data.csv"
  1. /opt/conda/envs/python35-paddle120-env/lib/python3.10/site-packages/_distutils_hack/__init__.py:33: UserWarning: Setuptools is replacing distutils.
  2. warnings.warn("Setuptools is replacing distutils.")
  3. [1m[35m--- Running analysis [ir_graph_build_pass][0m
  4. I0713 16:49:07.969594 6532 executor.cc:187] Old Executor is Running.
  5. [1m[35m--- Running analysis [ir_analysis_pass][0m
  6. [32m--- Running IR pass [map_op_to_another_pass][0m
  7. [32m--- Running IR pass [identity_scale_op_clean_pass][0m
  8. [32m--- Running IR pass [is_test_pass][0m
  9. [32m--- Running IR pass [simplify_with_basic_ops_pass][0m
  10. [32m--- Running IR pass [delete_quant_dequant_linear_op_pass][0m
  11. [32m--- Running IR pass [delete_weight_dequant_linear_op_pass][0m
  12. [32m--- Running IR pass [constant_folding_pass][0m
  13. [32m--- Running IR pass [silu_fuse_pass][0m
  14. [32m--- Running IR pass [conv_bn_fuse_pass][0m
  15. [32m--- Running IR pass [conv_eltwiseadd_bn_fuse_pass][0m
  16. [32m--- Running IR pass [embedding_eltwise_layernorm_fuse_pass][0m
  17. [32m--- Running IR pass [multihead_matmul_fuse_pass_v2][0m
  18. I0713 16:49:08.685951 6532 fuse_pass_base.cc:59] --- detected 12 subgraphs
  19. [32m--- Running IR pass [vit_attention_fuse_pass][0m
  20. [32m--- Running IR pass [fused_multi_transformer_encoder_pass][0m
  21. [32m--- Running IR pass [fused_multi_transformer_decoder_pass][0m
  22. [32m--- Running IR pass [fused_multi_transformer_encoder_fuse_qkv_pass][0m
  23. [32m--- Running IR pass [fused_multi_transformer_decoder_fuse_qkv_pass][0m
  24. [32m--- Running IR pass [multi_devices_fused_multi_transformer_encoder_pass][0m
  25. [32m--- Running IR pass [multi_devices_fused_multi_transformer_encoder_fuse_qkv_pass][0m
  26. [32m--- Running IR pass [multi_devices_fused_multi_transformer_decoder_fuse_qkv_pass][0m
  27. [32m--- Running IR pass [fuse_multi_transformer_layer_pass][0m
  28. [32m--- Running IR pass [gpu_cpu_squeeze2_matmul_fuse_pass][0m
  29. [32m--- Running IR pass [gpu_cpu_reshape2_matmul_fuse_pass][0m
  30. [32m--- Running IR pass [gpu_cpu_flatten2_matmul_fuse_pass][0m
  31. [32m--- Running IR pass [gpu_cpu_map_matmul_v2_to_mul_pass][0m
  32. I0713 16:49:09.470413 6532 fuse_pass_base.cc:59] --- detected 38 subgraphs
  33. [32m--- Running IR pass [gpu_cpu_map_matmul_v2_to_matmul_pass][0m
  34. [32m--- Running IR pass [matmul_scale_fuse_pass][0m
  35. [32m--- Running IR pass [multihead_matmul_fuse_pass_v3][0m
  36. [32m--- Running IR pass [gpu_cpu_map_matmul_to_mul_pass][0m
  37. [32m--- Running IR pass [fc_fuse_pass][0m
  38. I0713 16:49:09.519965 6532 fuse_pass_base.cc:59] --- detected 38 subgraphs
  39. [32m--- Running IR pass [fc_elementwise_layernorm_fuse_pass][0m
  40. I0713 16:49:09.542423 6532 fuse_pass_base.cc:59] --- detected 24 subgraphs
  41. [32m--- Running IR pass [conv_elementwise_add_act_fuse_pass][0m
  42. [32m--- Running IR pass [conv_elementwise_add2_act_fuse_pass][0m
  43. [32m--- Running IR pass [conv_elementwise_add_fuse_pass][0m
  44. [32m--- Running IR pass [transpose_flatten_concat_fuse_pass][0m
  45. [32m--- Running IR pass [conv2d_fusion_layout_transfer_pass][0m
  46. [32m--- Running IR pass [transfer_layout_elim_pass][0m
  47. [32m--- Running IR pass [auto_mixed_precision_pass][0m
  48. [32m--- Running IR pass [inplace_op_var_pass][0m
  49. I0713 16:49:09.547497 6532 fuse_pass_base.cc:59] --- detected 1 subgraphs
  50. [1m[35m--- Running analysis [save_optimized_model_pass][0m
  51. W0713 16:49:09.548242 6532 save_optimized_model_pass.cc:28] save_optim_cache_model is turned off, skip save_optimized_model_pass
  52. [1m[35m--- Running analysis [ir_params_sync_among_devices_pass][0m
  53. I0713 16:49:09.548257 6532 ir_params_sync_among_devices_pass.cc:51] Sync params from CPU to GPU
  54. [1m[35m--- Running analysis [adjust_cudnn_workspace_size_pass][0m
  55. [1m[35m--- Running analysis [inference_op_replace_pass][0m
  56. [1m[35m--- Running analysis [ir_graph_to_program_pass][0m
  57. I0713 16:49:09.937587 6532 analysis_predictor.cc:1660] ======= optimize end =======
  58. I0713 16:49:09.937990 6532 naive_executor.cc:164] --- skip [feed], feed -> token_type_ids
  59. I0713 16:49:09.938001 6532 naive_executor.cc:164] --- skip [feed], feed -> input_ids
  60. I0713 16:49:09.938807 6532 naive_executor.cc:164] --- skip [elementwise_div_1], fetch -> fetch
  61. [32m[2023-07-13 16:49:09,939] [ INFO][0m - We are using <class 'paddlenlp.transformers.ernie.tokenizer.ErnieTokenizer'> to load 'rocketqa-zh-base-query-encoder'.[0m
  62. [32m[2023-07-13 16:49:09,939] [ INFO][0m - 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[0m
  63. [32m[2023-07-13 16:49:10,063] [ INFO][0m - 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.txt[0m
  64. 100%|████████████████████████████████████████| 182k/182k [00:00<00:00, 3.51MB/s]
  65. [32m[2023-07-13 16:49:10,249] [ INFO][0m - tokenizer config file saved in /home/aistudio/.paddlenlp/models/rocketqa-zh-base-query-encoder/tokenizer_config.json[0m
  66. [32m[2023-07-13 16:49:10,249] [ INFO][0m - Special tokens file saved in /home/aistudio/.paddlenlp/models/rocketqa-zh-base-query-encoder/special_tokens_map.json[0m
  67. 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.6
  68. W0713 16:49:20.137218 6532 gpu_resources.cc:149] device: 0, cuDNN Version: 8.4.
  69. 100%|███████████████████████████| 10000000/10000000 [1:27:15<00:00, 1910.02it/s]

执行过程部分展示:

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

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

数据量 显卡 时间
1000万条 V100 32GB 3h41min
1000万条 A100 40GB 1h27min

运行结束后会生成 corpus_embedding.npy

5.1.2 把向量插入到Milvus库

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

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

  1. MILVUS_HOST='your milvus ip'
  2. MILVUS_PORT = 8530

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

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

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

  1. # !python milvus_ann_search.py --data_path /home/aistudio/literature_search_data/milvus/milvus_data.csv \
  2. # --embedding_path corpus_embedding.npy \
  3. # --batch_size 1000 \
  4. # --insert

参数含义说明

  • data_path: 数据的路径
  • embedding_path: 数据对应向量的路径
  • index: 选择检索向量的索引,用于向量检索
  • insert: 是否插入向量
  • search: 是否检索向量
  • batch_size: 表示的是一次性插入的向量的数量
数据量 显卡 时间
1000万条 V100 32GB 23min
1000万条 A100 40GB --
  • 插入过程进程:
  1. Number of entities in Milvus: 9406000
  2. Does collection literature_search exist in Milvus: True
  3. Number of entities in Milvus: 9406000
  4. 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▌| 9975/10000 [23:27<00:02, 11.53it/s]Does collection literature_search exist in Milvus: True
  5. Number of entities in Milvus: 9406000

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

  1. # #运行召回脚本:
  2. # !python milvus_ann_search.py --data_path /home/aistudio/literature_search_data/milvus/milvus_data.csv \
  3. # --embedding_path corpus_embedding.npy \
  4. # --batch_size 1000 \
  5. # --index 18 \
  6. # --search

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

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

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

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

  1. sh scripts/search.sh

5.2 文本检索

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

  1. params_path='checkpoints/model_40/model_state.pdparams'
  2. id2corpus={0:'国有企业引入非国有资本对创新绩效的影响——基于制造业国有上市公司的经验证据'}
  1. # !unzip /home/aistudio/data/data225060/checkpoints.zip
  1. Archive: /home/aistudio/data/data225060/checkpoints.zip
  2. inflating: checkpoints/inbatch/model_90/vocab.txt
  3. inflating: checkpoints/inbatch/model_90/model_state.pdparams
  4. inflating: checkpoints/inbatch/model_90/tokenizer_config.json
  5. inflating: checkpoints/inbatch/model_90/special_tokens_map.json
  6. inflating: checkpoints/inbatch/recall_log/default.talqnj.log
  7. inflating: checkpoints/inbatch/recall_log/workerlog.0
  8. inflating: checkpoints/inbatch/recall_log/default.gpu.log
  9. inflating: checkpoints/simcse_inbatch_negative/model_300/special_tokens_map.json
  10. inflating: checkpoints/simcse_inbatch_negative/model_300/vocab.txt
  11. inflating: checkpoints/simcse_inbatch_negative/model_300/tokenizer_config.json
  12. inflating: checkpoints/simcse_inbatch_negative/model_300/model_state.pdparams
  1. #运行命令
  2. # !python inference.py
  1. # cd /home/aistudio/checkpoints
  1. /home/aistudio/checkpoints

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

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

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 搭建召回系统抽取向量进行检索,加速索引的更多相关文章

  1. .NET基于Eleasticsearch搭建日志系统实战演练

    一.需求背景介绍 1.1.需求描述 大家都知道C/S架构模式的客户端应用程序(比如:WinForm桌面应用.WPF.移动App应用程序.控制台应用程序.Windows服务等等)的日志记录都存储在本地客 ...

  2. 【Linux】基于VMware搭建Linux系统

    本篇文章侧重于操作,主要内容大致包括: 两大类操作系统简要介绍 VMware Workstation Pro 15简要介绍及安装 CentOS简要介绍及基于Wi'n'dows 操作系统的安装 一 关于 ...

  3. CentOS7 系统基于Vim8搭建Go语言开发环境

    链接:https://pdf.us/2018/11/10/2194.html 问题1:vim-go: could not find 'gopls'. Run :GoInstallBinaries to ...

  4. 基于jeesite的cms系统(一):开发环境搭建

    基于jeesite的cms系统系列,是对基于jeesite进行二次开发的博客模块开发过程的总结.涉及入门安装,二次开发,部署等 一.概况: JeeSite 是一个 Java 企业级快速开发平台,基于经 ...

  5. 基于SRS+OBS搭建直播系统

    这段时间与视频,直播相关的技术不可谓不热,今天我们就近距离接触下,尽早搭上这班车! 我们先看一张效果图 左边是OBS 推流端,右边是VLC播放器,稍微有延迟! 本文是基于VMware(12.5.7)+ ...

  6. 基于开源博客系统(mblog)搭建网站

    基于开源博客系统(mblog)搭建网站 上一章讲了基于jpress部署的博客系统,这一章了解一下 mblog这个开源的基于springboot的博客系统,相比与jpress 的热度fork数量要少一些 ...

  7. 十九,基于helm搭建EFK日志收集系统

    目录 EFK日志系统 一,EFK日志系统简介: 二,EFK系统部署 1,EFK系统部署方式 2,基于Helm方式部署EFK EFK日志系统 一,EFK日志系统简介: 关于系统日志收集处理方案,其实有很 ...

  8. 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统

    王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...

  9. ELK+FileBeat+Log4Net搭建日志系统

    ELK+FileBeat+Log4Net搭建日志系统 来源:https://www.zybuluo.com/muyanfeixiang/note/608470 标签(空格分隔): ELK Log4Ne ...

  10. 快速搭建日志系统——ELK STACK

    什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...

随机推荐

  1. 构造函数中,获取yml中的参数

    成员变量的注入是在Bean创建成功之后,通过setter方法进行注入的.所以下面会获取不到值 @RestController public class VipsoftImController { @A ...

  2. Docker 与 Linux Cgroups:资源隔离的魔法之旅

    这篇文章主要介绍了 Docker 如何利用 Linux 的 Control Groups(cgroups)实现容器的资源隔离和管理. 最后通过简单 Demo 演示了如何使用 Go 和 cgroups ...

  3. Java | Spring Boot统一日志框架

    在项目开发中,日志十分的重要,不管是记录运行情况还是定位线上问题,都离不开对日志的分析.在 Java 领域里存在着多种日志框架,如 JCL.SLF4J.Jboss-logging.jUL.log4j. ...

  4. Codeforces Round #664 题解(A ~ C)

    1395A - Boboniu Likes to Color Balls 如果在r,b,g,w中小于或等于一个奇数,则可以将其定为回文. 否则,请进行一次操作(如果可以),然后检查上述情况. 进行多次 ...

  5. 二、redis主从环境搭建

    系列导航 一.redis单例安装(linux) 二.redis主从环境搭建 三.redis集群搭建 四.redis增加密码验证 五.java操作redis 环境:centos7需要的安装包: redi ...

  6. NOIP2020游记——AFO之战

    阅读时请播放此音乐,这是我精心挑选的,很适合本文. Day-0奇遇 考试前一天,不顺,很不顺,简直可以写小说了.(不想看我车店可以往下翻,Day-1在后边) 我是下午两点从齐齐哈尔出发前往省会哈尔滨的 ...

  7. java基础-数组-day06

    1. 引入数组 录入10个学生的成绩 求和 求平均 import java.util.Scanner; public class TestArray01{ public static void mai ...

  8. DC-设计和工艺数据-02

    在 compile之前保存ddc设计文件 check design - 检查文件的连接性和物理性 check design之后可以将未映射的网表写出,如果是几十万级的RTL,如果不写出,设置约束出现问 ...

  9. iframe访问页面,出现 ERR_BLOCKED_BY_RESPONSE

    那是因为服务器输出了 X-Frame-Options 头,只要把这个头删除掉,就没问题了

  10. MySQL复习——20211027

    MYSQL MySQL创建数据库 我们可以在登录MySQL服务后,使用create命令创建数据库,语法如下: CREATE DATABASE 数据库名; 使用root用户登录,root用户拥有最高权限 ...