向量搜索功能和限制 - Amazon 内存 DB

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

向量搜索功能和限制

向量搜索可用性

R6g、r7g 和 t4g 节点类型支持支持向量搜索的 MemoryDB 配置,并且适用于所有可用 MemoryDB 的区域。 AWS

无法修改现有集群以启用搜索。但是,可以根据禁用搜索的集群的快照创建启用搜索的集群。

参数限制

下表列出了预览中各种向量搜索项目的限制:

项目 最大值
向量中的维数 32768
可以创建的索引数量 10
索引中的字段数量 50
FT.SEARCH 和 FT.AGGREGATE 超时子句(毫秒) 10000
FT.AGGREGATE 命令中的管道阶段数量 32
FT.AGGREGATE LOAD 子句中的字段数量 1024
FT.AGGREGATE GROUPBY 子句中的字段数量 16
FT.AGGREGATE SORTBY 子句中的字段数量 16
FT.AGGREGATE PARAM 子句中的参数数量 32
HNSW M 参数 512
HNSW EF_CONSTRUCTION 参数 4096
HNSW EF_RUNTIME 参数 4096

扩展限制

MemoryDB 的向量搜索目前仅限于单个分片,不支持水平扩展。向量搜索支持垂直扩展和副本扩展。

操作限制

索引持久性和回填

矢量搜索功能保留了索引的定义和索引的内容。这意味着,在任何导致节点启动或重新启动的操作请求或事件中,将从最新的快照中恢复索引定义和内容,并从日志中重播任何待处理的交易。无需用户执行任何操作即可启动此操作。数据恢复后,重建过程将作为回填操作执行。这在功能上等同于系统自动为每个定义的索引执行 FT.CREATE 命令。请注意,数据恢复后,很可能在索引回填完成之前,节点便可用于应用程序操作,这意味着应用程序将再次看到回填,例如,使用回填索引的搜索命令可能会遭到拒绝。有关回填的更多信息,请参阅向量搜索概述

索引回填的完成在主索引和副本之间不同步。应用程序可能会意外看到这种不同步的情况,因此建议应用程序在启动搜索操作之前,先在主副本和所有副本上验证回填完成情况。

快照导入/导出和实时迁移

搜索索引存在于 RDB 文件中,这会限制数据兼容传输。由 MemoryDB 向量搜索功能定义的向量索引的格式只能由另一个启用 MemoryDB 向量的集群理解。此外,预览集群中的 RDB 文件可以由 GA 版本的 MemoryDB 集群导入,它将在加载 RDB 文件时重建索引内容。

但是,不包含索引的 RDB 文件不受这种限制。因此,只要在导出前删除索引,就可以将预览群集中的数据导出到非预览群集。

内存消耗

内存消耗基于向量数量、维度数、M 值和非向量数据量,例如与矢量关联的元数据或实例中存储的其他数据。

所需的总内存是实际向量数据所需的空间和向量索引所需的空间的组合。矢量数据所需的空间是通过测量在 HASH 或 JSON 数据结构中存储向量所需的实际容量以及距离最近的内存板的开销来计算的,以实现最佳内存分配。每个向量索引都使用对存储在这些数据结构中的矢量数据的引用,并使用有效的内存优化来删除索引中矢量数据的任何重复副本。

向量的数量取决于您决定如何将数据表示为向量。例如,您可以选择将单个文档表示成几个块,其中每个区块代表一个向量。或者,您可以选择将整个文档表示为单个向量。

向量的维数取决于您选择的嵌入模型。例如,如果您选择使用AWS 泰坦嵌入模型,则维度数将为 1536。

M 参数表示索引构造期间为每个新元素创建的双向链接的数量。MemoryDB 将此值默认为 16;但是,您可以覆盖此值。较高的 M 参数更适合高维度和/或高召回要求,而低 M 参数更适合低维度和/或低召回要求。M 值会随着索引变大而增加内存消耗,从而增加内存消耗。

在控制台体验中,MemoryDB 提供了一种在集群设置下选中 “启用矢量搜索” 后,根据矢量工作负载的特征选择正确的实例类型的简便方法。

AWS 控制台中的矢量搜索集群设置。

工作负载示例

客户想要在其内部财务文件之上构建一个语义搜索引擎。他们目前持有100万份财务文档,这些文件使用1536个维度的泰坦嵌入模型将每个文档分成10个向量,并且没有非向量数据。客户决定使用默认值 16 作为 M 参数。

  • 向量:1 M * 10 个区块 = 1000 万个向量

  • 尺寸:1536

  • 非矢量数据 (GB):0 GB

  • M 参数:16

有了这些数据,客户可以在控制台中单击使用矢量计算器按钮,根据其参数获取推荐的实例类型:

根据计算器的输入,矢量计算器推荐的节点类型。
带有输入值的矢量计算器。

在此示例中,矢量计算器将根据提供的参数寻找最小的 M emoryDB r7g 节点类型,该类型可以容纳存储向量所需的内存。请注意,这是一个近似值,您应该测试实例类型以确保它符合您的要求。

根据上述计算方法和示例工作负载中的参数,此矢量数据将需要 104.9 GB 来存储数据和单个索引。在这种情况下,建议使用db.r7g.4xlarge实例类型,因为它有 105.81 GB 的可用内存。下一个最小的节点类型太小,无法容纳向量工作负载。

由于每个向量索引都使用对存储的矢量数据的引用,并且不会在向量索引中创建向量数据的额外副本,因此索引消耗的空间也相对较少。这在创建多个索引时非常有用,在部分矢量数据已被删除的情况下,重建 HNSW 图将有助于为高质量的矢量搜索结果创建最佳节点连接。

在回填期间内存不足

与 Redis OSS 写入操作类似,索引回填也受到限制。 out-of-memory 如果在回填过程中 Redis OSS 内存已满,则所有回填都将暂停。有可用内存后,回填过程会恢复。当由于内存不足导致回填暂停时,也可以删除内容和编制索引。

事务

命令 FT.CREATEFT.DROPINDEXFT.ALIASADDFT.ALIASDELFT.ALIASUPDATE 不能在事务上下文中执行,也就是说,不能在 MULTI/EXEC 块或 LUA 或 FUNCTION 脚本中执行。