faiss 如何构建 EDEN 量化索引并用 factory 字符串选择位数?

📅 发布时间:2026/9/10 9:39:20
faiss 如何构建 EDEN 量化索引并用 factory 字符串选择位数?
faiss 如何构建 EDEN 量化索引并用 factory 字符串选择位数【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss在 faiss 中EDEN 是一类按位预算编码的 L2 量化索引。目标是通过faiss.index_factory的字符串一次性指定索引类型和每维位数完成训练、写入和检索并核对生成的索引确实是预期位数。适用环境已安装 faiss Python 包并可用numpy以下代码中的维度、向量条数均取自仓库测试用例可直接执行。factory 字符串的三种写法factory 解析逻辑在 faiss/index_factory.cpp 中对 EDEN 的正则分支为EDEN([1-8])?(BIASED|BIAS)?EDEN不写位数时默认 1 bitEDEN4n是 Lloyd-Max 位预算取 1 到 8例如EDEN1到EDEN8EDEN4BIASEDBIASED后缀选择 MSE 最小化的 scaleEDENScaleType_BIASED不加后缀默认是原始 EDEN 的无偏 scaleEDENScaleType_UNBIASED。同一套写法在 flat 和 IVF 两个位置都有分支裸字符串EDEN4构建IndexEDEN放在IVF...后面如IVF16,EDEN4则构建IndexIVFEDEN。这一点在 faiss/IndexEDEN.h 的注释和 tests/test_eden.py 中都有对应断言。用 factory 构建 flat EDEN 索引以下代码是 tests/test_eden.py 中test_factory_flat_and_ivf的核心路径d64、位数 4import faiss import numpy as np rs np.random.RandomState(789) d, nt, nb, nq 64, 300, 500, 20 xt rs.randn(nt, d).astype(float32) # 训练向量 xb rs.randn(nb, d).astype(float32) # 入库向量 xq rs.randn(nq, d).astype(float32) # 查询向量 index faiss.index_factory(d, EDEN4) index.train(xt) index.add(xb) D, I index.search(xq, 10)构建后立即核对三个属性这是仓库测试中使用的判断方式能确认 factory 字符串确实按预期生效assert isinstance(index, faiss.IndexEDEN) assert index.sq.qtype faiss.ScalarQuantizer.QT_4bit_eden assert index.sq.bits 4 assert index.scale_type faiss.EDENScaleType_UNBIASED搜索结果的检查同样来自该测试D.shape (nq, 10)、所有距离有限np.isfinite、所有标签I 0。如果这里出现 NaN 或负标签说明索引未按预期构建或数据有异常。不经过 factory 的直接构造也可以调用IndexEDEN构造函数签名见 faiss/IndexEDEN.hindex faiss.IndexEDEN(64, faiss.METRIC_L2, bits, faiss.EDENScaleType_UNBIASED)其中bits对应 factory 里的n1..8第三个参数默认就是METRIC_L2第四个参数不写时默认为无偏 scale。等价关系是faiss.IndexEDEN(64, faiss.METRIC_L2, 4)与faiss.index_factory(64, EDEN4)得到的配置一致要得到BIASED版本则传faiss.EDENScaleType_BIASED对应 factory 字符串EDEN4BIASED。各位数对应的ScalarQuantizer量化类型映射1..8 bit 到QT_1bit_eden至QT_8bit_eden在 tests/test_eden.py 的EDEN_QTYPES中列出了完整对照可用于核对index.sq.qtype。IVF 形态IVF16,EDEN4在 IVF 分支里factory 字符串写成IVF{nlist},EDEN...例如index_ivf faiss.index_factory(d, IVF16,EDEN4) index_ivf.nprobe 4 index_ivf.train(xt) index_ivf.add(xb) D, I index_ivf.search(xq, 10)测试中的断言与 flat 版本相同isinstance(index_ivf, faiss.IndexIVFEDEN)、index_ivf.sq.bits 4、D.shape (nq, 10)且距离有限。注意 IVF 索引必须先设置nprobe再搜索nprobe4是该测试用例使用的取值。可选验证序列化往返仓库测试test_serde覆盖了四种 factory 字符串EDEN4、IVF16,EDEN4、EDEN4BIASED、IVF16,EDEN4BIASED的序列化往返可以照搬作为落地验证payload faiss.serialize_index(index) index2 faiss.deserialize_index(payload) Dref, Iref index.search(xq, 5) Dnew, Inew index2.search(xq, 5) np.testing.assert_array_equal(Iref, Inew) np.testing.assert_allclose(Dref, Dnew, rtol1e-5)两个索引的标签完全一致、距离在rtol1e-5内一致说明位数和 scale 类型都正确保存到了序列化数据里。可选分支用 bench 脚本对比位预算benchs/bench_eden.py 用于在相同位预算下对比 L2 量化索引。默认会同时评估EDEN、RaBitQ、TurboQuant三种索引如果只关注 EDEN用--indexes参数筛选python benchs/bench_eden.py --indexes EDEN常用参数均为该脚本实际支持的选项--d 64维度默认 64、--nt 4000/--nb 4000/--nq 100训练、库、查询向量条数、--k 1默认 1、--bits 1 2 4位预算1..8默认 1 2 4、--rotations none可选HR或RR在 EDEN 前加 HadamardRotation 或 RandomRotationMatrix 预变换即生成HR,EDEN4这类字符串、--include-speed输出搜索耗时。脚本输出按分布 / 旋转 / 位数分组的 Markdown 表格包含 recall 与重构 MSEMSE 在有预变换时按文档说明在变换后的量化坐标系中计算。限制与边界factory 字符串中的位数只能写 1..8正则为EDEN([1-8])超出范围不会被识别为 EDEN 索引默认 scale 是无偏 scaleEDENScaleType_UNBIASED只有显式加BIASED或BIAS后缀才切换到 MSE 最小化 scale测试与文档示例均围绕METRIC_L2展开IndexEDEN构造函数默认 metric 也是METRIC_L2其他 metric 的验证方式仓库文档未给出。深入实现可继续查看 faiss/IndexEDEN.cpp训练即求训练点中心encode/decode 委托EDENQuantizer和 faiss/IndexIVFEDEN.h。【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考