当前位置: 首页 > article >正文

Milvus(17):向量索引、FLAT、IVF_FLAT

1 索引向量字段

        利用存储在索引文件中的元数据,Milvus 以专门的结构组织数据,便于在搜索或查询过程中快速检索所需的信息。

        Milvus 提供多种索引类型和指标,可对字段值进行排序,以实现高效的相似性搜索。下表列出了不同向量字段类型所支持的索引类型和度量。目前,Milvus 支持各种类型的向量数据,包括浮点嵌入(通常称为浮点向量或密集向量)、二进制嵌入(也称为二进制向量)和稀疏嵌入(也称为稀疏向量)。

        浮点嵌入:

度量类型索引类型
  • 欧氏距离 (L2)
  • 内积 (IP)
  • 余弦相似度 (COSINE)
  • FLAT
  • IVF_FLAT
  • IVF_SQ8
  • IVF_PQ
  • GPU_IVF_FLAT
  • GPU_IVF_PQ
  • HNSW
  • DISKANN

        二进制嵌入:

度量类型索引类型
  • Jaccard (JACCARD)
  • 哈明 (HAMMING)
  • BIN_FLAT
  • BIN_IVF_FLAT

        稀疏嵌入:

度量类型索引类型
IP稀疏反转索引
BM25稀疏_反转索引

1.1 准备工作

        正如管理 Collections 中所解释的,如果在创建 Collections 请求中指定了以下任一条件,Milvus 会在创建 Collections 时自动生成索引并将其加载到内存中:

  • 向量场的维度和度量类型,或
  • Schema 和索引参数。

        下面的代码片段对现有代码进行了重新利用,以建立与 Milvus 实例的连接,并在不指定其索引参数的情况下创建 Collections。在这种情况下,Collection 缺乏索引并保持未加载状态。

from pymilvus import MilvusClient, DataType# 1. 设置一个Milvus客户端
client = MilvusClient(uri="http://localhost:19530"
)# 2.1. 向数据库添加一个新模式
schema = MilvusClient.create_schema(auto_id=False,enable_dynamic_field=True,
)# 2.2. 向模式添加字段
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)# 3. 创建新集合
client.create_collection(collection_name="customized_setup", schema=schema, 
)

1.2 索引一个 Collection

        要为一个 Collection 创建索引或为一个 Collection 建立索引,可使用 prepare_index_params() 准备索引参数,并使用 create_index() 来创建索引。

# 4.1. 设置索引参数
index_params = MilvusClient.prepare_index_params()# 4.2. 在矢量域上添加一个索引
index_params.add_index(field_name="vector",metric_type="COSINE",index_type="IVF_FLAT",index_name="vector_index",params={ "nlist": 128 }
)# 4.3. 创建索引文件
client.create_index(collection_name="customized_setup",index_params=index_params,sync=False # 是否等待索引创建完成后再返回。默认为True。
)
参数参数
field_name应用此对象的目标文件名称。
metric_type用于衡量向量间相似性的算法。可能的值有IPL2COSINEJACCARDHAMMING。只有当指定字段是向量字段时才可用。
index_type用于在特定字段中排列数据的算法名称。
index_name应用此对象后生成的索引文件名称。
params指定索引类型的微调参数。
collection_name现有 Collections 的名称。
index_params包含IndexParam对象列表的IndexParams对象。
sync控制与客户端请求相关的索引构建方式。有效值:
  • True (默认):客户端等待索引完全建立后才返回。这意味着在该过程完成之前不会收到响应。
  • False:客户端收到请求后立即返回,索引正在后台建立。

1.3 检查索引详细信息

        创建索引后,可以检查其详细信息。要检查索引详细信息,请使用 list_indexes() 列出索引名称,并用 describe_index() 获取索引详细信息。

res = client.list_indexes(collection_name="customized_setup"
)print(res)# Output
#
# [
#     "vector_index",
# ]res = client.describe_index(collection_name="customized_setup",index_name="vector_index"
)print(res)# Output
#
# {
#     "index_type": ,
#     "metric_type": "COSINE",
#     "field_name": "vector",
#     "index_name": "vector_index"
# }

        您可以检查在特定字段上创建的索引文件,并收集使用该索引文件索引的行数统计。

1.4 删除索引

        如果不再需要索引,可以直接将其删除。

