标签: 向量搜索

  • 在保证精度的同时大幅降低成本,Elasticsearch 向量搜索选项及效果

    在保证精度的同时大幅降低成本,Elasticsearch 向量搜索选项及效果

    前言

    近年来,在检索增强生成(RAG,Retrieval-Augmented Generation)兴起等背景下,向量搜索的重要性日益凸显。向量搜索是将文本、图像等高维数据嵌入向量空间,基于相似度进行检索的技术。通过该技术,能够实现传统关键词搜索无法捕捉的、基于语义相似性的检索。

    另一方面,可处理向量搜索的产品与服务不断增多,想必有不少人在选择时会感到迷茫。不同服务支持的向量搜索选项也存在差异。尤其在近期,为提升向量搜索性能与资源效率的各类选项纷纷涌现,其中 “向量量化” 与 “二进制向量” 作为有助于降低资源用量、提升检索速度的技术备受关注。

    本文将聚焦向量搜索引擎的有力选择之一 ——Elasticsearch,结合具体配置方法,解析向量量化、二进制向量等选项及其效果。

    Elasticsearch 中的向量搜索

    Elasticsearch 作为全文搜索引擎广为人知,而自 7.x 版本起,它开始支持稠密向量(Dense Vector)类型,向量搜索功能得到强化。稠密向量是用于存储高维向量数据的数据类型。

    Elasticsearch 稠密向量文档:Elasticsearch Dense Vector 文档

    向量搜索的算法

    在 Elasticsearch 中处理稠密向量时,会使用近似最近邻(ANN)搜索算法。目前可使用名为 HNSW 的算法。HNSW(Hierarchical Navigable Small World,分层可导航小世界)是一种高速的近似最近邻搜索算法,采用基于图的数据结构,能高效检索相似向量。

    用于资源削减的选项:向量量化与二进制向量

    向量搜索的性能与资源效率存在权衡关系。Elasticsearch 提供向量量化与二进制向量作为调节这种权衡的选项。

    选项说明优势劣势推荐使用场景
    向量量化将向量各维度用更少的比特数表示的方法。在 Elasticsearch 中,可替代 32 比特的 float 型,实现 8 比特、4 比特、1 比特的量化。大幅降低存储大小与内存用量,还有可能提升查询性能。可能导致精度下降。需降低存储成本与内存用量,追求一定精度与性能平衡的场景。
    二进制向量将向量各维度用 0 或 1 表示的方法。可使用汉明距离等进行高速的相似度计算。大幅减少计算时间及磁盘、内存用量,支持针对二进制向量的高速距离计算(如汉明距离)。与使用 float 型相比精度下降,且需要用于生成二进制向量的专用嵌入(Embedding)模型。可牺牲部分精度以大幅控制存储与内存用量,或需高速检索的场景。

    二进制向量详情

    二进制向量(比特向量)是一种蕴藏着大幅提升向量搜索效率潜力的技术。

    www.elastic.co

    机制

    二进制向量是基于阈值将原始向量(通常为浮点数向量)的各维度转换为 0 或 1 得到的。

    距离计算

    二进制向量间的相似度计算采用汉明距离(比特位不同的位置数量),其速度远快于浮点数向量间的余弦相似度或欧几里得距离计算。

    生成方法

    • 专用嵌入模型:使用可直接输出二进制向量的嵌入模型。
    • 现有嵌入模型 + 二值化:对通过现有嵌入模型得到的浮点数向量,采用阈值处理等方式进行二值化。

    量化 / 二值化的优势与注意事项

    向量量化与二值化是提升稠密向量存储效率与查询性能的有力手段,但在引入时需理解以下优势与注意事项。

    优势:

    1. 降低存储成本:可大幅减小索引大小,降低磁盘存储成本。
    2. 减少内存用量:向量数据更易存入内存,从而减少内存用量,提升 Elasticsearch 集群的稳定性。
    3. 提升查询性能:对量化 / 二值化后的向量进行运算速度更快,有望提升查询性能。

    注意事项:

    1. 精度的权衡:量化 / 二值化通常与精度存在权衡关系,数据压缩程度越高,检索精度下降的可能性越大。
    2. 选择合适的方法:需结合业务需求允许的精度损失与存储效率的平衡,选择合适的量化级别或二进制向量化方法。

    基于 JMTEB 数据的测试

    存在名为 JMTEB(Japanese Massive Text Embedding Benchmark,日语大规模文本嵌入基准)的嵌入精度评估基准。

    github.com

    JMTEB 通过 5 个使用各类日语开放数据的任务对嵌入模型进行评估。本次将利用部分数据集,观察修改量化选项后对磁盘用量及精度的影响程度。

    使用 Cohere 提供的嵌入 API,除了常规的 Float 型嵌入外,还可使用二进制嵌入。在验证中,我们使用 Cohere 的嵌入模型生成以下 3 种向量并注册到 Elasticsearch 中进行比较。

    1. 采用 Elasticsearch 默认设置(8 比特量化)的 float 向量
    2. 在 Elasticsearch 中进行比特量化(bbq)的 float 向量
    3. 利用 Elasticsearch 的 bit 选项注册的二进制向量

    参考:www.elastic.co

    索引大小 / 正确率

    以下展示了启用各选项并导入 Elasticsearch 后,索引的大小以及对数据集中预先定义的正确答案的匹配率。本次使用的数据集中,404 个检索查询均各自定义了 1 个正确文档。正确率指标采用精确率(precision)和归一化折损累积增益(nDCG)两项。

    • precision@1:应匹配的正确文档排在第 1 位的比例
    • nDCG@10:衡量前 10 位结果中应匹配的正确文档排名情况的指标,正确文档排名越靠前,得分越高。
    类型索引大小正确率 (precision@1)nDCG@10
    float 向量9.1MB84.41%0.9108
    量化 (bbq)8.7MB83.66%0.9024
    二进制向量2.6MB81.19%0.8889

    可以看出,直接使用 float 型向量的精度确实更高,但其他方法在减小索引大小的同时,精度仅下降了 1%~3% 左右,并未出现显著下滑。近年来也有通过与重排序(rerank)结合来保证精度的策略,因此本文介绍的选项具有实用价值。当然,精度下降幅度会因数据集不同而存在差异,建议在使用前进行验证,但仍推荐积极尝试这些选项。

    本文到此结束。感谢您读到最后。