
类型:向量数据库
简介:存储、索引和管理由深度神经网络和机器学习(ML)模型生成的大规模嵌入向量。
本文介绍 Milvus 向量索引创建思路,包括 HNSW、IVF_FLAT、metric_type、索引参数选择、查询性能测试和召回效果验证。
一、索引不是越复杂越好
Milvus 支持多种向量索引类型。索引的作用是提升向量搜索效率,但不同索引会在查询速度、召回效果、内存占用和构建时间之间做取舍。
新手常见误区是:一上来就找“最强参数”。实际上,索引没有放之四海皆准的固定答案。数据规模、向量维度、硬件资源、查询频率和业务容忍度不同,合适的索引方案也不同。
如果数据量很小,直接使用简单方案也许就够了;如果数据量增长到百万级、千万级,索引选择和参数调优就会变得重要。
二、先确定 metric_type
创建索引前,先确认相似度计算方式,也就是 metric_type。常见选择包括:
COSINE:常用于文本语义相似度;IP:内积,部分向量模型和推荐场景会使用;L2:欧氏距离,常用于一些传统向量距离场景。
1、metric_type 要和模型匹配
如果入库向量、查询向量和索引 metric_type 不匹配,结果可能会明显不准。不要只看别人教程里用了什么,要结合你自己的 Embedding 模型说明和业务测试来确定。
2、切换 metric_type 不能只改查询
metric_type 和索引相关。如果前期选择错误,后面可能需要重建索引,甚至重新评估向量处理方式。
三、HNSW 适合什么场景
HNSW 是常见的近似最近邻索引方式,很多向量检索场景都会考虑它。它通常能在速度和召回之间取得较好平衡,但内存消耗也需要关注。
1、HNSW 常见关注点
使用 HNSW 时,常见参数会影响构建成本、内存占用和召回效果。参数越激进,不一定越适合生产环境。数据量较大时,参数过高可能带来明显资源压力。
2、适合先用测试集调参
可以准备一组固定问题,对比不同参数下的:
- 查询耗时;
- TopK 命中率;
- 内存占用;
- 索引构建时间。
只看速度不够,召回质量下降会直接影响业务体验。
四、IVF_FLAT 适合什么场景
IVF_FLAT 也是常见索引方式之一。它会把向量空间划分为多个聚类单元,再在相关范围内搜索。它适合一定规模的数据检索,但参数需要结合数据量测试。
1、nlist 不要随意照搬
IVF_FLAT 中常见参数包括 nlist。它和数据划分有关。设置过小,搜索范围可能太粗;设置过大,构建和查询成本也会变化。
不要直接复制网上某个固定值。更可靠的方式是准备测试数据和测试问题,逐步比较效果。
2、查询阶段也要关注参数
索引创建只是第一步,查询阶段的参数同样会影响召回和速度。调参时要把索引参数和查询参数放在一起看。
五、索引创建后的验证流程
索引创建成功后,不要只看系统返回成功,还要验证业务结果。
1、先做基准测试
在创建索引前,记录一组查询的耗时和结果。创建索引后,用同一组问题再跑一次,对比变化。
2、观察 TopK 是否稳定
如果索引后查询速度提升了,但 TopK 中正确结果经常消失,说明召回质量可能不够。此时需要调整索引类型、参数或查询参数。
3、记录资源占用
索引构建会消耗 CPU、内存和磁盘资源。生产环境要记录构建耗时和资源变化,避免在业务高峰期重建索引。
六、索引调优不要一次改太多
调优时每次只改一个变量,例如只改索引类型、只改某个参数、只改 TopK 或只改查询参数。一次改太多,很难判断是哪项变化带来了结果改善或下降。
建议建立一个简单表格,记录:
- 索引类型;
- metric_type;
- 关键参数;
- 查询耗时;
- 命中情况;
- 资源占用;
- 测试结论。
这比凭感觉调参更可靠。
FAQ
Q1:Milvus 一定要创建索引吗?
A:正式数据量较大时通常需要索引。小规模测试可以先不急着调复杂索引,先验证数据和检索逻辑。
Q2:HNSW 和 IVF_FLAT 怎么选?
A:要结合数据规模、资源、查询频率和召回要求测试。没有一个参数适合所有场景。
Q3:索引创建成功但结果变差怎么办?
A:先用固定问题集对比无索引和有索引结果,再调整索引类型、metric_type 和查询参数。

