Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >复合索引:向量搜索的高级策略

复合索引:向量搜索的高级策略

作者头像
用户3578099
发布于 2024-07-15 07:33:46
发布于 2024-07-15 07:33:46
57500
代码可运行
举报
文章被收录于专栏:AI科技时讯AI科技时讯
运行总次数:0
代码可运行

在向量搜索领域,我们拥有多种索引方法和向量处理技术,它们使我们能够在召回率、响应时间和内存使用之间做出权衡。虽然单独使用特定技术如倒排文件(IVF)、乘积量化(PQ)或分层导航小世界(HNSW)通常能够带来满意的结果,但为了实现最佳性能,我们往往采用复合索引。

复合索引可以被视为一系列向量转换的逐步过程,它结合了一种或多种索引方法来构建出“理想”的索引。例如,我们可以先使用IVF索引来缩小搜索范围,加速搜索过程,然后引入如PQ的压缩技术,以在维持较大索引的同时,控制其大小在合理的范围内。

虽然自定义索引提供了极大的灵活性,但也存在风险,可能会导致召回率不必要地降低、延迟增高或内存使用增加。因此,为了构建一个健壮且高效的向量相似性搜索应用,理解复合索引的工作原理至关重要。了解何时何地应用不同的索引或向量转换技术,以及何时避免使用它们,对于优化搜索性能至关重要。

在本文中,我们将深入探讨如何利用Facebook AI的相似性搜索工具(Faiss)来构建高性能的复合索引。Faiss是一个广受推崇的强大库,用于创建快速且精确的向量相似性搜索索引。我们还将介绍Faiss的index_factory,这是一个能够以更清晰、更优雅的方式构建复合索引的工具。

什么是复合索引

复合索引的概念可以通过一个有趣的类比来理解:就像乐高积木,每一块都能堆叠在另一块之上,创造出从精美的艺术品到混乱的结构的各种可能性。在Faiss中,复合索引的构建也是类似的,它的各个组件可以自由组合,但并非所有组合都能达到最优效果。

在Faiss中构建复合索引,可以通过以下元素的任意组合来实现:

  • 向量变换:这是在索引之前对向量进行的预处理步骤,例如主成分分析(PCA)或优化的量化(OPQ),旨在改善向量的质量或分布。
  • 粗量化器:这一步通过将向量分配到不同的子空间,从而初步组织它们。常见的粗量化方法包括倒排文件(IVF)、倒排多索引(IMI)和分层导航小世界(HNSW),它们有助于通过缩小搜索范围来提高搜索效率。
  • 细量化器:在粗量化的基础上,细量化器如乘积量化(PQ)进一步压缩向量到更小的域,以减少索引的内存占用,同时尽量保持搜索的准确性。
  • 精炼:在搜索过程中,精炼步骤使用原始非压缩向量的距离计算来重新排序搜索结果,以提高搜索的精度。这一步骤也可以通过另一种索引方法来实现。

粗量化的关键优势在于它通过向量“聚类”来实现非详尽搜索,例如IVF中的倒排索引,这可以显著提高搜索效率。而细量化则关注于通过编码技术减少向量的存储需求,同时最小化对搜索准确性的影响。

通过精心选择和组合这些组件,我们可以构建出既高效又精确的复合索引,以满足特定的搜索需求。

索引组件

可以使用以下组件构建复合索引:

向量变换

粗量化器

细量化器

精炼

PCA, OPQ, RR, L2norm, ITQ, Pad

IVF,Flat, IMI, IVF,HNSW, IVF,PQ, IVF,RCQ, HNSW,Flat, HNSW,SQ, HNSW,PQ

Flat, PQ, SQ, Residual, RQ, LSQ, ZnLattice, LSH

RFlat, Refine*

例如,可以构建一个索引,步骤如下:

  • 使用OPQ对输入向量进行变换;
  • 利用倒排文件(IVF)进行向量的粗量化,以实现高效的搜索;
  • 在每个IVF单元内应用乘积量化(PQ)来压缩向量,减少内存使用;
  • 搜索后,使用原始扁平向量(RFlat)重新排序结果,以确保准确性;

在构建复合索引时,由于涉及多种Faiss类,过程可能会显得复杂。为了简化这一过程,Faiss index_factory提供了一种更清晰、更简洁的方法来组合不同的索引组件。

通过合并IVF和PQ索引,可以将PQ量化后的向量存储在IVF结构中,实现更高效的搜索

