使用向量搜索集合 - 亚马逊 OpenSearch 服务
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用向量搜索集合

OpenSearch 无服务器中的向量搜索集合类型提供了一种可扩展且性能很高的相似度搜索功能。它使您可以轻松构建现代机器学习 (ML) 增强搜索体验和生成式人工智能 (AI) 应用程序,而无需管理底层的向量数据库基础架构。

向量搜索集合的用例包括图像搜索、文档搜索、音乐检索、产品推荐、视频搜索、基于位置的搜索、欺诈检测和异常检测。

由于 OpenSearch 中 k 最近邻 (k-NN) 搜索功能支持 OpenSearch 无服务器的向量引擎,因此您可以借助无服务器环境的简单性获得相同的功能。该引擎支持 k-nn OpenSearch API 操作。通过这些操作,您可以利用全文搜索、高级筛选、聚合、地理空间查询、嵌套查询来更快地检索数据,并增强搜索结果。

向量引擎提供距离指标,例如欧几里得距离、余弦相似度和点积相似度,并且可以容纳 16,000 个维度。您可以存储具有各种元数据数据类型的字段,例如数字、布尔值、日期、关键字和地理点。您还可以存储带有描述性信息的文本字段,以便为存储的向量添加更多上下文。将数据类型放在一起可以降低复杂性、提高可维护性,并避免数据重复、版本兼容性挑战和许可问题。

开始使用向量搜索集合

在本教程中,您将完成以下步骤来实时存储、搜索和检索向量嵌入:

步骤 1:配置权限

要完成本教程,以及全面使用 OpenSearch 无服务器,您必须拥有正确的 Amazon Identity and Access Management IAM 权限。在本教程中,您将创建一个集合、上传和搜索数据,然后删除该集合。

您的用户或角色必须已经附加基于身份的策略,并且具有以下最低权限:

{ "Version": "2012-10-17", "Statement": [ { "Action": [ "aoss:CreateCollection", "aoss:ListCollections", "aoss:BatchGetCollection", "aoss:DeleteCollection", "aoss:CreateAccessPolicy", "aoss:ListAccessPolicies", "aoss:UpdateAccessPolicy", "aoss:CreateSecurityPolicy", "iam:ListUsers", "iam:ListRoles" ], "Effect": "Allow", "Resource": "*" } ] }

有关 OpenSearch 无服务器 IAM 权限的更多信息,请参阅适用于 Amazon OpenSearch Serverless 的身份和访问管理

步骤 2:创建集合

集合是一组 OpenSearch 索引,它们协同工作,以支持某个具体的工作负载或应用场景。

创建 OpenSearch 无服务器集合
  1. https://console.aws.amazon.com/aos/home 打开 Amazon OpenSearch Service 控制台。

  2. 选择左侧导航窗格中的 Collections(集合),然后选择 Create collection(创建集合)。

  3. 命名集合住房

  4. 对于集合类型,选择向量搜索。有关更多信息,请参阅 选择集合类型

  5. 部署类型下,清除启用冗余(活动副本)。这会在开发或测试模式下创建一个集合,并将集合中 OpenSearch 计算单位(OCU)的数量减少到两个。如果要在本教程中创建生产环境,则请选中该复选框。

  6. 安全下,选择轻松创建以简化您的安全配置。默认情况下,向量引擎中的所有数据在传输过程中和静止状态下都经过加密。向量引擎支持精细的 IAM 权限,因此您可以定义谁可以创建、更新和删除加密、网络、集合和索引。

  7. 选择 下一步

  8. 查看集合设置并选择 提交。稍等几分钟,等集合状态变为 Active

步骤 3:上传并搜索数据

索引是具有通用数据架构的文档集合,它为您提供了一种存储、搜索和检索向量嵌入和其他字段的方法。您可以在 OpenSearch 控制面板中使用 Dev Tools 控制台,或者使用 Postmanawscurl 等 HTTP 工具,创建并将数据上传到 OpenSearch 无服务器集合中的索引。本教程使用的是 Dev Tools。

