Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)
作者:来自 Elastic Benjamin Trent
为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。
我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度,而且还通过标量量化降低成本。首先是 4 倍,然后是 8 倍。然而,这还不够。通过乘积量化(Product Quantization 简称 PQ)等技术,可以在不显著降低召回率的情况下实现 32 倍的减少。我们需要实现更高级别的量化,以在速度和成本之间提供足够的权衡。
一种实现这一目标的方法是专注于 PQ(乘积量化)。另一种则是直接改进二值量化。剧透如下:
- BBQ 的向量量化速度比 PQ 快 10-50 倍
- BBQ 的查询速度比 PQ 快 2-4 倍
- BBQ 的召回率与 PQ 相当或更好
那么,我们到底测试了什么?结果如何?
我们到底要测试什么?
从理论上讲,PQ 和 Better Binary Quantization(BBQ) 都有各种优缺点。但我们需要一套静态的标准来测试两者。拥有一个独立的 “优点和缺点(pros & cons)” 列表是一种过于定性的衡量标准。当然,事物有不同的好处,但我们希望有一套定量的标准来帮助我们做出决策。这遵循了类似于 Rich Hickey 解释的决策矩阵的模式。
我们的标准是:
- 搜索速度
- 索引速度平稳
- 使用 HNSW 的索引速度
- 合并速度
- 内存减少可能
- 该算法是否众所周知并在生产环境中经过实战测试?
- 粗粒度聚类是否绝对必要?或者,该算法如何公平地只使用一个质心
- 需要强力(brute force)过采样才能实现 95% 的召回率
- HNSW 索引仍然有效,并且可以在与强力类似的重新排序下实现 +90% 的召回率
显然,几乎所有标准都是可衡量的,我们确实有一个我们认为重要的定性标准。对于未来的可支持性,成为一种众所周知的算法很重要,如果所有其他措施都与之相关,这可能是决策的转折点。
我们如何测试它?
Lucene 和 Elasticsearch 都是用 Java 编写的,因此我们直接用 Java 编写了两个概念证明。这样,我们就可以在性能上进行同类比较。另外,在进行乘积量化(Product Quantization, PQ)时,我们仅测试了最高 32 倍的空间压缩。虽然 PQ 可以通过减少码本数量(code books)进一步压缩空间,但我们发现对于许多模型来说,召回率会迅速下降到不可接受的水平,从而需要更高比例的过采样。
此外,由于优化 PQ(Optimized PQ)对计算资源要求较高,我们没有采用这种技术。
我们测试了不同的数据集和相似性指标。特别是:
- e5Small,它只有 384 个维度,与其他模型相比,它的向量空间相当窄。你可以在我们的位向量博客中看到 e5small 的简单二进制量化表现有多差。因此,我们希望确保二进制量化的演变能够处理这样的模型。
- Cohere 的 v3 模型,它有 1024 个维度,并且喜欢被量化。如果量化方法不适用于此方法,那么它可能不适用于任何模型。
- Cohere 的 v2 模型有 768 个维度,其出色的性能依赖于最大内积的非欧几里得向量空间。我们希望确保它能够像乘积量化一样处理非欧几里得空间。
我们在基于 ARM 的 MacBook 上进行了本地测试,并在更大的 x86 机器上进行了远程测试,以确保无论 CPU 架构如何,我们发现的任何性能差异都是可重复的。
那么,结果如何呢?
e5small quora
这是一个较小的数据集,使用 e5small 构建了 522k 个向量。它的维度很少,嵌入空间很窄,因此无法与简单的二进制量化一起使用。由于 BBQ 是二进制量化的演变,因此验证它与 PQ 相比在如此不利的模型下是否有效非常重要。
在 M1 Max ARM 笔记本电脑上测试:
Algorithm | quantization build time (ms) | brute-force latency (ms) | brute-force recall @ 10:50 | hnsw build time (ms) | hnsw recall @ 10:100 | hnsw latency (ms) |
---|---|---|---|---|---|---|
BBQ | 1041 | 11 | 99% | 104817 | 96% | 0.25 |
Product Quantization | 59397 | 20 | 99% | 239660 | 96% | 0.45 |
CohereV3
此模型在量化方面表现出色。我们希望在单个粗粒度质心中处理更多向量(30M),以确保我们的小规模结果实际上可以转化为更多向量。
此测试是在 Google Cloud 中一台更大的 x86 机器上进行的:
Algorithm | quantization build time (ms) | brute-force latency (ms) | brute-force recall @ 10:50 | hnsw build time (ms) | hnsw recall @ 10:100 | hnsw latency (ms) |
---|---|---|---|---|---|---|
BBQ | 998363 | 1776 | 98% | 40043229 | 90% | 0.6 |
Product Quantization | 13116553 | 5790 | 98% | N/A | N/A | N/A |
当谈到类似召回率的索引和搜索速度时,BBQ 显然是赢家。
内积搜索和 BBQ
我们在其他实验中注意到,在量化时,非欧几里得搜索可能很难准确实现。此外,简单的二值量化对向量的大小不敏感,而向量大小对于内积计算至关重要。
带着这个需要注意的点(脚注),我们花了几天时间研究代数,调整查询估算最后阶段的校正措施。结果是:成功了!
Algorithm | recall 10:10 | recall 10:20 | recall 10:30 | recall 10:40 | recall 10:50 | recall 10:100 |
---|---|---|---|---|---|---|
BBQ | 71% | 87% | 93% | 95% | 96% | 99% |
Product Quantization | 65% | 84% | 90% | 93% | 95% | 98% |
就这样,圆满结束!

我们对更优二值量化(Better Binary Quantization, BBQ)感到非常兴奋!经过大量的尝试和验证,我们不断被其结果质量所惊艳 —— 每个向量维度仅保留 1 位信息就能达到如此效果。
敬请期待,它将在未来的 Elasticsearch 版本中与你见面!
Elasticsearch 包含许多新功能,助您构建适合各种场景的最佳搜索解决方案。欢迎查看我们的示例笔记本以了解更多,开启免费的云端试用,或在本地机器上体验 Elastic 的强大功能。
原文:Better Binary Quantization vs. Product Quantization - Search Labs
相关文章:

Elasticsearch:更好的二进制量化(BBQ)对比乘积量化(PQ)
作者:来自 Elastic Benjamin Trent 为什么我们选择花时间研究更好的二进制量化而不是在 Lucene 和 Elasticsearch 中进行生产量化。 我们一直在逐步使 Elasticsearch 和 Lucene 的向量搜索变得更快、更实惠。我们的主要重点不仅是通过 SIMD 提高搜索速度࿰…...
【GNU】gcc -g编译选项 -g0 -g1 -g2 -g3 -gdwarf
1、gcc -g的作用 GCC 的 -g 选项用于在编译时生成调试信息,这些信息会嵌入到生成的目标文件或可执行文件中,主要目的是为了支持调试器(如 gdb)对程序的调试工作。 1.1 生成调试信息 当你在编译代码时使用 -g 选项,GCC…...
MySQL【六】
存储过程 存储过程是一组为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 简单的说存储过程就是具有名字的一段代码。 存储过程的创建 CREATE PROC[ED…...

杰发科技AC7801——ADC定时器触发的简单使用
使用场景 在需要多次采样结果的情况下,比如1s需要10w次的采样结果,可以考虑使用定时器触发采样,定时器设置多少的时间就会多久采样转换一次。 再加上使用dma,采样的结果直接放在dma的数组里面。 实现了自动采样,自动…...

VTK知识学习(8)-坐标系统
1、概述 计算机图形学里常用的坐标系统有4种: 1)、Model坐标系统。定义模型时所采用的坐标系统,通常是局部的笛卡儿坐标系。 2)、World坐标系统。是放置Actor的三维空间坐标系。 Actor(vtkActor类&am…...

IO流部分串讲
一、IO流的概念简析: java将输入与输出比喻为"流",英文:Stream. 就像生活中的"电流","水流"一样,它是以同一个方向顺序移动的过程.只不过这里流动的是字节(2进制数据).所以在IO中有输入流和输出流之分,我们理解他们是连接…...
Excel——宏教程(2)
Excel——宏教程(2) 一)、处理单元格 1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常量,这是在excel中最简单的单元格赋值及引用方法。 如下例将工作表"Sheet1"A1单元格的值赋给Integer变量I,并将I1的值…...
unity 中 RectTransform 的常用几个属性
RectTransform rectTransform this.GetComponent<RectTransform>(); rectTransform this.transform as RectTransform; Vector3 vector1 rectTransform.position; //自身轴心点相对于锚点的位置(编译器显示的pos) …...

项目-摄像
树莓派摄像头使用方法 Camera教程 https://www.raspi.cc/index.php?cread&id53&page1 nanopc-t4 https://www.raspi.cc/index.php?cread&id53&page1 摄像头型号 Raspberry Pi Camera Rev 1.3 检测故障 dmesg | grep -i mipi piNanoPC-T4:~$ dmesg | …...
摄像机ISP和DSP的区别?
影像处理器是现代数字相机、手机等电子设备中极其重要的一部分,它能够对传感器采集的图像进行多种操作,从而得到更高质量的图像。常见的两种影像处理芯片有ISP(Image Signal Processor)和DSP(Digital Signal Processor…...

Ubuntu24安装配置NDK
1、下载NDK 下载压缩包,下载地址如下,建议下载LTS支持版本。 https://developer.android.google.cn/ndk/downloads?hlcs 2、解压缩 将NDK解压到指定文件夹。如:/opt 或者先解压,再移动到指定目录下。 3、配置环境变量 找到…...
【Next】中间件
概述 Next.js 的 中间件 (Middleware) 是一种在请求完成之前运行的函数,用于对入站请求进行处理和操作。它可以在路由匹配前执行逻辑,用于身份验证、请求重写、重定向、设置响应头等任务。 使用场景 身份验证:在用户访问页面前检查登录状态…...

Vulnhub靶场案例渗透[11]- Momentum2
文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 扫描网络目录结构4. 代码审计5. 反弹shell6. 提权 一、靶场搭建 1. 靶场描述 - Difficulty : medium - Keywords : curl, bash, code reviewThis wor…...

STM32设计防丢防摔智能行李箱-分享
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...
Vue Mixin混入机制
在 Vue.js 中,Mixin(混入)是一种可复用代码的机制,用于在多个组件之间共享逻辑。通过混入,可以将通用功能提取到一个独立的文件中,然后在组件中引入并使用,而无需重复代码。 基本概念 Mixin 是…...

数据库类型建表
接着上次的数据库笔记: 初始数据库 (是博主自己写的) 1.数据库类型 1.1数值类型 数据类型大小说明对应JAVA类型BIT[(M)]M指定位数,默认值为1二进制数,M的范围从1—64,存储数值范围从0—2^M-1常用Bool…...

iOS 18 导航栏插入动画会导致背景短暂变白的解决
问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…...

深度学习之人脸检测
在目标检测领域可以划分为了人脸检测与通用目标检测,往往人脸这方面会有专门的算法(包括人脸检测、人脸识别、人脸其他属性的识别等等),并且和通用目标检测(识别)会有一定的差别,着主要来源于人…...
解决前后端发版本时候,手动清除浏览器缓存
在.html页面中添加标签 后端配置nginx,让index.html不缓存 location /index.html { add_header Cache-Control “no-cache, no-store”; }在vite.config.ts中添加 rollupOpyions: { output: { // 输出编译后的文件名称:【文件名称.时间戳】、【文件名称.版本号.…...
mysql8.4+mysql router读写分离
以下为容器环境内搭建 准备工作: 拉取镜像: 镜像版本mysql8.4container-registry.oracle.com/mysql/community-router8.4 下载mysql_shell mysql-shell-9.0.1-linux-glibc2.17-x86-64bit.tar.gz 下载地址: https://downloads.mysql.com/archives/shell/ 参考 这里对这篇文章…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...