企业文化

  • 首页 企业文化 构建多模态搜索与 Amazon OpenSearch 服务 大数据博客

构建多模态搜索与 Amazon OpenSearch 服务 大数据博客

2026-01-27 14:30:04

使用 Amazon OpenSearch 服务构建多模态搜索

关键要点多模态搜索能够结合文本和图像搜索功能,极大地提升用户通过搜索应用程序获取数据的方式。本文将指导您如何使用 Amazon OpenSearch 服务与 Amazon Bedrock Titan 多模态嵌入模型集成,以实现这一能力。

多模态搜索可以同时支持文本和图像搜索,改变用户通过搜索应用访问数据的方式。想象一下构建一个在线时尚零售店:您可以通过一个视觉吸引人的应用来增强用户的搜索体验,顾客不仅可以通过文本进行搜索,还可以上传一张展示所需风格的图像,并使用上传的图像和输入文本来查找最相关的商品。多模态搜索为确定如何找到最相关的信息提供了更大的灵活性。

一元机场官网首页

为了在文本、图像和两者组合之间启用多模态搜索,您需要为文本基础的图像元数据和图像本身生成嵌入。文本嵌入捕获文档语义,而图像嵌入捕获视觉属性,这帮助您构建丰富的图像搜索应用。

Amazon Titan Multimodal Embeddings G1 是一个多模态嵌入模型,用于生成嵌入以促进多模态搜索。这些嵌入被存储并通过专门的向量存储如 Amazon OpenSearch 服务进行高效管理,OpenSearch 服务旨在存储和检索大量高维向量以及结构化和非结构化数据。通过使用这一技术,您可以构建无缝集成文本和视觉信息的丰富搜索应用。

Amazon OpenSearch 服务和Amazon OpenSearch Serverless 支持向量引擎,您可以使用其存储和运行向量搜索。此外,OpenSearch 服务支持 神经搜索,该功能提供即用型 机器学习 (ML) 连接器。这些 ML 连接器使 OpenSearch 服务能够与托管在 Amazon Bedrock、Amazon SageMaker 及其他远程 ML 平台如 OpenAI 和 Cohere上的嵌入模型和大型语言模型 (LLM) 无缝集成。当您使用神经插件的连接器时,无需在 OpenSearch 服务外部构建额外的管道以与这些模型进行交互。

这篇博客将提供一个逐步指南,演示如何使用 OpenSearch 服务构建多模态搜索解决方案。您将使用 ML 连接器将 OpenSearch 服务与 Amazon Bedrock Titan 多模态嵌入模型集成,以推断您的多模态文档和查询的嵌入。本文通过展示如何将包含产品图像和产品描述的零售数据集摄入到您的 OpenSearch 服务域中,然后使用 Titan 多模态模型生成的向量嵌入执行多模态搜索,来说明这一过程。用于本教程的代码是开源的,您可以在 GitHub 上访问和探索。

多模态搜索解决方案架构

我们将提供设置多模态搜索所需的步骤。下图描绘了解决方案架构。

图 1:多模态搜索架构

工作流程如下:

您从 Amazon Simple Storage Service (Amazon S3) 下载零售数据集,并使用 OpenSearch 摄入管道 将其摄入到 OpenSearch kNN 索引。OpenSearch 服务调用 Amazon Bedrock Titan 多模态嵌入模型,为产品描述和图像生成多模态向量嵌入。通过 OpenSearch 服务客户端,您传递一个搜索查询。OpenSearch 服务调用 Amazon Bedrock Titan 多模态嵌入模型,为搜索查询生成向量嵌入。OpenSearch 执行神经搜索,并将搜索结果返回给客户端。

接下来,我们详细了解步骤 1、2 和 4。

第一步:将数据摄入 OpenSearch

该步骤涉及以下 OpenSearch 服务功能:

