大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
AI大模型 | 零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例 |
1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API 3、零基础学AI大模型之SpringAI 4、零基础学AI大模型之AI大模型常见概念 5、零基础学AI大模型之大模型私有化部署全指南 6、零基础学AI大模型之AI大模型可视化界面 7、零基础学AI大模型之LangChain 8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路 9、零基础学AI大模型之Prompt提示词工程 10、零基础学AI大模型之LangChain-PromptTemplate 11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战 12、零基础学AI大模型之LangChain链 13、零基础学AI大模型之Stream流式输出实战 14、零基础学AI大模型之LangChain Output Parser 15、零基础学AI大模型之解析器PydanticOutputParser 16、零基础学AI大模型之大模型的“幻觉” 17、零基础学AI大模型之RAG技术 18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战 19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析 20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战 21、零基础学AI大模型之RAG系统链路构建:文档切割转换全解析 22、零基础学AI大模型之LangChain 文本分割器实战:CharacterTextSplitter 与 RecursiveCharacterTextSplitter 全解析 23、零基础学AI大模型之Embedding与LLM大模型对比全解析 24、零基础学AI大模型之LangChain Embedding框架全解析 25、零基础学AI大模型之嵌入模型性能优化 26、零基础学AI大模型之向量数据库介绍与技术选型思考 27、零基础学AI大模型之Milvus向量数据库全解析 28、零基础学AI大模型之Milvus核心:分区-分片-段结构全解+最佳实践 29、零基础学AI大模型之Milvus部署架构选型+Linux实战:Docker一键部署+WebUI使用 30、零基础学AI大模型之Milvus实战:Attu可视化安装+Python整合全案例
索引是Milvus提升向量检索效率的“核心加速器”,本质是通过特定的数据结构对向量进行预处理,避免全量数据的暴力比对。其核心价值体现在两点:
Milvus支持多种索引类型,不同类型适配不同数据量和业务场景,选错索引会导致效率低下或资源浪费。以下是4种核心索引的详细对比(重点关注“数据量”和“核心需求”):
索引类型 | 适用场景 | 数据量建议 | 召回率 | 内存占用 | 构建速度 | 核心特点 |
|---|---|---|---|---|---|---|
FLAT | 小数据、精确搜索 | <100万条 | 100%(精确匹配) | 高 | 快 | 无预处理,暴力比对的“基线索引”,无需调参 |
IVF_FLAT | 大数据、平衡场景 | 100万~1亿条 | 90%~95% | 中 | 较快 | 聚类分桶(nlist参数),兼顾速度与召回率,性价比最高 |
HNSW | 高召回率、低延迟需求 | 100万~10亿条 | 95%~98% | 高 | 中 | 分层图结构,适合对查询速度和召回率要求都高的场景(如RAG) |
DISKANN | 超大规模、低内存场景 | 10亿+条 | 98%~99% | 低 | 慢 | 磁盘存储索引,大幅降低内存占用,适合超大规模向量库 |
以Milvus 2.5X + PyMilvus 2.5.5为例,采用MilvusClient(推荐)实现索引全生命周期操作,包含集合创建、索引配置、索引管理等关键步骤。
确保已安装PyMilvus并连接Milvus服务:
pip install pymilvus==2.5.5# 1. 导入核心模块
from pymilvus import MilvusClient, DataType
# 2. 连接Milvus服务(替换为你的服务地址)
client = MilvusClient(uri="http://192.168.229.128:19530")
# 3. 第一步:创建集合(含向量字段,索引需基于向量字段创建)
# 3.1 定义Schema(自动ID关闭,开启动态字段)
schema = MilvusClient.create_schema(
auto_id=False, # 手动指定主键ID(也可设为True自动生成)
enable_dynamic_field=True, # 开启动态字段,灵活扩展
)
# 3.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 # 向量维度(需与实际数据一致,如768维BERT向量)
)
# 3.3 创建集合(分片数2,适配单节点场景)
client.create_collection(
collection_name="index_demo_collection",
schema=schema,
shards_num=2
)
# 4. 第二步:创建索引(核心步骤)
# 4.1 准备索引参数对象
index_params = MilvusClient.prepare_index_params()
# 4.2 配置索引参数(以IVF_FLAT为例,最常用场景)
index_params.add_index(
field_name="vector", # 索引字段(必须是向量字段)
metric_type="COSINE", # 距离度量方式(可选:L2/IP/COSINE)
index_type="IVF_FLAT", # 索引类型(对应选型表)
index_name="vector_ivf_index", # 索引名称(自定义,用于后续管理)
params={"nlist": 128} # 索引专属参数(IVF_FLAT的核心:聚类中心数)
)
# 4.3 执行创建索引(sync=False表示异步创建,不阻塞)
client.create_index(
collection_name="index_demo_collection",
index_params=index_params,
sync=False # 大数据量建议设为False,后台构建;小数据量可设为True(同步等待)
)
# 5. 第三步:查看索引信息(验证创建结果)
# 5.1 列出集合的所有索引
index_list = client.list_indexes(collection_name="index_demo_collection")
print("集合中的索引列表:", index_list) # 输出:["vector_ivf_index"]
# 5.2 查看索引详细配置(含参数、状态等)
index_detail = client.describe_index(
collection_name="index_demo_collection",
index_name="vector_ivf_index"
)
print("索引详细信息:", index_detail)
# 6. 第四步:删除索引(无需时清理,谨慎操作!)
# 注意:删除索引前需确保无查询正在使用该索引
client.drop_index(
collection_name="index_demo_collection",
index_name="vector_ivf_index"
)
print("索引删除成功!")
# (可选)删除集合(测试完成后清理)
client.drop_collection(collection_name="index_demo_collection")参数名 | 作用 | 可选值/建议值 |
|---|---|---|
metric_type | 向量距离计算方式 | 余弦相似度(COSINE)、欧氏距离(L2)、内积(IP) |
index_type | 索引类型 | FLAT/IVF_FLAT/HNSW/DISKANN |
params | 索引专属调参 | IVF_FLAT:nlist=sqrt(数据量)(如100万数据设为1000);HNSW:M=16、efConstruction=200 |
sync | 同步/异步创建 | 数据量<100万:True;数据量>100万:False(后台构建) |
auto_id=True自动生成主键(避免手动ID冲突),禁止用向量字段作为主键;create_time、category)可单独创建索引,提升过滤效率。nlist(聚类中心数)建议设为sqrt(数据量),如100万数据设为1000,500万数据设为2200(过小导致召回率低,过大导致查询慢);M(每层邻居数)=16 ~ 64(越大召回率越高,内存占用越高),efConstruction(构建时搜索范围)=100 ~ 400(越大构建越慢,召回率越高);dim定义不一致(如Schema设dim=768,实际插入512维);sqrt(数据量),如100万数据设为1000。field_name拼写错误,或字段不是向量字段;FLOAT_VECTOR类型。auto_id=False时手动指定的ID重复;auto_id=True自动生成ID,或插入前校验ID唯一性。sync=False异步创建,通过describe_index查看索引状态。client.load_collection(collection_name="xxx")。search_params={"use_index": False});