client.drop_index(collection_name="customized_setup",index_name="vector_index"
)

2 FLAT

        FLAT索引是最简单、最直接的浮点向量索引和搜索方法之一。它依赖于一种 "蛮力 "方法,即直接将每个查询向量与数据集中的每个向量进行比较,而无需任何高级预处理或数据结构。这种方法保证了准确性,由于对每个潜在匹配都进行了评估,因此可提供 100% 的召回率。

        不过,这种穷举式搜索方法也有代价。FLAT 索引是最慢的索引选项,因为每次查询都要对数据集进行一次全面扫描。因此,它并不适合海量数据集的环境,因为在这种环境中,性能是个问题。FLAT 索引的主要优点是简单可靠,因为它不需要训练或复杂的参数配置。

2.1 建立索引

        要在 Milvus 中的向量场上建立FLAT 索引,请使用add_index() 方法,为索引指定index_type 和metric_type 参数。

from pymilvus import MilvusClient# 准备索引构建参数
index_params = MilvusClient.prepare_index_params()index_params.add_index(field_name="your_vector_field_name", # 要索引的向量字段的名称index_type="FLAT", # 要创建的索引类型index_name="vector_index", # 要创建的索引的名称metric_type="L2", # 用于度量相似性的度量类型params={} # FLAT不需要额外的参数
)

        在此配置中

  • index_type:要建立的索引类型。在本例中,将值设为FLAT 。
  • metric_type:用于计算向量间距离的方法。支持的值包括COSINE,L2, 和IP 。
  • params:FLAT 索引不需要额外参数。

        配置好索引参数后,可直接使用create_index() 方法或在create_collection 方法中传递索引参数来创建索引。

2.2 在索引上搜索

        建立索引并插入实体后,就可以在索引上执行相似性搜索。

res = MilvusClient.search(collection_name="your_collection_name", # 集合名称anns_field="vector_field", # 向量字段名data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # 查询向量limit=3,  # 返回TopK结果search_params={"params": {}}  # FLAT不需要额外的参数
)

3 IVF_FLAT

        IVF_FLAT索引是一种可以提高浮点向量搜索性能的索引算法。这种索引类型非常适合需要快速查询响应和高精确度的大规模数据集,尤其是在对数据集进行聚类可以减少搜索空间,并且有足够内存存储聚类数据的情况下。

3.1 概览

        术语IVF_FLAT代表反转文件扁平,概括了其索引和搜索浮点向量的双层方法:

  • 反转文件 (IVF):指使用K 均值聚类将向量空间聚类为可管理的区域。每个聚类都有一个中心点,作为内部向量的参考点。
  • 扁平:表示在每个聚类中,向量以原始形式(扁平结构)存储,不做任何压缩或量化,以便进行精确的距离计算。

        下图显示了其工作原理:

        这种索引方法加快了搜索过程,但也有潜在的缺点:找到的最接近查询嵌入的候选嵌入可能并不是准确的最近嵌入。如果与查询嵌入点最近的嵌入点所在的聚类与根据最近中心点选择的聚类不同,就会出现这种情况(见下面的可视化图示)。为了解决这个问题,IVF_FLAT提供了两个超参数供我们调整:

  • nlist:指定使用 k-means 算法创建的分区数量。
  • nprobe:指定在搜索候选对象时要考虑的分区数量。

        现在,如果我们将nprobe 设置为 3,而不是 1,就会得到如下结果:

        通过增加nprobe 值,可以在搜索中包含更多分区,这有助于确保不会错过与查询最接近的嵌入,即使它位于不同的分区中。不过,这样做的代价是增加搜索时间,因为需要评估更多候选项。

3.2 建立索引

        要在 Milvus 中的向量场上建立IVF_FLAT 索引,请使用add_index() 方法,指定index_type,metric_type, 以及索引的附加参数。

from pymilvus import MilvusClient# 准备索引构建参数
index_params = MilvusClient.prepare_index_params()index_params.add_index(field_name="your_vector_field_name", # 要索引的向量字段的名称index_type="IVF_FLAT", # 要创建的索引类型index_name="vector_index", # 要创建的索引的名称metric_type="L2", # 用于度量相似性的度量类型params={"nlist": 64, # 索引的簇数} # 索引建立参数
)

        在此配置中

  • index_type:要建立的索引类型。在本例中,将值设为IVF_FLAT 。
  • metric_type:用于计算向量间距离的方法。支持的值包括COSINE,L2, 和IP 。
  • params:用于建立索引的附加配置选项。
  • nlist:划分数据集的簇数。

        配置好索引参数后,可直接使用create_index() 方法或在create_collection 方法中传递索引参数来创建索引。

