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

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)。

索引构建过程

  1. 插入第一个向量,作为第 0 层的唯一节点
  2. 插入第二个向量时,用指数分布随机决定它出现在哪些层(层数越高概率越小)
  3. 对于每一层,找到新节点的 M 个最近邻,建立双向边
  4. 重复直到所有向量插入完毕

关键参数 M:每个节点在每一层最多有 M 个邻居。M=16 意味着每个节点有 16 条边。M 越大,图越密集,精度越高,但内存越大。

检索过程(以查询向量 q 为例):

  1. 从最顶层(最稀疏的层)的入口节点开始
  2. 在当前层做贪心搜索:从入口节点出发,每次移动到离 q 最近的邻居,直到找不到更近的
  3. 把当前层的最近节点作为下一层的入口
  4. 重复直到到达第 0 层(最密集的层)
  5. 在第 0 层做 beam search(宽度为 ef),收集 ef 个最近邻
  6. 从 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)的核心思想是先聚类,再在聚类内搜索——“先粗后精”。

索引构建过程

  1. 用 K-Means 对所有向量做聚类,得到 nlist 个聚类中心(比如 nlist=1024)
  2. 把每个向量分配到最近的聚类中心
  3. 为每个聚类中心建一个倒排列表,存储属于该聚类的所有向量 ID

检索过程

  1. 计算查询向量 q 与所有 nlist 个聚类中心的距离
  2. 选择最近的 nprobe 个聚类中心(比如 nprobe=8)
  3. 只在这 nprobe 个聚类的倒排列表内做精确搜索
  4. 返回 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)的核心思想是把高维向量切分成若干子空间,每个子空间用聚类中心编码

索引构建过程

  1. 把 768 维向量切成 m 个子空间(比如 m=96,每个子空间 8 维)
  2. 对每个子空间独立做 K-Means 聚类(比如 256 个聚类中心)
  3. 每个子空间的原始向量用最近的聚类中心 ID(1 个字节)替代
  4. 原始 768 维 × 4 bytes = 3072 bytes → 压缩为 96 × 1 byte = 96 bytes(32 倍压缩)

检索过程

  1. 把查询向量也切成 m 个子空间
  2. 预计算查询向量每个子空间与 256 个聚类中心的距离(距离表)
  3. 对每个数据库向量,用距离表查 m 个子空间的距离,求和得到总距离
  4. 返回 Top-K

为什么 PQ 内存最小:每个向量只存 96 字节(压缩后),100 万向量只占 96MB。加上距离表等开销,总计约 0.3GB。

为什么 PQ 精度最低:压缩是有损的——96 个字节能表达的信息量远小于 3072 个字节。recall@10 通常 80-90%。

IVF + PQ 组合:先用 IVF 聚类缩小搜索范围,再用 PQ 压缩存储。1000 万向量只占约 3GB 内存,但精度损失 10-20%。


05 三个数据库的架构本质差异

维度ChromaQdrantMilvus
存储引擎SQLite(嵌入式)自研(Rust,WAL + Segment)自研(Go/C++,存算分离)
索引实现HNSWlib(C++ 库)自研 HNSW(Rust)多种(HNSW/IVF/DiskANN)
数据模型Collection → EmbeddingCollection → Segment → Vector + PayloadCollection → Partition → Segment
写入路径同步写 SQLite + HNSWlibWAL → 内存 → Segment 合并WAL → Data Node → MinIO → Index Node
一致性强一致(单机)最终一致(Segment 合并)可配置(Strong/Bounded/Session)
内存管理全量加载mmap 可选全量/懒加载/DiskANN

06 最小实验:100 万向量的实际表现

测试条件:单机 32G 内存,100 万条 768 维向量(FP32),HNSW 索引,Python SDK。

指标ChromaQdrantMilvus
索引构建时间2 小时20 分钟15 分钟
内存占用8GB7GB7.5GB
检索延迟 (P50)8ms3ms3ms
检索延迟 (P99)25ms8ms7ms
recall@1096%97%97%

以上数据是经验估算,不同硬件和配置下差异会很大


07 选型决策路径

图 2|向量数据库选型决策图

简单决策规则

  1. 原型验证、10 万以下、无运维→ Chroma
  2. 中小规模生产、10 万-1000 万、有基础运维→ Qdrant
  3. 大规模生产、1000 万+、有专业运维→ Milvus
  4. 已有 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时代风口,轻松解锁职业新可能,希望大家都能把握机遇,实现薪资/职业跃迁~

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

http://www.jsqmd.com/news/1119322/

相关文章:

  • 小白也能看懂的大模型应用架构与Agent:让AI从“只会说“变成“会干活“
  • C# ConditionalAttribute 条件特性+Obsolete 废弃特性
  • stm32四轴飞行器BUG篇
  • 终极DLSS切换秘籍:3步解锁游戏性能新境界
  • CentOS8.0编译源码安装nginx和防火墙使用
  • 政企汇报宣传片为什么离不开 3D 动画?
  • PCB设计中孤铜现象的影响与AD18处理技巧
  • 奇门取号报“订单号不一致”?一次 trade_order_list 的排查实录
  • 《唤醒你的AI同事:WorkBuddy从零上手》034:提示词编写技巧
  • YOLO11全任务适配指南:检测、分割、姿态估计的性能调优技巧
  • 48. OrCAD在创建封装库时,管脚数目很多的元器件应该怎么合理?I Cadence Allegro 电子设计 快问快答
  • 设备单元级(L1)实施路径
  • 批量压缩图片还在用在线工具?这款648KB小软件,画质不变体积暴减
  • 不用喂食不用换水的“水族箱”、逆向净水器的智能水龙头,接入 Home Assistant、用 RF 破解把吊扇接入智能家居|DF创客周刊(第178期)
  • 星火X1 0725 vs 豆包:办公场景下AI模型精准能力实测
  • 混凝土裂隙数据集 建筑物裂缝分割数据集 1000张yolo数据集
  • 【AI编程代码审查黄金标准】:20年资深架构师亲授5大质量保障铁律,错过再等十年?
  • JMeter分布式压测实战:突破单机瓶颈,模拟海量并发
  • 高速PMSM无感控制三大难题与工程解决方案
  • ShadingModel与Lighting
  • ClaudeAPI 医疗场景落地指南:适用边界、提示词与审核流程
  • C++语言基础1:作用域解析运算符“::”详细讲解
  • Scrum落地避坑指南:一个技术负责人踩过的5个流程管理深坑与解法
  • 云服务器已进入黑暗森林时代
  • 【Linux网络】深入 HTTP 协议(一):从初识到 URL 编解码底层探索
  • 【AVRCP】规范精讲[38]:本地调节音量,控制器如何同步感知与更新
  • 演唱会、音乐会适合用的Tally灯
  • DLSS Swapper终极指南:如何智能切换DLSS版本提升游戏帧率
  • 《唤醒你的AI同事:WorkBuddy从零上手》035:工作流程优化
  • 【C++】008、sizeof与strlen的区别