Faiss Index Factory:简化索引构建流程

Faiss 的 index_factory 函数提供了一种极为简洁的方法来构建复合索引,仅需通过一个字符串参数即可实现。以下是使用 index_factory 替代传统索引构建方法的示例:

传统构建方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import faiss

quantizer = faiss.IndexFlatL2(128)  # 创建一个128维的L2距离的Flat量化器
index = faiss.IndexIVFFlat(quantizer, 128, 256)  # 创建一个使用IVF和Flat的索引

使用 index_factory 的简化方式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index_f = faiss.index_factory(128, "IVF256,Flat")  # 通过字符串参数创建复合索引

注意:在 index_factory 示例中,L2 距离没有被明确指定,因为 index_factory 默认采用 L2 距离。如果需要使用内积距离(IndexFlatIP),可以在 index_factory 参数中加入 faiss.METRIC_INNER_PRODUCT

性能比较:要验证两种方法构建的索引是否具有相同的性能,首先需要确保它们返回相同的最近邻结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
k = 100
D, I = index.search(xq, k)  # 使用传统方法的索引搜索
D_f, I_f = index_f.search(xq, k)  # 使用 `index_factory` 方法的索引搜索
assert I_f.tolist() == I.tolist()  # 确保两种方法输出相同的结果
# True

如果两种方法的搜索结果相同,可以进一步比较它们的搜索速度和内存使用情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_memory(index):
    # 将索引写入文件,然后获取文件大小,最后删除文件
    faiss.write_index(index, './temp.index')
    file_size = os.path.getsize('./temp.index')
    os.remove('./temp.index')
    return file_size

%%timeit
index.search(xq, k)
# 153 µs ± 7.47 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

%%timeit
index_f.search(xq, k)
# 148 µs ± 5.79 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

get_memory(index)
# 520133259
get_memory(index_f)
# 520133259

可以看到,两种方法的搜索速度非常接近,index_factory 版本的搜索速度略快约 5 微秒,这个差异几乎可以忽略不计。在内存使用方面,两种方法也表现出了相同的效率。

召回率计算:召回率是衡量搜索性能的一个重要指标,它表示在顶部 k 个结果中返回的匹配项所占的比例。在文献中,通常使用 recall@k 来表示在顶部 k 个返回记录中,查询的最近邻被返回的百分比。例如,如果以 100k 值,并且在 50% 的查询中返回了正确的最近邻,那么可以说 recall@100 的性能是 0.5。

为什么使用Index Factory

尽管测试结果表明两种索引构建方法在性能上是一致的,但掌握如何使用 index_factory 仍然具有其独特的价值和优势。以下是选择使用 index_factory 的几个关键理由:

  1. 个人偏好:如果您更倾向于传统的基于类的索引构建方法,完全可以继续使用它。
  2. 代码简洁性index_factory 显著提高了代码的简洁性和可读性。原本需要多行代码实现的功能,现在可以用一行简洁的代码来完成。

以下是一个使用 index_factory 构建复合索引的例子:

使用传统方法构建复合索引

  • 使用 OPQ 对向量进行预处理
  • 利用 IVF 对向量进行聚类
  • 应用 PQ 量化以减少索引大小
  • 使用扁平索引对最终结果进行重新排序
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
d = xb.shape[1]  # 向量的维度
m = 32  # OPQ的子空间数量
nbits = 8  # PQ量化的位数
nlist = 256  # IVF的列表数量

# 初始化OPQ和粗量化+细量化步骤
opq = faiss.OPQMatrix(d, m)
vecs = faiss.IndexFlatL2(d)  # 扁平量化器
sub_index = faiss.IndexIVFPQ(vecs, d, nlist, m, nbits)  # IVF + PQ

# 将预处理、粗量化、细量化步骤合并
index = faiss.IndexPreTransform(opq, sub_index)

# 添加最终的精炼步骤
index = faiss.IndexRefineFlat(index)

# 训练索引并添加向量
index.train(xb)
index.add(xb)

使用 index_factory 简化后的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
d = xb.shape[1]  # 默认参数:m=32, nlist=256, nbits=8

# 使用index_factory构建相同功能的索引
index = faiss.index_factory(d, "OPQ32,IVF256,PQ32,RFlat")

# 训练索引并添加向量
index.train(xb)
index.add(xb)

性能对比

方法

召回率

搜索时间

内存使用

传统方法

