← 返回信息流
AI 资讯Hacker News·2 天前

非对称量化实现近无损检索,存储量降低97%

原标题:Asymmetric Quantization: Near-Lossless Retrieval with 97% Storage Reduction

速览

Mixedbread AI的最新研究提出非对称量化方法,用于晚期交互检索系统。这种方法保留查询向量的高精度,同时将文档向量压缩为二进制符号存储。相比传统方法,能在保持接近90.26的NDCG@10性能(实际89.65)的情况下,将大规模语料库的存储量减少32倍,即约97%。该技术对AI时代检索系统降低基础设施成本具有显著意义,适用于大模型驱动的搜索应用。

AI 深度解读

背景

Late interaction(晚期交互)检索模型,例如 WholeEmbed v3,通过保留细粒度信息而非将整个文档压缩成单一向量,大幅提升了检索精度。然而,这种方式显著改变了存储经济学:单个文档会产生数百甚至上千个嵌入向量,每个向量都需要独立存储并在检索过程中被使用。Mixedbread Search 在其专为多模态晚期交互设计的检索引擎 Silo 上运行,支持百亿文档级规模。Silo 将向量存储在对象存储中超过 25 亿个文档,并在查询需求时将其缓存在更快层级中。在这一规模下,每字节额外开销会反复作用于数十亿文档,直接影响每个文档的存储成本、Shard 冷启动时间以及每个查询需要读取的字节量。系统需在保持晚期交互带来高质量的同时,妥善应对存储权衡问题,使整个系统足够经济实惠。

核心内容

Asymmetric Quantization: Near-Lossless Late Interaction Retrieval with 97% Storage Reduction

这一优化称为非对称量化(Asymmetric Quantization),是使晚期交互在生产环境中实用运行的关键之一。系统保留查询向量为较高精度,同时将文档向量存储为二进制符号。在内部基准测试套件中,该方法将原始文档向量存储平均压缩 32 倍,从每文档 393 KiB 降至 12.28 KiB,同时保持检索质量为 89.65 NDCG@10(相比 fp32 的 90.26)。

TL;DR:文档长期存储,查询仅执行一次,因此将文档向量存储为 1 位符号,查询保持 int8。这将每文档存储空间缩小 32 倍,仅在内部基准上 NDCG@10 损失 0.61(90.26 降至 89.65)。

量化即用较低精度值(如 int8 或甚至 1 位符号)表示高精度浮点向量,目标是在保留排名质量的同时缩小负载大小。这对 Silo 尤为关键。对象存储提供持久且低成本的持久化,但需紧凑索引以支持实时工作负载;在文档侧,负载大小主导成本。

朴素晚期交互成本高昂:标准 3072 维度 fp32 单向量每文档 12 KiB,而 786 向量 128 维的多向量表示(未压缩)则大 33 倍。存储数字仅指原始向量负载,生产索引还包含文档 ID、元数据及布局开销。

使用二进制文档向量时,786-token 多向量文档仅比 3072 维度 fp32 单向量大约 2%,因此可支付单向量级存储成本即可获得晚期交互质量。这改变了权衡,使晚期交互成为默认运行模式,而非仅限于值得存储的场景。

这并非晚期交互的新方向:ColBERTv2 证明激进压缩可缩小晚期交互模型的存储 footprint 并保持质量;PLAID 证明晚期交互检索可通过优化检索和剪枝工程化为实用延迟。对于生产系统,两者教训均适用:模型需精确,表征需足够廉价以通过硬件。

为什么采用非对称量化?

压缩文档向量可节省存储、IO、缓存空间及冷启动时间,适用于整个语料库;压缩查询向量则几乎无意义,因为查询小、短生命周期且永不存储于索引中。

这也是不将两侧都二进制化的原因:完全二进制检索是最紧凑选项,但将查询降至单比特会丢弃排名依赖的幅度信息,且质量损失远大于仅对文档二进制化(后文详述)。

因此保留查询为 int8,文档向量仅存储为二进制符号。查询保持足够精度以保留排名,而文档侧获得对服务至关重要的存储降低。

评分技巧

二进制文档向量更小、存储更廉价。对于 int8 × int8 评分,现代 ARM CPU 通过 NEON 点积指令提供直接支持:AArch64 内核使用 SDOT 将 16 个 int8 乘法累加至 int32 通道,随后用 vaddvq_s32 水平归约结果。

对于 int8 × 二进制评分,核心恒等式为:若每个文档维度存储为符号位 b_i ∈ {-1, +1},则:

sum = sum_{b_i=1} q_i - sum_{b_i=-1} q_i = 2 * sum_{b_i=1} q_i - sum q_i

(其中 q_i 为查询值)

在内核中,文档符号打包成位。对于 128 维度路径,预计算查询和、以及八个查询位平面。每个文档 token 以 16 字节打包加载,通过 NEON 整数运算移位并掩码为八个 0/1 掩码,随后用 SDOT 对查询平面评分,最终得分使用上述恒等式:2 * 选定查询和 - 查询和。

二进制 × 二进制在计算上甚至更廉价(可使用汉明距离),但对主要检索路径质量损失过大。

检索质量

在内部检索基准套件中评估了多种精度配对。NDCG@10 为基准套件平均分值(缩放至 0–100 范围,100 为完美排名)。完整精度基线平均 90.26;int8 查询 vs 二进制文档平均 89.65,下降 0.61 分,同时文档向量存储减少 32 倍。部分性能下降源于 WholeEmbed v3 本身就针对 Silo 的量化权衡进行了训练,因此对量化具有鲁棒性。

运行时方面,在 ARM 机器上对 33 × 128 查询(1000 个文档列表,每个文档 786 × 128)进行基准测试。表格报告 9 次测量的中位延迟(含 2 次暖机),以及相对 fp32 基线的加速比。

存在两个实用操作点:若追求最大质量(较低带宽、更快整数评分),int8 × int8 实际上无损;在该设置中略微优于 fp32 基线(测量噪声内),同时文档存储减少 4 倍、运行加速 3.2 倍。

若追求最佳存储经济性,int8 × 二进制为更具吸引力的点:保持大部分排名质量,同时文档向量缩小 32 倍、运行加速 3.8 倍(相对 fp32)。对对象存储支持的系统而言,这是语料库侧字节的直接削减。

二进制 × 二进制 在纸面上看似吸引人:使用与 int8 × 二进制相同的 12.28 KiB 文档存储,运行速度为 4.3 倍。然而它相比基线下降 7.20 分,是 int8 × 二进制下降的十余倍,尽管读取完全相同的文档字节。唯一变化仅为查询。它在实践中去除了过多查询信号。

这解锁了什么?

非对称量化有效,因为检索系统对查询与文档精度的支付方式不同。文档向量主导系统长期成本:它们被存储、复制、缓存、逐出、重新水合并反复评分。查询向量生命周期短,因此在查询上多花几位比特、而在每个存储文档上节省比特,是正确的权衡。

对 Silo 而言,这使大规模晚期交互检索服务变得更加容易。存储每文档的成本降低、Shard 冷启动更快、系统整体更具经济性。

查看原文 →mixedbread.com