
文章目录【96.PythonAI】向量检索算法ANNHNSW、IVF、PQ乘积量化千万级数据毫秒返回导入语1 ~ 先立标杆暴力检索的成本1.1 ANN的统一思路2 ~ IVF先分桶再搜桶2.1 原理和查字典一个思路2.2 两个参数的权衡2.3 短板3 ~ HNSW小世界里的图导航3.1 原理跳表思想搬进高维空间3.2 关键参数3.3 为什么它是主流4 ~ PQ把向量压扁内存直降97%4.1 原理分段代号替换4.2 代价与定位5 ~ 三算法对比与选型5.1 实测画像5.2 选型决策树思考 总结结尾【96.PythonAI】向量检索算法ANNHNSW、IVF、PQ乘积量化千万级数据毫秒返回文章简介本文系统讲解近似最近邻搜索ANN三大主流算法的原理与选型回答千万级向量库如何实现毫秒级检索这一工程核心问题。文章从暴力检索的成本算账切入——1000万条768维向量逐一比对的计算量为何不可接受引出ANN用1%精度换100倍速度的核心权衡逐一拆解三大算法IVF倒排索引先分桶再搜桶nprobe参数控制搜多少个桶的精度/速度旋钮、HNSW分层图导航借鉴跳表思想高层快粗跳、底层细搜索ef和M参数的含义与调优、PQ乘积量化把768维向量切成段、每段用8位码本压缩内存直降97%的数学原理给出三算法在召回率、QPS、内存占用、构建速度上的实测对比表以及数据量×召回要求×内存预算的三维选型决策树。配以Mermaid流程图展示ANN检索的完整过程适合需要在Milvus/Chroma等向量库中做索引选型和参数调优的开发者阅读参考。 个人主页源码骑士❄专栏传送门《Android开发基础》《python基础课程》⭐️热衷从源码视角拆解技术底层原理将复杂架构讲得通俗易懂 源码骑士的简介5年Android Framework系统开发经验曾主导多项系统级性能优化专项技术栈覆盖Android系统全链路Binder/Handler/AMS/WMS/启动流程及Java后端全家桶Spring MyBatis Redis Oracle累计产出原创技术文章100篇文章以流程图为特色被读者评价为看一篇胜过啃一周源码导入语上一篇我们搞懂了Embedding语义变成了向量相似度就是算余弦。那么一个直白的方案摆在面前用户查询来了把查询向量和库里每个向量都算一遍余弦取Top-K——完事。算笔账1000万条向量、每条768维一次查询就是1000万次向量运算单次查询要跑几秒到十几秒。Demo阶段数据几千条无所谓上了生产这个延迟就是灾难。ANNApproximate Nearest Neighbor近似最近邻就是为了干掉这个逐条比对而生的。它的核心思想用一句话说不追求100%找到最近的那几个只要找到几乎肯定是最近的那几个——用1%的精度损失换100倍的速度提升。这篇文章拆解三大主流ANN算法IVF、HNSW、PQ讲清原理、参数和选型。1 ~ 先立标杆暴力检索的成本暴力检索Flat的成本账 数据量1000万条 ×768维 ×4字节(float32)≈28.7GB 内存 计算量每次查询1000万次余弦相似度计算 延迟 秒级且随数据量线性增长 并发 每次查询全表扫QPS稍微一高CPU就打满暴力法有个正式名字叫Flat索引——它是唯一保证100%召回的方案也是衡量一切ANN算法的精度基准。记住这个数字ANN算法的召回率指的就是它的结果和暴力法结果的重合比例。召回98%意思是ANN找到的Top-10里平均有9.8个和暴力法一致。1.1 ANN的统一思路三个算法招式不同心法完全一致别把查询和全库比对先用某种结构把肯定不相关的绝大多数向量跳过只在候选子集里精算。区别只在于——用什么结构来跳。IVFHNSWPQ查询向量进来用索引结构快速圈定候选集找最近的几个桶只搜桶内向量从顶层图入口逐层导航到最近邻压缩码快速估算近似距离筛选候选集内精确计算返回Top-K牺牲约1%~5%召回换来10~100倍提速2 ~ IVF先分桶再搜桶2.1 原理和查字典一个思路查字典不会从第一页翻到最后一页——先按拼音找到部首区再在区里找字。IVFInverted File倒排文件干的就是这件事建索引阶段1. 用K-Means把1000万向量聚成nlist1024个桶2. 每个向量存进离它最近的那个桶 查询阶段1. 查询向量先和1024个桶的中心比 → 找最近的nprobe10个桶2. 只在这10个桶里约10万向量精算相似度3. 计算量从1000万次 →10万次直降99%2.2 两个参数的权衡参数作用调大调小nlist建库时分多少个桶每桶更细、查询更快建索引慢、易分碎桶大、查询慢nprobe查询时搜多少个桶召回高、速度慢召回低、速度快nprobe是线上最常用的旋钮召回不够就调大延迟敏感就调小不用重建索引、改完立即生效。经验起点nlist ≈ 4×√数据量nprobe从nlist的1%开始试。2.3 短板分桶边界是硬伤——如果最近邻恰好落在相邻的桶里而那个桶又没被nprobe选中就永远找不回来了。数据分布越不均匀漏检越严重。3 ~ HNSW小世界里的图导航3.1 原理跳表思想搬进高维空间HNSWHierarchical Navigable Small World是当前召回率之王思想却很好懂——想象你在陌生城市找人分层导航的过程 第2层稀疏层只有机场几步跳到目标城市 ← 粗定位 第1层中等密度有高铁站跳到目标城区 ← 中定位 第0层全量层所有街道都在精确走到目的地 ← 细定位建索引时所有向量在底层连成一张近邻图每个点连着最相近的M个邻居再按概率抽出部分点建上层稀疏图。查询时从顶层随机入口出发每一层都执行同一个贪心策略跳到比当前更近的邻居直到跳不动然后下到更密的一层。3.2 关键参数参数阶段含义经验值M建库每个点连几个邻居16~64越大图越密、召回越高、内存越大ef_construction建库建图时的搜索宽度200左右影响建索引质量ef查询时查询查询时的搜索宽度动态旋钮≥K越大召回越高越慢ef对标IVF的nprobe——都是搜多宽的线上旋钮调大召回涨、延迟涨。3.3 为什么它是主流HNSW的江湖地位 召回率同速度下碾压IVF图导航比分桶更能追踪真实的近邻结构 延迟 微秒~毫秒级千万级数据轻松hold住 短板 内存大户——图结构本身要吃掉原始向量30%~50%的额外内存 数据动态删除支持弱图里删点会留下断桥Milvus、Qdrant、Weaviate、Chroma——主流向量库的默认或推荐索引全是HNSW不是没道理的。4 ~ PQ把向量压扁内存直降97%4.1 原理分段代号替换HNSW快但吃内存PQProduct Quantization乘积量化从另一个维度解题——不优化怎么找优化怎么存压缩过程以768维 →96段为例1. 把768维向量切成96段每段8维2. 对全库的第1段做聚类得到256个代表码本 同理每一段都有自己的256个代表3. 存储时每段不存8个浮点数只存它最接近的代表编号 → 编号范围0~255一个字节搞定 压缩比768×4字节 →96×1字节3072B → 96B省97%内存查询时用查表法快速估算距离提前算好查询向量各段到256个代表的距离表不再需要解压缩全部向量。4.2 代价与定位压缩是有损的——代表不等于原向量距离估算有误差召回率明显低于HNSW。所以PQ几乎不单独使用标准姿势是和IVF或HNSW组合如IVF_PQ、HNSW_PQ粗筛用结构、精算用压缩距离内存和速度兼得。亿级以上的数据规模PQ基本是必选项。5 ~ 三算法对比与选型5.1 实测画像维度IVFHNSWIVF_PQ / HNSW_PQ召回率中85%~95%高95%~99%中低80%~95%查询速度快最快快内存占用中高图结构30~50%极低省97%构建速度快慢建图贵中线上调参旋钮nprobeefnprobe/ef适用规模百万~千万百万~千万内存够千万~亿级5.2 选型决策树数据量100万 ├─ 是 → 别纠结Flat暴力法或默认HNSW召回拉满 └─ 否 → 内存预算充足 ├─ 是 → HNSWM32,ef128起步召回优先 └─ 否 → 数据量5000万 ├─ 是 → IVF_PQ 或 HNSW_PQ内存优先 └─ 否 → IVFnlist4√N, nprobe逐步调最后一句实在话参数没有银弹值只有适合你数据分布的值。上线前务必用自己的真实数据做召回率压测——拿1000个查询同时跑暴力法和ANN看Top-K重合度这才是你的召回率不是论文里的。思考 总结ANN的本质是权衡用1%5%的召回率损失换10100倍的速度——暴力法Flat是衡量一切ANN算法的召回基准。IVF像查字典先分桶nlist再搜桶nprobenprobe是线上最顺手的精度/速度旋钮分桶边界漏检是天生短板。HNSW是召回率之王分层图导航顶层粗跳底层细搜ef对标nprobe代价是图结构多吃30%~50%内存、弱于动态删除。PQ解决内存问题向量分段、每段存一字节代号省97%内存有损压缩召回偏低所以总是和IVF/HNSW组合出场。选型三问数据量多大内存预算多少召回要求多高——没有银弹参数用自己数据实测的召回率才算数。算法原理就位是时候落地了——下一篇进入向量数据库的实战环节Milvus从零到生产Standalone和Cluster怎么选、集合怎么设计、索引参数怎么落到配置里。结尾各位小伙伴本文的内容到这里就全部结束了源码骑士在这里再次感谢您的阅读源码骑士 — Android Framework 全栈开发关注跟博主一起从源码视角深耕底层原理见证每一次成长❤️点赞让优质内容被更多人看见让知识传递更有力量⭐收藏把核心知识点存好在需要时随时查、随时用评论分享你的经验或疑问评论区一起交流避坑一键四连不要忘记给博主一键四连哦️寄语技术之路难免有困惑但同行的人会让前进更有方向结语IVF教会我们分而治之HNSW教会我们站在高处看方向PQ教会我们舍弃冗余换空间——三种算法的思想早已超出向量检索本身值得放进每个工程师的思维工具箱。不要忘记给博主一键四连哦