31%

181µs

552MB

index_factory

31%

174µs

552MB

使用 index_factory 构建的索引在搜索时间上通常会略快一些,尽管这种差异非常微小。两种方法在召回率和内存使用方面表现一致。

流行的复合索引

IVFADC

在掌握了使用 index_factory 快速构建复合索引的方法后,让我们探索一些流行且性能卓越的索引组合。其中,IVFADC 是一个值得关注的索引类型。

IVFADC 索引简介: IVFADC,即倒排文件量化异构距离计算,是一个自2010年引入以来广泛使用的索引。它结合了倒排文件(IVF)和乘积量化(PQ)技术,以其合理的召回率、快速的搜索速度和高效的内存使用而受到青睐。尽管召回性能不是最优,但IVFADC 在最小化内存使用的同时,仍能保持快速的搜索速度。

IVFADC 索引构建步骤

  1. 向量被分配到 IVF 结构中的不同列表(或 Voronoi 单元)。
  2. 使用 PQ 压缩这些向量。

IVFADC 的索引过程

在索引构建完成后,对查询向量 xq 和已索引、量化的向量之间进行不对称距离计算(ADC)。这种搜索被称为不对称,因为它比较未压缩的 xq 与之前压缩的 PQ 向量。

通过对称距离计算(SDC,左),在将 xq 与之前量化的 xb 向量进行比较之前对其进行量化。 ADC(右)跳过xq 的量化,并将其直接与量化的 xb 向量进行比较。

通过 index_factory 实现 IVFADC 索引的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index = faiss.index_factory(d, "IVF256,PQ32x8")
index.train(xb)
index.add(xb)
D, I = index.search(xq, k)
recall(I)  # 30

在这个示例中,创建了一个具有 256 个 IVF 单元的 IVFADC 索引,每个向量都使用 PQ 压缩,其中 mnbits 的值分别为 32 和 8。PQ 默认使用 nbits == 8,因此可以简写为 "IVF256,PQ32"。这里:

  • m:原始向量分割成的子向量数量。
  • nbits:每个子量化器使用的位数,它决定了每个子量化器的中心点数量为 。

通过调整 nbits,可以减少索引的内存使用或提高召回率和搜索速度。然而,当前版本的 Faiss 限制了 IVF,PQnbits 必须大于或等于 8。此外,通过增加 index.nprobe 值,可以搜索更多的 IVF 单元(默认值为 1)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index.nprobe = 8
D, I = index.search(xq, k)
recall(I)  # 74

不同 nbitsnprobe 值对索引性能的影响如下:

索引

nprobe

召回率

搜索时间

内存使用

IVF256,PQ32x4

1

27%

329µs

25MB

IVF256,PQ32x4

6

45%

975µs

25MB

IVF256,PQ32x8

1

30%

136µs

40MB

IVF256,PQ32x8

8

74%

729µs

40MB

优化的 PQ 量化:提升 IVFADC 索引性能

优化的乘积量化(OPQ)技术能显著提升采用乘积量化(PQ)的索引,如 IVFADC。OPQ 通过旋转向量来优化 PQ 中子空间的值分布,特别适合处理数据分布不均匀的情况。

在 Faiss 中,OPQ 作为一个预处理步骤,可以轻松地整合到 IVFADC 中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用 OPQ 改进 PQ 步骤的分布
index = faiss.index_factory(d, "OPQ32,IVF256,PQ32x8")
index.train(xb)
index.add(xb)
D, I = index.search(xq, k)
recall(I)  # 31

%%timeit
index.search(xq, k)

# 142 µs ± 2.25 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

这里的 OPQ32PQ32 中的数字 32 指的是 PQ 编码的位数 m。在 Faiss 中,OPQ 仅包含旋转部分,必须结合后续的 PQ 步骤才能实现完整的 OPQ 功能。索引在初始化时进行训练。

对于像 Sift1M 这样数据分布已经相对均衡的数据集,使用 OPQ 也能观察到轻微的召回性能提升。例如,当 nprobe == 1 时,召回率可以从 30% 提高到 31%。

为了进一步提高召回率,可以增加 nprobe 的值,但这可能会牺牲一些搜索速度。由于添加了预处理步骤,不能直接通过 index.nprobe 访问 nprobe,因为索引不再直接对应于 IVF 部分。要修改 nprobe 值,需要先提取 IVF 索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ivf = faiss.extract_index_ivf(index)
ivf.nprobe = 13
D, I = index.search(xq, k)
recall(I)  # 74