摄入管道:摄入管道是一系列处理器,应用于文档在摄入索引时的过程。在这里,您使用 textimageembedding 处理器为图像和图像描述生成组合向量嵌入。kNN 索引:kNN 索引引入了一种自定义数据类型 knnvector,使用户能够将向量摄入到 OpenSearch 索引中并执行不同类型的 kNN 搜索。您将使用 kNN 索引存储一般字段数据类型如文本、数字等和专用字段数据类型如 knnvector。

步骤 2 和 4:OpenSearch 调用 Amazon Bedrock Titan 模型

OpenSearch 服务使用 Amazon Bedrock 连接器 生成数据的嵌入。当您在索引和搜索请求中发送图像和文本时,OpenSearch 会利用该连接器与相应的 Amazon Bedrock Titan 模型 交换输入和嵌入。架构图中的蓝色框突出显示了 OpenSearch 与 Amazon Bedrock 通过这个 ML 连接器 特性的集成。这一直接集成消除了需要引入额外组件例如 AWS Lambda来促进两个服务之间的交换。

解决方案概述

在本教程中,您将构建并运行多模态搜索,使用一个示例零售数据集。您将利用相同的多模态生成的嵌入,进行文本搜索、图像搜索以及文本和图像的组合搜索。

前提条件

创建一个 OpenSearch 服务域。有关说明,请参见 创建和管理 Amazon OpenSearch 服务域。确保在创建域时应用以下设置,其他设置保持默认。OpenSearch 版本为 213域具有公共访问权限启用细粒度访问控制创建一个主用户设置一个 Python 客户端 以与 OpenSearch 服务域交互,最好是在 Jupyter Notebook 界面中。在 Amazon Bedrock 中添加 模型访问。有关说明,请查看 添加模型访问。

请注意,您需要参考 Jupyter Notebook 中的内容来运行接下来的步骤,使用 Python 代码在您的客户端环境中进行操作。以下部分将提供示例代码块,其中包含仅有的 HTTP 请求 path 和请求 payload,以便在每一步将其传递给 OpenSearch 服务。

数据概述与准备

您将使用一个零售数据集,包含 2465 个零售产品样本,涵盖配件、家居装饰、服装、家居用品、书籍和乐器等不同类别。每个产品包含元数据,包括 ID、当前库存、名称、类别、风格、描述、价格、图像 URL 和性别倾向。您将在解决方案中使用产品图像和产品描述字段。

以下图中显示了来自数据集的示例产品图像和产品描述:

图 2:示例产品图像和描述

除了原始产品图像外,图像的文字描述还为产品提供了附加的元数据,如颜色、类型、风格、适用性等。有关数据集的更多信息,请访问 GitHub 上的零售演示商店。

第一步:创建 OpenSearchAmazon Bedrock ML 连接器

OpenSearch 服务控制台提供了一个 简化的集成过程,可以在几分钟内为多模态搜索部署 Amazon BedrockML 连接器。OpenSearch 服务控制台集成 提供了 AWS CloudFormation 模板来自动化 Amazon Bedrock 模型部署和在 OpenSearch 服务中创建 Amazon BedrockML 连接器的步骤。

在 OpenSearch 服务控制台 中,导航到 Integrations,搜索 Titan 多模态。这将返回一个名为 Integrate with Amazon Bedrock Titan Multimodal 的 CloudFormation 模板,您将在以下步骤中使用它。

图 3:配置域

选择 Configure domain 并选择‘配置公共域’。您将自动重定向到 CloudFormation 模板堆栈,在这里大部分配置都已为您预填,包括 Amazon Bedrock 模型、ML 模型名称以及 AWS 身份与访问管理 (IAM) 角色,后者用于 Lambda 调用您的 OpenSearch 域。更新 Amazon OpenSearch Endpoint 为您的 OpenSearch 域端点,Model Region 为模型可用的 AWS 区域。

图 4:创建 CloudFormation 堆栈

