Skip to main content
QBit 数据类型会重新组织向量的存储方式,以加快近似向量搜索。它不是将每个向量的元素存储在一起,而是将所有向量中相同二进制位位置的值分组存储。 这样既能以全精度存储向量,又能让你在搜索时选择细粒度的量化级别:读取更少的位可减少 I/O 并加快计算,读取更多的位则可获得更高精度。你既能享受量化在减少数据传输和计算量方面带来的速度优势,又能在需要时使用全部原始数据。 要声明一个 QBit 类型的列,请使用以下语法:
  • element_type – 每个向量元素的数据类型。允许的类型包括 Int8BFloat16Float32Float64
  • dimension – 每个向量中的元素个数

创建 QBit

在表的列定义中使用 QBit 类型:

将数组转换为 QBit

当数组长度与 QBit 的维度一致时,数组会转换为 QBit。数组的元素类型不必与 QBit 的元素类型一致。任何数值类型的元素都会自动转换为 QBit 的元素类型。因此,你可以将现有的嵌入向量列直接迁移到 QBit 列中:
这种转换也可以显式地通过 CAST 实现,例如 CAST(embedding AS QBit(Float32, 8))

将 QBit 转换为数组

反向转换会根据按比特转置后的表示重建原始向量,因此将 QBit 转换为 Array 时会返回存储的值。这一过程与将数组转换为 QBit相反:
重建后的数组会使用 QBit 的 元素类型,然后再将其中的元素转换为所请求的数组 元素类型。因此,连同 元素类型 一并更改的转换同样可行,例如从 QBit(Float32, N) 转换为 Array(Float64) 对于 Int8Float32Float64Array -> QBit -> Array 的往返转换是无损的。对于 BFloat16,其结果与直接转换为 BFloat16 一致——唯一损失的精度仅来自 BFloat16 本身。 dimension 不是 8 的倍数时,内部表示中的尾部 padding 元素会被丢弃,因此结果始终恰好包含 dimension 个元素。

QBit 子列

QBit 实现了一种子列访问模式,使您可以访问已存储向量中的各个位平面。每个比特位都可以通过 .N 语法访问,其中 N 表示该比特位的位置:
可访问的子列数量取决于元素类型:
  • Int8:8 个子列 (1-8)
  • BFloat16:16 个子列 (1-16)
  • Float32:32 个子列 (1-32)
  • Float64:64 个子列 (1-64)

向量搜索函数

以下是用于向量相似搜索、且使用 QBit 数据类型的距离函数:
最后修改于 2026年7月1日