Milvus、Qdrant、Chroma:向量数据库选型的工程决策
选向量数据库之前,先理解它底层怎么检索的。HNSW 不是"图索引"三个字就能概括的——它是怎么建图的、怎么搜的、为什么内存占用是原始向量的 2-3 倍,这些决定了你在生产环境会不会 OOM。
阅读提示
- 适合谁看:已经用过向量检索(RAG、语义搜索)、想从"会用"进阶到"理解底层"的工程师
- 看完能做什么:理解三种 ANN 算法的检索步骤、知道内存和精度的 trade-off 从哪来、选型时能说清"为什么选这个"
- 不适合谁:还没用过向量检索的读者
先给结论
- **HNSW 是"用内存换精度"**——跳表 + 图搜索,精度最高但内存占用是原始向量的 2-3 倍,100 万 768 维向量需要约 7.5GB
- **IVF 是"用精度换速度"**——K-Means 聚类 + 倒排索引,"先粗后精"两阶段检索,速度快但精度取决于 nprobe 参数
- **PQ 是"用精度换内存"**——向量压缩 32 倍,100 万 768 维向量只占 0.3GB,但精度损失 10-20%
- 选对 Embedding 模型比选对向量数据库重要 6 倍——这是经验判断,在我们项目里约 30% 的检索准确率差异来自 Embedding,5% 来自数据库选择
01 为什么精确搜索在高维空间不可行
向量检索的本质是在 N 维空间里找离查询点最近的 K 个点(K-Nearest Neighbors, KNN)。
精确搜索(暴力扫描)的计算量 = O(N × D),其中 N 是向量数量,D 是维度。100 万条 768 维向量,每次查询要算 7.68 亿次距离。在现代 GPU 上约 50ms,CPU 上约 500ms——对在线服务来说太慢了。
维度灾难:高维空间中,所有点之间的距离趋于相等。768 维空间里,最近邻和最远邻的距离比值可能只有 1.2 倍——这意味着"精确最近邻"本身就没有太大意义,近似最近邻(ANN)的精度损失可以忽略。
ANN 算法的核心思想:不扫描所有向量,只扫描"可能近"的那部分。HNSW、IVF、PQ 是三种不同的"怎么判断哪些可能近"的策略。
02 HNSW:多层图搜索——为什么精度最高、内存最大
图 1|三种 ANN 算法原理对比
HNSW(Hierarchical Navigable Small World)的灵感来自跳表(Skip List)。
索引构建过程:
- 插入第一个向量,作为第 0 层的唯一节点
- 插入第二个向量时,用指数分布随机决定它出现在哪些层(层数越高概率越小)
- 对于每一层,找到新节点的 M 个最近邻,建立双向边
- 重复直到所有向量插入完毕
关键参数 M:每个节点在每一层最多有 M 个邻居。M=16 意味着每个节点有 16 条边。M 越大,图越密集,精度越高,但内存越大。
检索过程(以查询向量 q 为例):
- 从最顶层(最稀疏的层)的入口节点开始
- 在当前层做贪心搜索:从入口节点出发,每次移动到离 q 最近的邻居,直到找不到更近的
- 把当前层的最近节点作为下一层的入口
- 重复直到到达第 0 层(最密集的层)
- 在第 0 层做 beam search(宽度为 ef),收集 ef 个最近邻
- 从 ef 个候选中返回 Top-K
为什么内存占用是原始向量的 2-3 倍:
- 原始向量:N × D × 4 bytes(FP32)
- 图结构:N × M × 2 × 4 bytes(每个节点 M 条边,每条边存邻居 ID + 距离)
- M=16 时,图结构约占原始向量的 16×2×4 / (768×4) ≈ 42%
- 加上多层结构的额外开销,总计约 2-3 倍
为什么 HNSW 精度最高:多层结构让搜索从粗到细,底层的 beam search(ef 个候选)保证了局部最优。recall@10 通常 >95%。
为什么 HNSW 内存最大:每个向量要存一份原始向量(用于计算距离)+ 一份图结构(邻居列表)。没有压缩,没有聚类,全部原样存。
03 IVF:K-Means 聚类 + 倒排索引——为什么速度最快
IVF(Inverted File Index)的核心思想是先聚类,再在聚类内搜索——“先粗后精”。
索引构建过程:
- 用 K-Means 对所有向量做聚类,得到 nlist 个聚类中心(比如 nlist=1024)
- 把每个向量分配到最近的聚类中心
- 为每个聚类中心建一个倒排列表,存储属于该聚类的所有向量 ID
检索过程:
- 计算查询向量 q 与所有 nlist 个聚类中心的距离
- 选择最近的 nprobe 个聚类中心(比如 nprobe=8)
- 只在这 nprobe 个聚类的倒排列表内做精确搜索
- 返回 Top-K
nlist 的影响:
- nlist 越大,聚类越细,每个聚类内的向量越少,检索越快
- 但 nlist 太大,聚类中心之间的距离计算成为瓶颈
- 推荐值:nlist = sqrt(N),比如 100 万向量用 nlist=1000
nprobe 的影响:
- nprobe 越大,搜索范围越广,精度越高,但速度越慢
- nprobe=nlist 时退化为暴力搜索
- nprobe 从 16 调到 64,精度只提升 3%,但延迟增加 4 倍——这是 IVF 的核心 trade-off
为什么 IVF 速度最快:只需要计算 nprobe 个聚类中心的距离 + 在 nprobe 个聚类内搜索,计算量远小于全量扫描。
为什么 IVF 精度中等:如果查询向量落在两个聚类的边界上,只搜 nprobe 个聚类可能漏掉真正的最近邻。recall@10 通常 85-95%。
04 PQ:向量压缩——为什么内存最小
PQ(Product Quantization)的核心思想是把高维向量切分成若干子空间,每个子空间用聚类中心编码。
索引构建过程:
- 把 768 维向量切成 m 个子空间(比如 m=96,每个子空间 8 维)
- 对每个子空间独立做 K-Means 聚类(比如 256 个聚类中心)
- 每个子空间的原始向量用最近的聚类中心 ID(1 个字节)替代
- 原始 768 维 × 4 bytes = 3072 bytes → 压缩为 96 × 1 byte = 96 bytes(32 倍压缩)
检索过程:
- 把查询向量也切成 m 个子空间
- 预计算查询向量每个子空间与 256 个聚类中心的距离(距离表)
- 对每个数据库向量,用距离表查 m 个子空间的距离,求和得到总距离
- 返回 Top-K
为什么 PQ 内存最小:每个向量只存 96 字节(压缩后),100 万向量只占 96MB。加上距离表等开销,总计约 0.3GB。
为什么 PQ 精度最低:压缩是有损的——96 个字节能表达的信息量远小于 3072 个字节。recall@10 通常 80-90%。
IVF + PQ 组合:先用 IVF 聚类缩小搜索范围,再用 PQ 压缩存储。1000 万向量只占约 3GB 内存,但精度损失 10-20%。
05 三个数据库的架构本质差异
| 维度 | Chroma | Qdrant | Milvus |
|---|---|---|---|
| 存储引擎 | SQLite(嵌入式) | 自研(Rust,WAL + Segment) | 自研(Go/C++,存算分离) |
| 索引实现 | HNSWlib(C++ 库) | 自研 HNSW(Rust) | 多种(HNSW/IVF/DiskANN) |
| 数据模型 | Collection → Embedding | Collection → Segment → Vector + Payload | Collection → Partition → Segment |
| 写入路径 | 同步写 SQLite + HNSWlib | WAL → 内存 → Segment 合并 | WAL → Data Node → MinIO → Index Node |
| 一致性 | 强一致(单机) | 最终一致(Segment 合并) | 可配置(Strong/Bounded/Session) |
| 内存管理 | 全量加载 | mmap 可选 | 全量/懒加载/DiskANN |
06 最小实验:100 万向量的实际表现
测试条件:单机 32G 内存,100 万条 768 维向量(FP32),HNSW 索引,Python SDK。
| 指标 | Chroma | Qdrant | Milvus |
|---|---|---|---|
| 索引构建时间 | 2 小时 | 20 分钟 | 15 分钟 |
| 内存占用 | 8GB | 7GB | 7.5GB |
| 检索延迟 (P50) | 8ms | 3ms | 3ms |
| 检索延迟 (P99) | 25ms | 8ms | 7ms |
| recall@10 | 96% | 97% | 97% |
以上数据是经验估算,不同硬件和配置下差异会很大。
07 选型决策路径
图 2|向量数据库选型决策图
简单决策规则:
- 原型验证、10 万以下、无运维→ Chroma
- 中小规模生产、10 万-1000 万、有基础运维→ Qdrant
- 大规模生产、1000 万+、有专业运维→ Milvus
- 已有 PG/Redis/ES 集群→ 先试向量扩展
08 边界:什么时候不需要向量数据库
BM25 够用的场景:精确关键词匹配(订单号、产品名称),BM25 比向量检索更快更准。
数据量极小(< 1000 条):暴力搜索就够了,不需要索引。
对延迟极致敏感(< 1ms):向量数据库的检索延迟通常 2-20ms,可能需要预计算方案。
09 给读者一个能用来做决策的结论
决策帮助
- 如果你刚接触向量检索:先用 Chroma 跑通 demo,不要一开始就上 Milvus
- 如果你准备上生产:优先考虑 Qdrant 或 pgvector
- 如果你数据量超过 1000 万:Milvus 是最成熟的选择
- 如果你只能先做一步:先选对 Embedding 模型——比选对数据库重要 6 倍
学AI大模型的正确顺序,千万不要搞错了
🤔2026年AI风口已来!各行各业的AI渗透肉眼可见,超多公司要么转型做AI相关产品,要么高薪挖AI技术人才,机遇直接摆在眼前!
有往AI方向发展,或者本身有后端编程基础的朋友,直接冲AI大模型应用开发转岗超合适!
就算暂时不打算转岗,了解大模型、RAG、Prompt、Agent这些热门概念,能上手做简单项目,也绝对是求职加分王🔋
📝给大家整理了超全最新的AI大模型应用开发学习清单和资料,手把手帮你快速入门!👇👇
学习路线:
✅大模型基础认知—大模型核心原理、发展历程、主流模型(GPT、文心一言等)特点解析
✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑
✅开发基础能力—Python进阶、API接口调用、大模型开发框架(LangChain等)实操
✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用
✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代
✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经
以上6大模块,看似清晰好上手,实则每个部分都有扎实的核心内容需要吃透!
我把大模型的学习全流程已经整理📚好了!抓住AI时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~