在您点击 ‘Create Stack’ 部署堆栈之前,您需要给堆栈必要的权限,以便创建 ML 连接器。CloudFormation 模板为您创建了一个默认名称为 LambdaInvokeOpenSearchMLCommonsRole 的 Lambda IAM 角色,您可以覆盖选择一个不同的名称。您需要将此 IAM 角色映射为 OpenSearch 仪表板安全插件中的 mlfullaccess 角色的后端角色,以便 Lambda 函数可以成功创建 ML 连接器。为此:登录到 OpenSearch Dashboards,使用在先决条件部分创建的主用户凭证。您可以在 OpenSearch 服务控制台的域仪表板上找到 Dashboards 端点。从主菜单选择 Security,Roles,并选择 mlfullaccess 角色。选择 Mapped users,Manage mapping。在 Backend roles 下,添加需要调用您域的 Lambda 角色的 ARN (arnawsiamltaccountidgtrole/LambdaInvokeOpenSearchMLCommonsRole)。选择 Map 并确认用户或角色在 Mapped users 下显示。

图 5:在 OpenSearch 仪表盘安全插件中设置权限

返回到 CloudFormation 堆栈控制台,勾选“我承认 AWS CloudFormation 可能创建具有自定义名称的 IAM 资源”,然后单击“创建堆栈”。堆栈部署完成后,它将创建 Amazon BedrockML 连接器ConnectorId和模型标识符ModelId。

图 6:CloudFormation 堆栈输出

从 CloudFormation 控制台的输出标签中复制以 OpenSearchbedrockmm 开头的 ModelId。您将在后续步骤中使用此 ModelId。

第二步:创建带有 textimageembedding 处理器的 OpenSearch 摄入管道

您可以创建一个摄入管道,并使用 textimageembedding 处理器,该处理器在索引过程中将图像和描述转换为嵌入。

在以下请求负载中,您需要向 textimageembedding 处理器提供以下参数。指定要转换为嵌入的索引字段,哪个字段应存储向量嵌入,以及使用哪个 ML 模型执行向量转换。

modelid(lt modelid gt) 来自上一步的模型标识符。embedding(lt vectorembedding gt) 存储向量嵌入的 kNN 字段。fieldmap(lt productdescription gt 和 ltimagebinary gt) 产品描述和图像的字段名称,图像以二进制格式表示。

pythonpath = ingest/pipeline/

payload = { description A text/image embedding pipeline processors [ { textimageembedding { modelid embedding fieldmap { text image } } } ]}

构建多模态搜索与 Amazon OpenSearch 服务 大数据博客

第三步:创建 kNN 索引并摄入零售数据集

创建 kNN 索引,将前一步创建的管道设为默认管道。将 indexknn 设置为 True 以执行近似 kNN 搜索。vectorembedding 字段 type 必须映射为 knnvector。vectorembedding 字段的 dimension 必须映射为模型提供的向量维度数量。

Amazon Titan Multimodal Embeddings G1 允许您选择输出向量的大小256、512 或 1024。在本篇文章中,您将使用来自模型的默认 1024 维向量。您可以通过选择 ‘Providers’ gt ‘Amazon’ 标签 gt ‘Titan Multimodal Embeddings G1’ 标签 gt ‘Model attributes’,在您的 Bedrock 控制台 中检查模型的维度大小。

鉴于数据集较小且为提升召回率,您将为 kNN 索引使用 faiss 引擎与 hnsw 算法以及默认的 l2 空间类型。有关不同引擎和空间类型的更多信息,请参考 kNN 索引。

pythonpayload = { settings { indexknn True defaultpipeline ltingestpipelinegt } mappings { properties { vectorembedding { type knnvector dimension 1024 method { engine faiss spacetype l2 name hnsw parameters {} } } productdescription {type text} imageurl {type text} imagebinary {type binary} } }}

最后,使用 bulk 请求将零售数据集摄入 kNN 索