96-向量检索算法ANN-HNSW-IVF-PQ乘积量化-精度速度对比
文章目录【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教会我们舍弃冗余换空间——三种算法的思想早已超出向量检索本身值得放进每个工程师的思维工具箱。不要忘记给博主一键四连哦

相关新闻

基于PLC控制的冷却水循环系统设计与实现|毕设答辩|PLC项目|毕设项目|自动化项目

基于PLC控制的冷却水循环系统设计与实现|毕设答辩|PLC项目|毕设项目|自动化项目

题目:基于PLC控制的冷却水循环系统设计与实现 一、项目介绍 摘 要 工业生产中,冷却水循环系统的稳定高效运行对设备安全和生产效率有着重要影响,传统控制系统存在操作繁琐、能耗较高、稳定性不足等问题,难以满足现代化工业的控制需…

2026/10/11 21:42:57 阅读更多 →
从Ambari迁移到Apache BigTop:基于Puppet的Hadoop集群部署与运维实战

从Ambari迁移到Apache BigTop:基于Puppet的Hadoop集群部署与运维实战

1. 项目概述:为什么我们需要寻找Ambari的替代方案最近在社区里,和不少负责大数据平台运维的老哥聊天,大家普遍都在吐槽一个事儿:Ambari这玩意儿,用起来是越来越“心累”了。我自己的团队也深有同感。Ambari曾经是Hadoo…

2026/10/9 17:09:19 阅读更多 →
Java内部类与外部类引用关系解析

Java内部类与外部类引用关系解析

1. 内部类与外部类引用的本质关系在Java开发中,内部类持有外部类引用这个现象看似简单,实则暗藏玄机。我第一次真正理解这个机制,是在排查一个内存泄漏问题时——当时应用运行几小时后就会OOM崩溃,最终发现是内部类实例被长生命周…

2026/10/9 9:24:33 阅读更多 →

最新新闻

基于滑动窗口去重设计轻量实时事件聚合器:从需求到落地

基于滑动窗口去重设计轻量实时事件聚合器:从需求到落地

之前我负责的一个内部工具项目,代号就叫 rea,全称后来定为 Realtime Event Aggregator。最初催生这个项目的需求并不复杂:多条业务线不停地产生事件,每秒钟少则几千、多则几万条,我们要把这些事件统一收上来&#xff0…

2026/10/11 22:21:04 阅读更多 →
Python局部敏感哈希实战:论文查重与相似度比对

Python局部敏感哈希实战:论文查重与相似度比对

简介:这是一份面向计算机专业学生与毕业设计开发者的Python实战资源,围绕局部敏感哈希(LSH)算法实现论文相似性比对。资源从LSH的(r1,r2,p1,p2)敏感性定义出发,讲解相似对象映射为同一哈希值概率高、不相似对象概率低的…

2026/10/11 22:21:04 阅读更多 →
日化广告投放数据分析报告:从数据归集到PPT模板的完整流程

日化广告投放数据分析报告:从数据归集到PPT模板的完整流程

简介:这份日化广告投放数据分析报告PPT模板面向日化行业营销人员、广告投放策略制定者及希望提升数据分析能力的市场从业者,帮助其快速搭建专业的数据汇报框架,理清广告效果评估与策略优化思路。压缩包共3个文件,以一份可直接编辑…

2026/10/11 22:21:04 阅读更多 →
evlog CLI 可观测性评分实战:用 evlog map 揪出应用里的暗区日志入口

evlog CLI 可观测性评分实战:用 evlog map 揪出应用里的暗区日志入口

【免费下载链接】evlog Digging through logs is not observability. Its hope — wide events, structured errors, TypeScript-first, every runtime. 项目地址: https://gitcode.com/gh_mirrors/ev/evlog 点击查看 免费下载 为什么需要 evlog 可观测性评分 翻日…

2026/10/11 22:21:04 阅读更多 →
agent-skills:面向生产环境的智能体能力治理范式

agent-skills:面向生产环境的智能体能力治理范式

1. 项目概述:一个被严重低估的“技能容器”概念“agent-skills”这个词组乍看像技术黑话,但拆开来看——它既不是某个具体开源库的官方命名,也不是某家大厂刚发布的API产品名,而是一个正在快速凝聚共识的设计范式代号。我在过去三…

2026/10/11 22:21:04 阅读更多 →
pip安装报错No space left on device?磁盘与inode排查详解

pip安装报错No space left on device?磁盘与inode排查详解

今天帮一位同事排查安装报错时,又看到了那行红色大字:ERROR: Could not install packages due to an OSError: [Errno 28] No space left on device。这行提示我见过太多次,几乎每个用 Python 做开发的人迟早都会撞上,尤其是服务器…

2026/10/11 22:20:04 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →