在本指南中,您将:
- 简要了解向量搜索
- 了解近似最近邻 (ANN) 和 分层可导航小世界 (HNSW)
- 了解 Quantised Bit (QBit)
- 使用 QBit 基于 DBPedia 数据集执行向量搜索
向量搜索入门
理解嵌入向量
近似最近邻 (ANN)
量化
- 将量化后的副本与原始列一并保留 - 这会使存储翻倍,但更安全,因为我们始终可以回退到完整精度
- 完全替换原始值 (通过在插入时向下转换) - 这样可以节省空间和 I/O,但这是不可逆的
分层可导航小世界 (HNSW)
方法对比
QBit 深入剖析
Quantised Bit (QBit)
BFloat16、Float32 和 Float64 值。
QBit 并不是将每个数字作为一个整体存储,而是将这些值拆分为位平面:所有第 1 位、所有第 2 位、所有第 3 位,依此类推。
这种方法解决了传统量化的主要局限。既不需要存储重复数据,也无需承担数值失去意义的风险。由于 QBit 直接基于已存储的数据工作,而不是维护内存中的索引,因此它也避开了 HNSW 的 RAM 瓶颈。
局限性尽管 QBit 能加速向量搜索,但其计算复杂度仍然是 O(n)。换句话说,如果你的数据集足够小,HNSW 索引可以轻松装入 RAM,那它仍然是最快的选择。
数据类型
FixedString(N) 列中:也就是长度固定为 N 字节的字符串,在内存中连续存放,彼此之间没有分隔符。随后,所有这些组会被打包到一个 Tuple 中,构成 QBit 的底层结构。
示例: 如果从一个包含 8×Float64 元素的向量开始,每个组将包含 8 位。由于一个 Float64 有 64 位,最终会得到 64 个组 (每一位对应一个组) 。因此,QBit(Float64, 8) 的内部布局看起来就像一个由 64×FixedString(1) 列组成的 Tuple。
距离计算
L2DistanceTransposed 函数:
I/O 优化
计算优化
BFloat16 优化
Float64 的复杂性
DBpedia 示例
准备
搜索查询
与穷举搜索比较性能
与穷举搜索比较性能
关键洞察
结论
改编自 Raufs Dunamalijevs 的博客文章,发表于 2025 年 10 月 28 日