掘金 后端 ( ) • 2024-05-04 10:25

作者:来自 Elastic Thanos Papaoikonomou, Thomas Veasey

在 8.13 版本中,我们为 Elasticsearch 引入了标量量化功能。通过使用此功能,最终用户可以提供浮点向量,这些向量在内部作为字节向量进行索引,同时在索引中保留浮点向量,以便可选地重新评分。这意味着他们可以将索引内存需求降低四分之一,这是其主要成本。目前,这是一个可选择加入的功能,但我们认为与将向量索引为浮点数相比,这是一个更好的权衡。在 8.14 版本中,我们将使其成为默认设置。然而,在这样做之前,我们希望对质量影响进行系统评估。

多语言 E5-small 是我们在 Elasticsearch 中提供的一个高质量小型多语言段落嵌入模型。它有两个版本:一个跨平台版本,可以在任何硬件上运行,还有一个为 Elastic Stack 中的 CPU 推理优化的版本(参见此处)。E5 代表了自动量化的一个挑战性案例,因为它产生的向量角度变化小且相对于最新技术模型维度较低。如果我们能够在为这个模型启用 int8 量化时实现几乎没有损害,我们就可以有信心它将可靠工作。

这次实验的目的是评估在广泛的检索任务中使用此模型描述的标量量化 kNN 搜索的效果。更具体地说,我们的目标是评估从全精度索引切换到量化索引的性能下降(如果有的话)。

方法论概述

在评估中,我们依赖于 BEIR,并针对我们考虑的每个数据集构建了一个使用默认超参数(m: 16, ef_construction: 100)的全精度和一个 int8 量化索引。首先,我们尝试了 Elastic 在此处提供的多语言 E5-small 模型的量化版本(仅权重),表 1 概述了 nDCG@10 分数(k:10,num_candidates:100):

表 1:精选 BEIR 数据集的全精度和 int8 量化指数的 nDCG@10 分数DatasetFull precisionInt8 quantizationAbsolute differenceRelative differenceArguana0.370.362-0.008-2.16%FiQA-20180.3090.304-0.005-1.62%NFCorpus0.3020.297-0.005-1.66%Quora0.8760.875-0.001-0.11%SCIDOCS0.1350.132-0.003-2.22%Scifact0.6490.644-0.005-0.77%TREC-COVID0.6830.672-0.011-1.61%Average-0.005-1.05%

总体而言,平均而言,似乎有轻微的相对下降,约为 1.05%。

接下来,我们考虑重复使用多语言 E5-small 的未量化版本进行相同的评估过程(请参阅此处的模型卡片),表 2 显示了相应的结果。

表 2:在精选的 BEIR 数据集上多语言-E5-small 的 nDCG@10 分数DatasetFull precisionInt8 quantizationAbsolute differenceRelative differenceArguana0.3840.379-0.005-1.3%Climate-FEVER0.2140.222+0.008+3.74%FEVER0.7180.715-0.003-0.42%FiQA-20180.3280.324-0.004-1.22%NFCorpus0.310.306-0.004-1.29%NQ0.5480.537-0.011-2.01%Quora0.8820.881-0.001-0.11%Robust040.4180.415-0.003-0.72%SCIDOCS0.1340.132-0.003-1.49%Scifact0.670.666-0.004-0.6%TREC-COVID0.7090.693-0.016-2.26%Average-0.004-0.83%

再次观察到性能略微相对下降,平均下降为 0.83%。最后,我们对多语言 E5-base 重复了相同的实验,性能下降甚至更小(0.59%)。

但这还不是全部:量化 HNSW 索引的增加效率以及原始浮点向量仍然保留在索引中的事实,使我们能够通过重新评分来恢复部分性能的损失。更具体地说,我们可以通过在量化索引中进行近似 kNN 搜索来检索更大的候选池,这是相当快速的,然后根据原始浮点向量计算相似性函数并进行相应的重新评分

作为概念验证,我们考虑了 NQ 数据集,其在多语言 E5-small 上表现出较大的性能下降(2.01%)。通过设置 k=15、num_candidates=100 和 window_size=10(因为我们对 nDCG@10 感兴趣),我们获得了改进的分数为 0.539,恢复了约 20% 的性能。如果我们进一步将 num_candidates 参数增加到 200,则可以获得与全精度索引相匹配的分数,但响应时间更快。在 Arguana 上使用相同的设置,得分从 0.379 提高到 0.382,从而将相对性能下降从 1.3% 限制到仅为 0.52%。

结论

我们的评估结果表明,标量量化可以用来减少 Elasticsearch 中向量嵌入的内存占用,而不会对检索性能造成显著损失。性能下降在较小向量中更为明显(多语言 E5-small 生成的向量大小等于 384,而 E5-base 提供 768 维的嵌入),但这可以通过重新评分来缓解。我们相信,对于大多数用户来说,标量量化将是有益的,我们计划在 8.14 版本中使其成为默认设置。

准备在你的应用中构建 RAG 吗?想尝试使用向量数据库的不同 LLMs 吗? 查看我们在 Github 上为 LangChain、Cohere 等提供的示例笔记本,同时加入即将开始的 Elasticsearch 工程师培训

原文:Evaluating scalar quantization in Elasticsearch — Elastic Search Labs