%%timeit
index.search(xq, k)

# 1.08 ms ± 21.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

nprobe 值设置为 13 时,召回率可以达到 74%,但搜索时间从 729μs 增加到 1060μs

不同 nprobe 值下的索引性能对比:

索引

nprobe

召回率

搜索时间

内存使用

OPQ32,IVF256,PQ32x4

1

30%

136µs

40.2MB

OPQ32,IVF256,PQ32x4

1

31%

143µs

40.3MB

OPQ32,IVF256,PQ32x8

8

74%

729µs

40.2MB

OPQ32,IVF256,PQ32x8

13

74%

1060µs

40.3MB

各种 nprobe 值的搜索时间(上)和召回率(下)

此外,OPQ 还可以用来降低预处理步骤中向量的维度。维度 D 必须是 M 的倍数,理想情况下 D==4M。例如,要将维度减少到 64,可以使用以下索引字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index = faiss.index_factory(64, "OPQ16_64,IVF256,PQ16")

多维ADC:提升搜索效率的索引技术

多维ADC(Asymmetric Distance Computation)是一种先进的索引技术,它融合了多维索引结构和搜索过程中的不对称距离计算(特别是乘积量化PQ)。这种索引技术基于倒排多索引(IMI),是倒排文件(IVF)技术的扩展。与IVF相比,IMI在召回率和搜索速度上都有显著提升,但这需要以增加内存使用为代价。

IMI索引非常适合于那些需要高召回率和快速搜索,同时可以容忍较高内存消耗的应用场景。IMI的工作方式与IVF相似,但它在向量的不同维度上分割了Voronoi单元,形成了一种多级Voronoi单元结构,这有助于更精细地组织数据。

Voronoi细胞在多个向量子空间上被分割,给定一个查询向量xq,将比较每个xq子向量到其相应的子空间细胞

PQ压缩技术应用于IMI时,就形成了多维ADC索引。在这种索引中,ADC指的是在查询向量与量化后的向量比较时进行的对称距离计算。使用Faiss的index_factory可以方便地创建此类索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index = faiss.index_factory(d, "IMI2x8,PQ32")
index.train(xb)  
index.add(xb)

# 提取 IMI 索引并设置 nprobe
imi = faiss.extract_index_ivf(index)
imi.nprobe = 620
D, I = index.search(xq, k)
recall(I)  # 72

%%timeit
index.search(xq, k)

# 1.35 ms ± 60.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

尽管多维ADC索引能提供72%的召回率,但搜索时间增加到了1.35毫秒,相对较慢。然而,通过将优化的乘积量化(OPQ)整合到索引中,可以显著提高性能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index = faiss.index_factory(d, "OPQ32,IMI2x8,PQ32") 
index.train(xb) 
index.add(xb)

# 增加nprobe
imi = faiss.extract_index_ivf(index)
imi.nprobe = 100
D, I = index.search(xq, k)
recall(I)  # 74

%%timeit
index.search(xq, k)
# 461 µs ± 30 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

通过这种方式,OPQ multi-D-ADC 索引在保持 74% 召回率的同时,将平均搜索时间降低到了 461 微秒。

索引

召回率

搜索时间

内存使用

IVF256,PQ32

74%

729µs

40.2MB

IMI2x8,PQ32

72%

1350µs

40.8MB

OPQ32,IMI2x8,PQ32

74%

461µs

40.7MB

通过调整nprobe的值,可以在召回率和搜索速度之间取得平衡。

各种nprobe值的搜索时间(顶部)和召回率(底部)

HNSW索引:结合速度与召回率的强有力复合索引

层次可导航的小世界(HNSW)图与倒排文件(IVF)的结合,构成了一种功能强大的复合索引。这种组合不仅在速度上与先前的索引方法相媲美,还在提高召回率方面表现突出,尽管这需要更多的内存使用。

HNSW基于小世界网络理论,该理论指出,无论网络规模大小,所有顶点都可以在少数几步内相互到达。这一特性使得HNSW在构建索引时能够实现快速搜索,同时保持高精度。

HNSW图将典型包含长程和短程链接的图分解成多个层(层次结构)。在搜索过程中,从最高层开始,这一层由长程链接组成。当穿过每一层时,链接变得更加细致。

