news 2026/8/29 5:35:31

高效索引之HNSW_SQ:如何同时兼顾RAG的速度、召回率与成本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高效索引之HNSW_SQ:如何同时兼顾RAG的速度、召回率与成本

在RAG在内的高维向量检索场景里,我们常常会陷入一个不可能三角:

硬件不变的情况下,想要更快的查询速度,就得牺牲一部分召回率;如果想要召回率与速度同时兼顾,就得增加硬件预算……

那么,有没有一种方法能打破这个僵局?最新的Milvus能力升级中,给出了答案:HNSW_SQ索引。

通过把HNSW的高效检索能力,和标量量化(SQ)的极致压缩特性结合,做到了性能、速度与成本的同时兼顾。

而与标准HNSW相比,HNSW_SQ最大的不足可能就是保证召回率的同时,索引构建时间会略有增加。

01

HNSW与SQ是什么

解读HNSW_SQ之前,我们需要先对HNSW与SQ这两个底层技术有一个基础的认知。

先说说HNSW。它的核心是构建一个多层图结构,数据集中的每个向量对应图里的一个节点。节点之间会根据向量相似度建立连接,搜索的时候,算法可以从上层稀疏的图快速定位到下层密集的图中的区域,大大缩小需要遍历的范围,这也是它能实现高速检索、高召回的关键。

但光有HNSW还不够,面对海量高维向量,内存开销依然是个大问题。这时候就轮到标量量化(SQ)登场了。

SQ的原理很简单,就是用更少的比特数来表示向量里的浮点数值,从而实现数据压缩。

比如常见的SQ8用8比特,能把数值映射到256个等级;SQ6用6比特,对应64个等级。压缩后的向量体积大幅减小,不仅能降低内存占用,还能加快数据传输和计算的速度。

当然,压缩会带来一点精度损失,但只要控制得当,这种损失完全在可接受范围内。

此外,对于那些追求极致速度和极小内存的场景,Milvus 2.6.8及以上版本还推出了更极致的量化技术SQ4U。它是一种4比特的均匀标量量化方案,将每个维度的浮点值压缩成一个4 位无符号整数,其中“U”代表Uniform,也就是均匀量化。

和传统的按维度独立计算极值的非均匀标量量化(逐维量化)方式不同,SQ4U采用的是全局均匀量化策略:它会为整个向量或向量段计算一个统一的最小值 vmin 和数值范围 vdiff,然后把这个范围平均分成16个区间,所有维度的浮点数值都用这一套参数映射成0-15的4比特整数。

这种设计带来了三大优势:

一是压缩比直接拉满,相比FP32能实现8倍压缩,比SQ8也能再压缩2倍,极大缓解了内存带宽的瓶颈;

二是能充分发挥现代CPU的SIMD指令优势,AVX2/AVX-512这些指令集可以在一个周期内处理更多维度的数据,而且全局参数的设计避免了计算距离时反复加载不同的缩放和偏移值,让指令流水线始终处于饱和状态;

三是更小的向量体积意味着更多数据能塞进CPU缓存,减少了频繁访问内存带来的延迟。

不过要注意,SQ4U“因为是全局均匀”,所以在数据经过归一化,或者各维度数值分布比较一致的数据集上效果会更好。

02

HNSW_SQ 是怎么工作的?

说了这么多,HNSW和SQ到底是怎么联手工作的?一共分三个步骤:

第一步是数据压缩。根据我们设定的 sq_type,比如SQ6或者SQ8,把原始向量压缩成低比特的形式。压缩后的向量虽然精度略有下降,但胜在体积小,能让系统处理更大规模的数据集。

第二步是构建HNSW图。用压缩后的向量来构建多层图,因为数据体积变小了,整个图的规模也会跟着缩小,后续的检索速度自然就更快了。

第三步是候选向量检索。当有查询向量进来时,算法会基于压缩后的图数据,快速筛选出一批可能的相似候选向量。

如果对查询精度有更高要求,还可以开启第四步——结果优化。这一步的核心是几个关键参数:

refine 控制是否开启优化,开启后系统会用更高精度的数据重新计算距离;

refine_type 决定优化时用的数据精度,比如SQ8、BF16甚至FP32,精度越高结果越准,但内存开销也越大,而且它的精度必须高于之前设定的 sq_type;

refine_k 是个放大系数,比如你要取Top100的结果,refine_k 设为2,系统就会先选出Top200的候选,再重新排序得到最准的Top100。

03

如何用好HNSW_SQ

理论讲完,我们直接上手实操。

第一步:构建HNSW_SQ索引

首先准备好索引参数,指定向量字段名add_index()、索引类型(index_type)为HNSW_SQ,再根据需求设置距离度量方式(metric_type)和其他关键参数(params)。