索引和搜索“movies”(电影)集合中的数据
  1. 要为新集合创建单个索引,请在 Dev Tools 控制台中发送以下请求。默认情况下,这将创建一个带有 nmslib 引擎和欧几里得距离的索引。

    PUT housing-index { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3 }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 要将单个文档索引到 housing-index 中,请发送以下请求:

    POST housing-index/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. 要搜索与索引中的属性相似的属性,请发送以下查询:

    GET housing-index/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 10, 20, 30 ], "k": 5 } } } }

步骤 4:删除集合

由于住房集合用于测试目的,因此请确保在您完成试验后将其删除。

删除 OpenSearch 无服务器集合
  1. 返回到 Amazon OpenSearch Service 控制台。

  2. 选择左侧导航窗格中的集合,然后选择属性集合。

  3. 选择删除,然后确认删除。

经过筛选的搜索

您可以使用筛选条件来优化语义搜索结果。要创建索引并对文档执行经过筛选的搜索,请使用以下说明替换上一个教程中的上传和搜索数据。其他步骤保持不变。有关筛选条件的更多信息,请参阅使用筛选条件进行 k-NN 搜索

索引和搜索“movies”(电影)集合中的数据
  1. 要为您的集合创建单个索引,请在 Dev Tools 控制台中发送以下请求:

    PUT housing-index-filtered { "settings": { "index.knn": true }, "mappings": { "properties": { "housing-vector": { "type": "knn_vector", "dimension": 3, "method": { "engine": "faiss", "name": "hnsw" } }, "title": { "type": "text" }, "price": { "type": "long" }, "location": { "type": "geo_point" } } } }
  2. 要将单个文档索引到 housing-index-filtered 中,请发送以下请求:

    POST housing-index-filtered/_doc { "housing-vector": [ 10, 20, 30 ], "title": "2 bedroom in downtown Seattle", "price": "2800", "location": "47.71, 122.00" }
  3. 要搜索西雅图给定价格和给定距离范围内的公寓数据,请发送以下请求:

    GET housing-index-filtered/_search { "size": 5, "query": { "knn": { "housing-vector": { "vector": [ 0.1, 0.2, 0.3 ], "k": 5, "filter": { "bool": { "must": [ { "query_string": { "query": "Find me 2 bedroom apartment in Seattle under $3000 ", "fields": [ "title" ] } }, { "range": { "price": { "lte": 3000 } } }, { "geo_distance": { "distance": "100miles", "location": { "lat": 48, "lon": 121 } } } ] } } } } } }

十亿级工作负载

向量搜索集合支持包含数十亿个向量的工作负载。您无需出于扩展目的重新编制索引,因为自动扩缩功能会为您执行此操作。如果您有数百万个(或更多)具有大量维度的向量,并且需要超过 200 个 OCU,请联系 Amazon Support 以提高账户的最大 OpenSearch 计算单位(OCU)。

限制

向量搜索集合具有以下限制:

  • 向量搜索集合不支持 Apache Lucene ANN 引擎。

  • 向量搜索集合仅支持带有 Faiss 的 HNSW 算法,不支持 IVF 和 IVFQ。

  • 向量搜索集合不支持预热、统计数据和模型训练 API 操作。

  • 向量搜索集合不支持内联脚本或存储脚本。

  • Amazon Web Services Management Console 中向量搜索集合的索引计数信息不可用。

  • 向量搜索集合上索引的刷新间隔为 60 秒。

后续步骤

现在您已知道如何创建向量搜索集合和索引数据,您可能想尝试以下一些练习:

  • 使用 OpenSearch Python 客户端来处理向量搜索集合。请在 GitHub 上观看本教程。

  • 使用 OpenSearch Java 客户端来处理向量搜索集合。请在 GitHub 上观看本教程。

  • 将 LangChain 设置为使用 OpenSearch 作为向量存储。LangChain 是一个开源框架,用于开发由语言模型提供支持的应用程序。有关更多信息,请参阅 LangChain 文档