HNSW图将包含长程和短程链接的图分解成多个层,每一层由不同类型的链接组成。搜索从高层的长程链接开始,随着向下移动,逐渐增加短程链接,使得搜索过程既快速又精确。

将HNSW与IVF结合,可以通过IVF快速识别出近似最近的单元格中心点,然后将详尽搜索限制在这些单元格内。这种策略最小化了搜索时间,同时保持了高召回率。

HNSW可以快速使用IVF单元格中心点找到近似最近邻

为了实现这一目标,需要调整IVF的参数,使用更多的中心点和更小的单元格。例如,对于一个1M的索引,建议将nlist设置为65536,并提供至少1.97M的向量给index.train。实践中,较小的nlist值如4096可能更适合,并且能够提供更高的召回率。

使用 index_factory 可以构建标准的 IVF+HNSW 索引:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
index = faiss.index_factory(d, "IVF4096_HNSW32,Flat")
index.train(xb)
index.add(xb)

D, I = index.search(xq, k)
recall(I)  # 25

%%timeit
index.search(xq, k)

# 58.9 µs ± 3.25 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

index.nprobe = 146
D, I = index.search(xq, k)
recall(I)  # 100

%%timeit
index.search(xq, k)

# 916 µs ± 9.23 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

通过调整nprobe的值,可以在搜索时间和召回率之间进行权衡。例如,将nprobe设置为146可以将召回率提高到100%,但搜索时间会相应增加。

各种nprobe值的搜索时间(顶部)和召回率(底部)

尽管IVF+HNSW索引在内存使用上较高,但它提供了惊人的召回率和快速的搜索速度。如果需要减少内存使用,可以考虑使用PQOPQ来压缩向量,但这可能会降低召回率并增加搜索时间。

索引

召回率

搜索时间

内存使用

IVF4096_HNSW,Flat

90%

550µs

523MB

IVF4096_HNSW,PQ32 (PQ)

69%

550µs

43MB

OPQ32,IVF4096_HNSW,PQ32 (OPQ)

74%

364µs

43MB

在选择索引时,需要根据具体的应用场景和性能需求来权衡召回率、搜索时间和内存使用。如果可以接受较低的召回率以减少搜索时间和内存使用,带有OPQIVF+HNSW索引可能是一个理想的选择。

名称

索引

召回率

搜索时间

内存

IVFADC

IVF256,PQ32

74%

729µs

40MB

Multi-D-ADC

OPQ32,IMI2x8,PQ32

74%

461µs

41MB

总结

在本文中,我们深入探讨了复合索引的概念,并展示了如何使用 Faiss 强大的 index_factory 工具来构建高效、定制化的索引结构。重点介绍了三种业界广泛认可的复合索引类型:

  1. IVFADC:这种索引类型结合了倒排文件(IVF)和乘积量化(PQ),在内存使用合理的前提下,提供了均衡的召回率和搜索速度。
  2. Multi-D-ADC:基于倒排多索引(IMI),它在召回率和搜索速度上超越了传统的 IVF,尽管这需要更多的内存。
  3. IVF-HNSW:通过将 IVF 与层次可导航的小世界(HNSW)图结合,这种索引实现了高召回率和快速搜索,但代价是更高的内存使用。

通过对 Sift1M 数据集进行索引和搜索的实践,学习了如何调整各个索引参数,以适应不同的业务需求。这包括在召回率、搜索速度和内存使用之间找到合适的平衡点。

希望本文的介绍能够帮助读者深入理解复合索引的内部机制,并掌握如何设计和测试适合自己特定业务场景的索引结构。