from pymilvus import MilvusClient初始化客户端client = MilvusClient("your_milvus_uri")准备索引参数index_params = client.prepare_index_params()index_params.add_index(field_name="your_vector_field_name",index_type="HNSW_SQ",index_name="vector_index",metric_type="L2",支持COSINE、IP等params={"M": 64,每个节点的最大连接数"efConstruction": 100,构建索引时考虑的候选邻居数"sq_type": "SQ6",选择量化类型"refine": True,开启结果优化"refine_type": "SQ8"优化时用更高精度})创建索引client.create_index(collection_name="your_collection_name", index_params=index_params)

这里的几个参数可以根据业务需求调整:M 越大,索引精度越高,但构建和检索的耗时也会增加,一般建议在5-100之间;efConstruction 越大,构建出的索引质量越好,但耗时更长,推荐范围是50-500。

第二步:基于HNSW_SQ索引进行搜索

索引建好后,就可以发起相似性搜索了,关键是配置好搜索参数。

配置搜索参数search_params = {"params": {"ef": 10,搜索时遍历的节点数,影响精度和速度"refine_k": 1优化阶段的候选放大系数}}发起搜索res = client.search(collection_name="your_collection_name",anns_field="your_vector_field_name",data=[[0.1, 0.2, 0.3, 0.4, 0.5]],你的查询向量limit=3,返回Top3相似结果search_params=search_params)查看结果print(res)

搜索参数里的 ef 很关键,它决定了搜索时的遍历广度,数值越大精度越高,但速度越慢,一般建议设置在K到10K之间,K就是你要返回的结果数。

总的来说,HNSW_SQ就是这样一个能灵活平衡速度-内存-精度的向量索引方案。

你可以根据业务需求,通过调整量化类型、索引参数和搜索参数,找到最适合自己的那组配置。

无论是大规模数据集的快速检索,还是资源紧张场景下的内存优化,它都能轻松应对。

阅读推荐 Spark做ETL,与Ray/Daft做特征工程的区别在哪里,如何选型? 教程:如何用飞书+Moltbot,打造你的MilvusAI小助手 RAG优化不抓瞎!Milvus检索可视化,帮你快速定位嵌入、切块、索引哪有问题 Milvus+印度最大电商平台,如何打造服务两亿月活用户的商品比价系统 都有混合检索与智能路由了,谁还在给RAG赛博哭坟?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/28 8:36:40

Windows SMB RCE漏洞CVE-2025-33073分析与利用工具

Windows SMB RCE漏洞CVE-2025-33073分析与利用工具 项目描述 该项目是一个针对Windows SMB客户端远程代码执行漏洞CVE-2025-33073的安全研究与渗透测试工具集。该漏洞被标记为高危(CVSS 8.8分),影响Windows 10、11及Server 2012-2025的所有版…

作者头像 李华
网站建设 2026/8/26 23:49:10

基于YOLOv5/v8/v10的手势识别系统:从理论到全栈实践

摘要 手势识别作为人机交互的重要方式,在虚拟现实、智能家居、无障碍通信等领域具有广泛应用价值。本文系统介绍了基于YOLO系列目标检测算法的手势识别完整解决方案,涵盖YOLOv5、YOLOv8和YOLOv10三个版本的核心技术对比,提供了完整的训练数据…

作者头像 李华
网站建设 2026/8/26 7:02:43

好写作AI:交叉学科“翻译官”,终结你的“学术巴别塔”困境!

各位在多个学科夹缝中“反复横跳”、左手生物学术语右手代码参数的交叉学科卷王们,是否经常这样:脑中的idea融合了A学科的深邃理论与B学科的犀利方法,感觉自己站在创新的潮头,一下笔却发现——“我写的这段话,两边领域…

作者头像 李华
网站建设 2026/8/28 11:52:40

基于Python 图形学实验(生成中间帧)

图形学实验: 生成中间帧 给定初始图片和结束图片,生成中间的N帧,使得首尾自然过渡 开发环境 开发环境:macOS Mojave 10.14.6开发软件:PyCharm 2019.1.3开发语言:python 如何运行 将项目文件夹拷贝到本地环境运行s…

作者头像 李华
网站建设 2026/8/22 9:50:15

从理论到实践:Node-RED性能优化的完整案例解析

在物联网和自动化领域,Node-RED以其直观的可视化编程界面赢得了众多开发者的青睐。然而,许多用户在实际应用中都会遇到一个共同的问题:为什么我的Node-RED流程看起来逻辑清晰,运行起来却异常缓慢? 为什么你的Node-RED…

作者头像 李华
网站建设 2026/8/26 13:44:04

亲测好用10个降AIGC工具 千笔AI帮你高效降AI率

AI降重工具的崛起与实用价值 在当前学术写作日益依赖AI生成内容的背景下,越来越多的学生和研究者开始关注如何有效降低AIGC率、去除AI痕迹,同时保持文章的逻辑性和语义通顺。这不仅关乎论文通过查重系统的标准,更直接影响到学术诚信和论文质…

作者头像 李华