本解决方案提供了一个基于亚马逊 Titan 多模态嵌入模型的搜索引擎原型,用于根据文本或图像查询检索和推荐产品。这是一个分步指南,介绍如何使用 Amazon Bedrock Titan 模型 将图像和文本编码为嵌入,将嵌入摄取到 Amazon OpenSearch Service 索引中,并使用 OpenSearch Service k-nearest neighbors (KNN) 功能 查询索引。
建议在 SageMaker Studio Notebooks Python 3.0(Data Science)
内核上执行此笔记本,使用 ml.t3.medium
实例。
此笔记本已从 – Bedrock 样本链接此处 – MultiModal Embeddings 借用。
安装依赖项
安装我们将在 POC 中使用的一些 python 包。为了抽象,我们已经在 utils.py 中定义了所有重要的函数。
对于此笔记本,我们将使用亚马逊伯克利对象数据集。该数据集是一个包含 147,702 个产品列表的集合,具有多语言元数据和 398,212 个独特的目录图像。8,222 个列表附带转盘摄影。我们将只使用项目图像和美国英语中的项目名称(我们将其视为产品的简短描述)。出于演示目的,我们将在此实践中使用大约 1,600 个产品。
加载元数据
我们可以使用 pandas 加载元数据,然后从数据帧中选择标题为美国英语的产品。我们将使用一个名为 main_image_id 的列来将项目名称与项目图像合并。
亚马逊 Titan 多模态嵌入 G1 第 1 代 (G1) 能够将图像和文本投射到同一潜在空间,因此我们只需要将项目图像或文本编码到嵌入空间。在这个实践中,我们可以使用批量推理 来编码项目图像。在创建作业之前,我们需要将项目图像从亚马逊伯克利对象数据集公共 S3 存储桶复制到我们自己的 S3 存储桶。该操作需要不到 10 分钟。
但是对于这个笔记本,我们将使用实时 API 而不是批量推理。
让我们可视化嵌入
在创建新的向量搜索集合和索引之前,我们必须首先创建三个相关的 OpenSearch 策略:加密安全策略、网络安全策略和数据访问策略。
我们将使用元数据来存储图像位置,以便我们可以从向量数据库中读取图像
接下来,我们需要遍历数据集并将项目数据摄取到集群中。有关嵌入摄取的更强大和可扩展的解决方案,请参见将丰富的数据摄取到 Amazon ES 。对于此 POC 的数据摄取应在 60 秒内完成。它还执行一个简单的查询来验证数据是否已被摄取到索引中。
现在我们有了一个包含库存嵌入的工作 OpenSearch 索引,让我们看看如何为新项目生成嵌入。我们将使用亚马逊 Titan 多模态嵌入 G1 第 1 代 (G1) 提取文本特征和图像特征。
让我们看看简单查询的结果。从 OpenSearch 服务检索结果后,我们从数据集中获取项目名称和图像。
让我们看看简单查询的结果。在下面的示例中,我们将从用户那里接收一个文本输入,即"drinkware glass”,然后将其发送到搜索引擎以查找相似的项目。
根据用户查询找到相似的项目。我们可以看到,我们根据输入查询从数据集中找到了玻璃餐具。这就是我们想要实现的目标。
让我们看看基于简单图像的结果。输入图像将被转换为向量嵌入,并根据相似性搜索返回结果。
我们可以使用任何图像,但对于下面的示例,我们将根据项目 ID (例如 item_id = “B07JCDQWM6”) 从上述数据集中选择一个随机图像,然后将此图像发送到搜索引擎以查找相似的项目。首先,让我们根据项目 ID 获取图像和图像位置。
然后,根据上面的图像获取相似的项目
现在让我们发送一个基于图像的查询。该图像是一个通用的航班仪表板
当我们完成此练习时,请按照以下步骤删除我们的资源:
删除向量索引。 删除数据、网络和加密访问策略。 删除集合。 删除 SageMaker Studio 用户配置文件和域。 可选地,清空并删除 S3 存储桶,或保留我们想要的任何内容。