参考

  • Composite Indexes in Faiss
  • Product Quantization Explained (Video)
  • Advanced Faiss Indexing (Video)
  • Approximate Nearest Neighbor Search by Residual Vector Quantization
  • A Survey of Product Quantization
  • Optimized Product Quantization
  • Product quantization for nearest neighbor search
  • Searching in One Billion Vectors: Re-rank with Source Coding
  • Revisiting the Inverted Indices for Billion-Scale Approximate Nearest Neighbors
  • Guidelines to choose an index
  • The Index Factory
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技时讯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
乘积量化PQ:将高维向量压缩 97%
向量相似性搜索在处理大规模数据集时,往往面临着内存消耗的挑战。例如,即使是一个包含100万个密集向量的小数据集,其索引也可能需要数GB的内存。随着数据集规模的增长,尤其是高维数据,内存使用量会迅速增加,这可能导致内存管理问题。
用户3578099
2024/07/15
5490
乘积量化PQ:将高维向量压缩 97%
Faiss: 选择合适的索引Index
向量相似性搜索彻底改变了搜索领域。它允许我们高效地检索从GIF到文章等各种媒体,即使在处理十亿级别数据集时,也能在亚秒级时间内提供令人印象深刻的准确性。
用户3578099
2024/06/19
1.3K0
Faiss: 选择合适的索引Index
使用Faiss进行海量特征的相似度匹配
来源丨https://zhuanlan.zhihu.com/p/210736523
公众号机器学习与AI生成创作
2021/01/08
4K0
使用Faiss进行海量特征的相似度匹配
10分钟入门faiss相似向量检索
faiss全称 Facebook AI Similarity Search,是FaceBook的AI团队针对大规模向量 进行 TopK 相似向量 检索 的一个工具,使用C++编写,有python接口,对10亿量级的索引可以做到毫秒级检索的性能。
lyhue1991
2023/09/05
4K0
10分钟入门faiss相似向量检索
Faiss:加速大规模数据相似性搜索的利器
在机器学习和数据挖掘领域,相似性搜索是一项基本且重要的任务,它涉及到在大型数据集中找到与特定对象最相似的对象。Faiss是一个由Facebook AI Research开发的库,专门用于高效地进行相似性搜索和聚类,它之所以重要,是因为它提供了一种快速且准确的方式来执行这一任务,尤其是在处理大规模高维向量数据集时。
用户3578099
2024/06/11
1.3K0
Faiss:加速大规模数据相似性搜索的利器
Faiss向量数据库
Faiss 处理固定维数 d 的向量集合,通常为几十到几百个。这些集合可以存储在矩阵中。我们假设采用行主存储,即向量编号 i 的第 j 个分量存储在矩阵的第 i 行、第 j 列中。Faiss 仅使用 32 位浮点矩阵。
@小森
2024/09/05
5110
Faiss向量数据库
LSH算法:高效相似性搜索的原理与Python实现II
局部敏感哈希(LSH)是一种高效的近似相似性搜索技术,广泛应用于需要处理大规模数据集的场景。在当今数据驱动的世界中,高效的相似性搜索算法对于维持业务运营至关重要,它们是许多顶尖公司技术堆栈的核心。
用户3578099
2024/07/15
5230
LSH算法:高效相似性搜索的原理与Python实现II
深入解析HNSW:Faiss中的层次化可导航小世界图
层次化可导航小世界(HNSW)图是向量相似性搜索中表现最佳的索引之一。HNSW 技术以其超级快速的搜索速度和出色的召回率,在近似最近邻(ANN)搜索中表现卓越。尽管 HNSW 是近似最近邻搜索中强大且受欢迎的算法,但理解其工作原理并不容易。
用户3578099
2024/07/15
2.5K0
深入解析HNSW:Faiss中的层次化可导航小世界图
向量数据库入坑指南:聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss
我们日常使用的各种 APP 中的许多功能,都离不开相似度检索技术。比如一个接一个的新闻和视频推荐、各种常见的对话机器人、保护我们日常账号安全的风控系统、能够用哼唱来找到歌曲的听歌识曲,甚至就连外卖配送的最佳路线选择也都有着它的身影。
soulteary
2022/09/03
2.3K0
浅谈如何优化 Milvus 性能
Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark[1] 中,Milvus 相比之前的版本,取得了 50% 以上的性能提升。值得一提的是,在 Master branch 的最新分支中,Milvus 的性能又更进一步,在 1M 向量串行执行的场景下取得了 3ms 以下的延迟,整体 QPS 甚至超过了 ElasticSearch 的 10 倍。那么,如何使用 Milvus 才能达到理想的性能呢?本文暂且不提社区大神贡献的黑科技优化,先聊聊使用 Milvus 过程中的一些经验,以及如何进行性能调优。
Zilliz RDS
2023/01/10
4.4K0
浅谈如何优化 Milvus 性能
全方位解读 | Facebook的搜索是怎么做的?
今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。
NewBeeNLP
2020/10/21
1.7K0
解读向量索引
向量嵌入是从图像、文本和音频等数据源转换而来的数字表示,旨在通过为每个项目创建一个数学向量来捕捉其语义或特征。这种表示方式使得计算系统更容易理解这些数据,并且与机器学习模型兼容,从而能够识别不同项之间的关系和相似性。
半吊子全栈工匠
2024/11/07
6730
解读向量索引
美团外卖基于GPU的向量检索系统实践
随着大数据和人工智能时代的到来,向量检索的应用场景越来越广泛。在信息检索领域,向量检索可以用于检索系统、推荐系统、问答系统等,通过计算文档和查询向量之间的相似度,快速地找到与用户需求相关的信息。此外,在大语言模型和生成式AI场景,向量索引做为向量数据的底层存储,也得到了广泛的应用。
美团技术团队
2024/04/15
4830
美团外卖基于GPU的向量检索系统实践
向量数据库是如何检索的?基于 Feder 的 IVF_FLAT 可视化实现
Embedding 是分析非结构化数据的重要方式,当我们将图片、声音编码为向量后,这些数据依旧能够保留原始数据(图片、声音等)的详细信息。然而,我们很难直接对这些编码后的向量中的数字与原始数据建立联系,想要弄清楚向量构成的空间到底意味着什么就更是难上加难了。
Zilliz RDS
2022/11/07
1.7K0
向量数据库是如何检索的?基于 Feder 的 IVF_FLAT 可视化实现
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
Milvus 是全球最快的向量数据库,在最新发布的 Milvus 2.2 benchmark中,Milvus 相比之前的版本,取得了 50% 以上的性能提升。值得一提的是,在 Master branch 的最新分支中,Milvus 的性能又更进一步,在 1M 向量串行执行的场景下取得了 3ms 以下的延迟,整体 QPS 甚至超过了 ElasticSearch 的 10 倍。那么,如何使用 Milvus 才能达到理想的性能呢?本文暂且不提社区大神贡献的黑科技优化,先聊聊使用 Milvus 过程中的一些经验,以及如何进行性能调优。
汀丶人工智能
2023/11/15
2.5K0
Milvus性能优化提速之道:揭秘优化技巧,避开十大误区,确保数据一致性无忧,轻松实现高性能
深入理解 Faiss:原理与使用总结
在当今数字化时代,数据量呈现爆炸式增长,如何在海量数据中快速准确地找到相似信息变得至关重要。Faiss 作为一个高效的相似度搜索库,为解决这一问题提供了强大的支持。本文将深入探讨 Faiss 的原理和使用方法,并结合实际案例进行分析,希望能帮助读者更好地理解和应用这一工具。
程序员阿伟
2024/12/09
5270
检索算法小结
上一篇文章介绍了大模型应用利器--RAG。在RAG中当然少不了检索。检索算法在信息检索、搜索引擎和推荐系统等领域中扮演着至关重要的角色。它们的核心任务是根据用户查询从大量数据中找出最相关的信息。本文就对检索算法进行以下小结。
languageX
2024/07/01
3690
用 Milvus 和 NVIDIA Merlin 搭建高效推荐系统
简单来说,现代推荐系统由训练/推理流水线(pipeline)组成,涉及数据获取、数据预处理、模型训练和调整检索、过滤、排名和评分相关的超参数等多个阶段。走遍这些流程之后,推荐系统能够给出高度个性化的推荐结果,从而提升产品的用户体验。
Zilliz RDS
2023/11/01
4990
用 Milvus 和 NVIDIA Merlin 搭建高效推荐系统
Paper Reading | DiskANN: 十亿规模数据集上高召回高 QPS 的 ANNS 单机方案
“DiskANN: Fast Accurate Billion-point Nearest Neighbor Search on a Single Node” [1]是 2019 年发表在 NeurIPS 上的论文。
Zilliz RDS
2021/08/20
2.5K0
广告行业中那些趣事系列38:广告搜索业务中海量高维数据集检索利器Faiss
摘要:本篇主要介绍实际广告搜索业务中经常使用的大规模检索利器faiss。首先是背景介绍,主要讲了相似度匹配任务和大规模检索算法以及如何应用到我们的实际业务场景;然后重点介绍了faiss,包括什么是faiss、大规模检索任务流程、faiss索引类型介绍、各种索引优缺点对比以及线上构建索引经验分享;最后项目实践了faiss。希望对在海量高维向量空间进行大规模检索任务感兴趣的小伙伴有所帮助。
数据拾光者
2022/05/05
6830
广告行业中那些趣事系列38:广告搜索业务中海量高维数据集检索利器Faiss
推荐阅读
相关推荐
乘积量化PQ:将高维向量压缩 97%
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验