3.3 在索引上搜索

        建立索引并插入实体后,就可以在索引上执行相似性搜索。

search_params = {"params": {"nprobe": 10, # 要搜索的集群数}
}res = MilvusClient.search(collection_name="your_collection_name", # 集合名称anns_field="vector_field",data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # 查询向量limit=3,  # 返回TopK结果search_params=search_params
)

3.4 索引参数

3.4.1 索引建立参数

参数

说明

值范围

调整建议

nlist

在建立索引时使用 k-means 算法创建的簇数。每个簇由一个中心点代表,存储一个向量列表。增加该参数可减少每个簇中的向量数量,从而创建更小、更集中的分区。

类型: 整数整数范围:[1, 65536]

默认值128

nlist 值越大,通过创建更精细的簇来提高召回率,但会增加索引构建时间。请根据数据集大小和可用资源进行优化。大多数情况下,我们建议在此范围内设置值:[32, 4096].

3.4.2 特定于索引的搜索参数

参数

说明

值范围

调整建议

nprobe

搜索候选集群的集群数。数值越大,搜索的簇数越多,搜索范围越大,召回率越高,但代价是查询延迟增加。

类型: 整数整数范围[1,nlist]

默认值8

增加该值可提高召回率,但可能会减慢搜索速度。设置nprobe 与nlist 成比例,以平衡速度和准确性。

在大多数情况下,我们建议您在此范围内设置一个值:[1,nlist]。

相关文章:

Milvus(17):向量索引、FLAT、IVF_FLAT

1 索引向量字段 利用存储在索引文件中的元数据,Milvus 以专门的结构组织数据,便于在搜索或查询过程中快速检索所需的信息。 Milvus 提供多种索引类型和指标,可对字段值进行排序,以实现高效的相似性搜索。下表列出了不同向量字段类…...

芯片笔记 - 手册参数注释

芯片手册参数注释 基础参数外围设备USB OTG(On-The-Go)以太网存储卡(SD)SDIO 3.0(Secure Digital Input/Output)GPIO(General Purpose Input/Output 通用输入/输出接口)ADC(Analog to Digital C…...

不同大模型对提示词和问题的符号标识

不同大模型对提示词和问题的符号标识 不同大模型对提示词和问题的符号标识存在差异,花括号{}在特定场景下可以使用,但需结合模型特性和上下文。 一、主流模型的符号标识惯例 1. Claude(Anthropic) 推荐符号:XML标签(如<tag>内容</tag>)。 示例:<text…...

RabbitMQ学习(第二天)

文章目录 1、生产者可靠性①、生产者重连②、生产者确认 2、MQ可靠性①、数据持久化②、LazyQueue(惰性队列) 3、消费者可靠性①、消费者确认②、失败重试机制③、保证业务幂等性 总结 之前的学习中&#xff0c;熟悉了java中搭建和操作RabbitMQ发送接收消息&#xff0c;熟悉使用…...

【JS逆向基础】爬虫核心模块:request模块与包的概念

前言&#xff1a;这篇文章主要介绍JS逆向爬虫中最常用的request模块&#xff0c;然后引出一系列的模块的概念&#xff0c;当然Python中其他比较常用的还有很多模块&#xff0c;正是这些模块也可以称之为库的东西构成了Python强大的生态&#xff0c;使其几乎可以实现任何功能。下…...

LabVIEW燃气轮机测控系统

在能源需求不断增长以及生态环境保护备受重视的背景下&#xff0c;微型燃气轮机凭借其在经济性、可靠性、维护性及排放性等方面的显著优势&#xff0c;在航空航天、分布式发电等众多领域得到广泛应用。随着计算机技术的快速发展&#xff0c;虚拟仪器应运而生&#xff0c;LabVIE…...

【链表扫盲】FROM GPT

链表是一种线性数据结构&#xff0c;由节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两个部分&#xff1a; 数据域&#xff08;data&#xff09;&#xff1a; 存储节点值。指针域&#xff08;next&#xff09;&#xff1a; 存储指向下一个节点的引用。 链表…...

QT | 常用控件

前言 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 —…...

Python学习之路(八)-多线程和多进程浅析

在 Python 中,多线程(Multithreading) 和 多进程(Multiprocessing) 是实现并发编程的两种主要方式。它们各有优劣,适用于不同的场景。 一、基本概念 特性多线程(threading)多进程(multiprocessing)并发模型线程共享内存空间每个进程拥有独立内存空间GIL(全局解释器锁…...

搭建和优化CI/CD流水线

CI/CD&#xff08;持续集成 / 持续交付&#xff09;流水线是现代软件开发中的关键实践&#xff0c;它能够自动化软件的构建、测试和部署过程&#xff0c;提高开发效率和软件质量。以下为你介绍搭建和优化 CI/CD 流水线的详细步骤&#xff1a; 搭建 CI/CD 流水线 1. 选择合适的…...

kotlin 01flow-StateFlow 完整教程

一 Android StateFlow 完整教程&#xff1a;从入门到实战 StateFlow 是 Kotlin 协程库中用于状态管理的响应式流&#xff0c;特别适合在 Android 应用开发中管理 UI 状态。本教程将带全面了解 StateFlow 的使用方法。 1. StateFlow 基础概念 1.1 什么是 StateFlow? StateF…...

1.2.1 Linux音频系统发展历程简介

Linux音频系统的发展经历了从最初的简单驱动到今天多层次、模块化音频架构。简要梳理其主要历程&#xff1a; 早期的OSS&#xff08;Open Sound System&#xff09; 在90年代及2000年代初&#xff0c;Linux主要使用OSS来支持音频。OSS直接为硬件设备&#xff08;如声卡&#…...

浏览器刷新结束页面事件,调结束事件的接口(vue)

浏览器刷新的时候&#xff0c;正在进行中的事件结束掉&#xff0c;在刷新浏览器的时候做一些操作。 如果是调接口&#xff0c;就不能使用axios封装的接口&#xff0c;需要使用原生的fetch。 找到公共的文件App.vue 使用window.addEventListener(‘beforeunload’, function (e…...

聊聊Spring AI Alibaba的SentenceSplitter

序 本文主要研究一下Spring AI Alibaba的SentenceSplitter SentenceSplitter spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/transformer/splitter/SentenceSplitter.java public class SentenceSplitter extends TextSplitter {private final EncodingRegis…...

前端-什么是结构语言、样式语言、脚本语言?

目录 1. 结构语言&#xff08;HTML / WXML&#xff09;——房子的骨架 2. 样式语言&#xff08;CSS / WXSS&#xff09;——房子的装修 3. 脚本语言&#xff08;JavaScript&#xff09;——房子的智能控制系统 总结对比表&#xff1a; 1. 结构语言&#xff08;HTML / WXML&a…...

LLM论文笔记 28: Universal length generalization with Turing Programs

Arxiv日期&#xff1a;2024.10.4机构&#xff1a;Harvard University 关键词 图灵机 CoT 长度泛化 核心结论 Turing Programs 的提出 提出 Turing Programs&#xff0c;一种基于图灵机计算步骤的通用 CoT 策略。通过将算法任务分解为逐步的“磁带更新”&#xff08;类似图灵…...

AI日报 · 2025年5月07日|谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本),大幅提升编码与视频理解能力

1、谷歌发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;大幅提升编码与视频理解能力 谷歌于5月6日提前发布 Gemini 2.5 Pro 预览版 (I/O 版本)&#xff0c;为开发者带来更强编码能力&#xff0c;尤其优化了前端与UI开发、代码转换及智能体工作流构建&#xff0c;并在WebDe…...

指定Docker镜像源,使用阿里云加速异常解决

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo异常贴图 yum-config-manager&#xff1a;找不到命令 因为系统默认没有安装这个命令&#xff0c;这个命令在yum-utils 包里&#xff0c;可以通过命令yum -y install yum-util…...

VITA STANDARDS LIST,VITA 标准清单下载

VITA STANDARDS LIST&#xff0c;VITA 标准清单下载 DesignationTitleAbstractStatusVMEbus Handbook, 4th EditionA users guide to the VME, VME64 and VME64x bus specifications - features over 70 product photos and over 160 circuit diagrams, tables and graphs. The…...

Python从入门到高手8.3节-元组的常用操作方法

目录 11.3.1 元组的常用操作方法 11.3.2 元组的查找 11.3.3 祈祷明天不再打雷下雨 11.3.1 元组的常用操作方法 元组类型是一种抽象数据类型&#xff0c;抽象数据类型定义了数据类型的操作方法&#xff0c;在本节的内容中&#xff0c;着重介绍元组类型的操作方法。 ​ 元组是…...

Linux系统安装PaddleDetection

一、安装cuda 1. 查看设备 先输入nvidia-smi&#xff0c;查看设备支持的最大cuda版本&#xff0c;选择官网中支持的cuda版本 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/conda/linux-conda.html 2. 下载CUDA并安装 使用快捷键…...

【漫话机器学习系列】239.训练错误率(Training Error Rate)

机器学习基础概念 | 训练错误率&#xff08;Training Error Rate&#xff09;详解 在机器学习模型训练过程中&#xff0c;评估模型性能是至关重要的一个环节。其中&#xff0c;训练错误率&#xff08;Training Error Rate&#xff09; 是最基础也最重要的性能指标之一。 本文将…...

Vue3路由模式为history,使用nginx部署上线是空白的问题

一、问题 将vue使用打包后 npm run build将dist文件的内容&#xff0c;放入nginx的html中&#xff0c;并在nginx.conf中&#xff0c;设置端口 启动nginx&#xff0c;打开发现网页内容为空白 二、解决问题 1.配置vue-route const router createRouter({history: createWe…...

Python 数据智能实战 (13):AI的安全可靠 - 电商数据智能的红线与指南

写在前面 —— 技术向善,行稳致远:在智能时代,坚守数据伦理,构建可信赖的 AI 应用 通过前面的篇章,我们已经深入探索了如何利用 Python 和大语言模型 (LLM) 挖掘电商数据的巨大潜力,从智能用户分群到语义推荐,再到个性化内容生成和模型效果评估。我们手中的工具越来越…...

OpenCV 图形API(80)图像与通道拼接函数-----仿射变换函数warpAffine()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用仿射变换。 函数 warpAffine 使用指定的矩阵对源图像进行变换&#xff1a; dst ( x , y ) src ( M 11 x M 12 y M 13 , M 21 x M…...

数据结构与算法:图论——最短路径

最短路径 先给出一些leetcode算法题&#xff0c;以后遇见了相关题目再往上增加 最短路径的4个常用算法是Floyd、Bellman-Ford、SPFA、Dijkstra。不同应用场景下&#xff0c;应有选择地使用它们&#xff1a; 图的规模小&#xff0c;用Floyd。若边的权值有负数&#xff0c;需要…...

提示词工程:通向AGI时代的人机交互艺术

‌引言&#xff1a;从基础到精通的提示词学习之旅‌ 欢迎来到 ‌"AGI时代核心技能"‌ 系列课程的第二模块——‌提示词工程‌。在这个模块中&#xff0c;我们将系统性地探索如何通过精心设计的提示词&#xff0c;释放大型语言模型的全部潜力&#xff0c;实现高效、精…...

FreeRTOS系统CPU使用率统计

操作系统中CPU使用率是在软件架构设计中必须要考虑的一个重要性能指标。它直接影响到程序的执行时间以及优先级更高的任务能否实时响应的问题。而CPU使用率也不能过低&#xff0c;避免资源浪费。 基本原理 操作系统会统计系统总共运行了多少时间&#xff0c;以及在此期间每个任…...

是更换Window资源管理器的时候了-> Files-community/Files

Files • 主页https://files.community/ 它已经做到了 云盘文件集成、标签页和多种布局、丰富的文件预览…… 您想要的一切现代文件管理器的强大功能&#xff0c; Files 都能做到。 概述 Files 是一个现代文件管理器&#xff0c;可帮助用户组织他们的文件和文件夹。Files 的…...

基于windows安装MySQL8.0.40

基于windows安装MySQL8.0.40 基于windows 安装 MySQL8.0.40&#xff0c;解压文件到D:\mysql-8.0.40-winx64 在D:\mysql-8.0.40-winx64目录下创建my.ini文件&#xff0c;并更新一下内容 [client] #客户端设置&#xff0c;即客户端默认的连接参数 # 设置mysql客户端连接服务…...