阜宁县建设局网站江苏省住房与城乡建设厅网站
阜宁县建设局网站,江苏省住房与城乡建设厅网站,网站开发服务商平台,软文自助发布平台系统在RAG在内的高维向量检索场景里#xff0c;我们常常会陷入一个不可能三角#xff1a;硬件不变的情况下#xff0c;想要更快的查询速度#xff0c;就得牺牲一部分召回率#xff1b;如果想要召回率与速度同时兼顾#xff0c;就得增加硬件预算……那么#xff0c;有没有一种…在RAG在内的高维向量检索场景里我们常常会陷入一个不可能三角硬件不变的情况下想要更快的查询速度就得牺牲一部分召回率如果想要召回率与速度同时兼顾就得增加硬件预算……那么有没有一种方法能打破这个僵局最新的Milvus能力升级中给出了答案:HNSW_SQ索引。通过把HNSW的高效检索能力和标量量化SQ的极致压缩特性结合做到了性能、速度与成本的同时兼顾。而与标准HNSW相比HNSW_SQ最大的不足可能就是保证召回率的同时索引构建时间会略有增加。01HNSW与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“因为是全局均匀”所以在数据经过归一化或者各维度数值分布比较一致的数据集上效果会更好。02HNSW_SQ 是怎么工作的说了这么多HNSW和SQ到底是怎么联手工作的一共分三个步骤第一步是数据压缩。根据我们设定的 sq_type比如SQ6或者SQ8把原始向量压缩成低比特的形式。压缩后的向量虽然精度略有下降但胜在体积小能让系统处理更大规模的数据集。第二步是构建HNSW图。用压缩后的向量来构建多层图因为数据体积变小了整个图的规模也会跟着缩小后续的检索速度自然就更快了。第三步是候选向量检索。当有查询向量进来时算法会基于压缩后的图数据快速筛选出一批可能的相似候选向量。如果对查询精度有更高要求还可以开启第四步——结果优化。这一步的核心是几个关键参数refine 控制是否开启优化开启后系统会用更高精度的数据重新计算距离refine_type 决定优化时用的数据精度比如SQ8、BF16甚至FP32精度越高结果越准但内存开销也越大而且它的精度必须高于之前设定的 sq_typerefine_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_nameyour_vector_field_name,index_typeHNSW_SQ,index_namevector_index,metric_typeL2,支持COSINE、IP等params{M: 64,每个节点的最大连接数efConstruction: 100,构建索引时考虑的候选邻居数sq_type: SQ6,选择量化类型refine: True,开启结果优化refine_type: SQ8优化时用更高精度})创建索引client.create_index(collection_nameyour_collection_name, index_paramsindex_params)这里的几个参数可以根据业务需求调整M 越大索引精度越高但构建和检索的耗时也会增加一般建议在5-100之间efConstruction 越大构建出的索引质量越好但耗时更长推荐范围是50-500。第二步基于HNSW_SQ索引进行搜索索引建好后就可以发起相似性搜索了关键是配置好搜索参数。配置搜索参数search_params {params: {ef: 10,搜索时遍历的节点数影响精度和速度refine_k: 1优化阶段的候选放大系数}}发起搜索res client.search(collection_nameyour_collection_name,anns_fieldyour_vector_field_name,data[[0.1, 0.2, 0.3, 0.4, 0.5]],你的查询向量limit3,返回Top3相似结果search_paramssearch_params)查看结果print(res)搜索参数里的 ef 很关键它决定了搜索时的遍历广度数值越大精度越高但速度越慢一般建议设置在K到10K之间K就是你要返回的结果数。总的来说HNSW_SQ就是这样一个能灵活平衡速度-内存-精度的向量索引方案。你可以根据业务需求通过调整量化类型、索引参数和搜索参数找到最适合自己的那组配置。无论是大规模数据集的快速检索还是资源紧张场景下的内存优化它都能轻松应对。阅读推荐 Spark做ETL与Ray/Daft做特征工程的区别在哪里如何选型 教程如何用飞书Moltbot打造你的MilvusAI小助手 RAG优化不抓瞎Milvus检索可视化帮你快速定位嵌入、切块、索引哪有问题 Milvus印度最大电商平台如何打造服务两亿月活用户的商品比价系统 都有混合检索与智能路由了谁还在给RAG赛博哭坟