OSS 向量 Bucket 最佳实践:快速构建多模态图片语义检索

0 阅读7分钟

OSS 向量 Bucket 是阿里云对象存储 OSS 提供的一种专门用于存储、查询和管理向量数据的 Bucket 类型,具有低成本、大规模和简单易用的特点,面向多模态检索、知识库、RAG、AI Agent 等 AI 场景提供向量存储和查询的能力。目前,已经有众多客户基于向量 Bucket 来构建自身的语义检索系统。本文将介绍基于 OSS 向量 Bucket 和阿里云大模型服务平台百炼的多模态 Embedding 模型,搭建海量图片的智能语义检索系统,实现基于自然语言描述的文搜图能力的最佳实践,适用于电商商品搜索、智能相册、媒体资产管理、AI 语义检索、图片知识库等场景。

最佳实践操作概览

搭建多模态图片语义检索系统,包含以下步骤:

  1. 环境准备:获取访问凭证,并安装 OSS Python SDK 和阿里云百炼 SDK。
  2. 上传图片数据到 OSS:准备待检索的图片数据集,上传至 OSS Bucket。
  3. 创建 OSS 向量 Bucket 和向量索引:创建存储向量数据的 OSS 向量 Bucket 和向量索引。
  4. 生成并写入向量:使用阿里云百炼多模态 Embedding 模型将图片转换为高维向量,并将百炼生成的向量数据写入 OSS 向量索引中。
  5. 执行语义检索:将查询文本转换为向量语义,在向量索引中执行相似度搜索,同时通过元数据进行检索结果过滤。
  6. 可视化 Demo:通过 OSS 提供的 Demo 平台展示语义检索效果。

一、环境准备

获取访问凭证开通 OSS 服务,并获取 AccessKey ID 和 AccessKey Secret 。 已开通阿里云百炼服务,并获取 API Key

安装SDK

  1. 已安装 Python 3.12 及以上版本。
  2. 执行以下命令安装阿里云 OSS Python SDK V2和阿里云百炼 SDK。

image

配置环境变量 为确保代码安全与可移植性,建议将访问凭证配置为环境变量。 image

二、上传图片数据到 OSS

将图片数据从本地上传到 OSS Bucket。百炼的 Embedding 模型需要通过 OSS 文件 URL 来访问这些图片并进行向量化处理。以下代码演示了如何批量上传本地文件夹中的图片到指定的 Bucket。

使用 OSS SDK 上传原始图片数据:

image

三、创建 OSS 向量 Bucket 和向量索引

创建向量 Bucket

使用 OSS SDK 创建一个向量 Bucket,将其作为存储所有向量数据和向量索引的云资源。OSS 向量 Bucket 目前在 华南1(深圳)、华北2(北京)、华东1(杭州)、华东2(上海)、华北6(乌兰察布)、新加坡、中国香港、印度尼西亚(雅加达)、德国(法兰克福)、美国(硅谷)、美国(弗吉尼亚)地域。您可以在同一地域中创建最多 10 个向量 Bucket。

image

创建向量索引

OSS 向量 Bucket 创建成功后,您还需要在该向量 Bucket 中创建向量索引,作为存储向量数据的索引表。向量索引创建后,您可以逐行写入向量数据,以及向量数据所携带的标量元数据。向量索引定义了向量的结构(如维度)和检索方式(如距离度量),是存储和查询向量数据的基础。其中,向量索引的维度需要和您在百炼中使用的向量模型的维度保持一致,以下以创建一张向量维度为 1024 维,距离度量函数为余弦距离方式的向量索引表为例。

创建向量索引:

image

四、生成并写入向量

OSS 向量 Bucket 支持写入任意方式产生的向量数据,如通过阿里云百炼、自建向量化服务等方式。本文使用阿里云百炼的多模态 Embedding 模型“multimodal-embedding-v1 ”来生成图片的向量化数据,将原始图片转换为 1024 维向量,并写入到 OSS 向量 Bucket 的向量索引中。您可以分别调用阿里云百炼和 OSS 的 SDK 来生成和写入向量,也可以使用 OSS-Vectors-Embed-CLI 命令行工具封装好的命令来通过一条命令完成向量数据和写入。

  • 使用阿里云百炼 SDK 和 OSS SDK 来生成和写入向量

使用阿里云百炼 SDK 生成向量数据:

image

使用 OSS SDK 将百炼生成的向量数据写入到 OSS 向量索引:

image

  • 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量生成和写入

OSS-Vectors-Embed-CLI 命令行工具是 OSS 推出的全新命令行工具,用户可以使用该工具的封装命令便捷地调用阿里云百炼向量模型,将 OSS 中原始文件或存储在本地的海量文件进行向量化,并将向量化结果写入到 OSS 向量 Bucket。同时,该命令行工具也支持发起多模态语义检索,简化如 RAG 知识库、AI 助手、多模态语义检索等各类 AI 应用的开发流程,并具有批量处理、灵活自定义、添加标量元数据等丰富的功能,您可以参考< developer.aliyun.com/article/171… >

请求示例: image

返回示例: image

五、执行语义检索

您可以使用自然语言文本作为 Query 查询条件,调用 OSS 向量 Bucket 提供的 QueryVectors 接口、SDK 或者 OSS-Vectors-Embed-CLI 命令行工具来完成向量语义检索,或者向量和标量的混合检索,以返回最相似的向量 TopK。

5.1 向量检索

  • 使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索

将查询文本(例如“狗狗”)向量化后,在索引中查找最接近的 Top-K 个图片向量。

使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索:

image

  • 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量检索

OSS-Vectors-Embed-CLI 提供封装好的命令语句,快速完成 Query 内容的向量化和相似度检索。除了支持本文中的“以文搜图”,还可以满足如“以图搜图”等多模态语义检索需求。您可以参考< developer.aliyun.com/article/171… >。

请求示例: image

返回示例: image

5.2 结合标量元数据过滤条件进行检索

在进行向量相似度检索的同时,OSS 向量 Bucket 可以根据图片的元数据(如city、height)进行精确过滤,以缩小检索范围。向量检索支持使用inin、and、$or等操作符对元数据进行过滤。

  • 使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索 将查询文本(例如“狗狗”)向量化后,在索引中查找最接近的 Top-K 个图片向量,并添加不同的标量元数据过滤条件。

使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索:

image

  • 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量检索

OSS-Vectors-Embed-CLI 提供封装好的命令语句,也可以添加相应的标量元数据过滤语法进行标量元数据过滤,如 AND、OR、IN 等,以加强检索结果的准确性,快速完成 Query 内容的向量化和相似度检索。除了支持本文中的“以文搜图”,还可以满足如“以图搜图”等多模态语义检索需求。您可以参考< developer.aliyun.com/article/171… >。

请求示例: image

返回示例: image

六、构建可视化检索界面

为了更直观地展示检索效果,可使用 Gradio 构建一个简单的 Web 界面,提供一个包含文本输入、条件过滤和图片结果展示的交互式检索界面。

安装 Web UI 框架: image

将以下代码保存为 gradio_app.py image

启动界面: image

启动成功后,访问 http://localhost:7860 即可使用检索界面。如检索示例:输入"狗狗",即可返回包含狗的图片。

image

更多参考