OSS 向量 Bucket 是阿里云对象存储 OSS 提供的一种专门用于存储、查询和管理向量数据的 Bucket 类型,具有低成本、大规模和简单易用的特点,面向多模态检索、知识库、RAG、AI Agent 等 AI 场景提供向量存储和查询的能力。目前,已经有众多客户基于向量 Bucket 来构建自身的语义检索系统。本文将介绍基于 OSS 向量 Bucket 和阿里云大模型服务平台百炼的多模态 Embedding 模型,搭建海量图片的智能语义检索系统,实现基于自然语言描述的文搜图能力的最佳实践,适用于电商商品搜索、智能相册、媒体资产管理、AI 语义检索、图片知识库等场景。
最佳实践操作概览
搭建多模态图片语义检索系统,包含以下步骤:
- 环境准备:获取访问凭证,并安装 OSS Python SDK 和阿里云百炼 SDK。
- 上传图片数据到 OSS:准备待检索的图片数据集,上传至 OSS Bucket。
- 创建 OSS 向量 Bucket 和向量索引:创建存储向量数据的 OSS 向量 Bucket 和向量索引。
- 生成并写入向量:使用阿里云百炼多模态 Embedding 模型将图片转换为高维向量,并将百炼生成的向量数据写入 OSS 向量索引中。
- 执行语义检索:将查询文本转换为向量语义,在向量索引中执行相似度搜索,同时通过元数据进行检索结果过滤。
- 可视化 Demo:通过 OSS 提供的 Demo 平台展示语义检索效果。
一、环境准备
获取访问凭证 已开通 OSS 服务,并获取 AccessKey ID 和 AccessKey Secret 。 已开通阿里云百炼服务,并获取 API Key。
安装SDK
- 已安装 Python 3.12 及以上版本。
- 执行以下命令安装阿里云 OSS Python SDK V2和阿里云百炼 SDK。
配置环境变量
为确保代码安全与可移植性,建议将访问凭证配置为环境变量。
二、上传图片数据到 OSS
将图片数据从本地上传到 OSS Bucket。百炼的 Embedding 模型需要通过 OSS 文件 URL 来访问这些图片并进行向量化处理。以下代码演示了如何批量上传本地文件夹中的图片到指定的 Bucket。
使用 OSS SDK 上传原始图片数据:
三、创建 OSS 向量 Bucket 和向量索引
创建向量 Bucket
使用 OSS SDK 创建一个向量 Bucket,将其作为存储所有向量数据和向量索引的云资源。OSS 向量 Bucket 目前在 华南1(深圳)、华北2(北京)、华东1(杭州)、华东2(上海)、华北6(乌兰察布)、新加坡、中国香港、印度尼西亚(雅加达)、德国(法兰克福)、美国(硅谷)、美国(弗吉尼亚)地域。您可以在同一地域中创建最多 10 个向量 Bucket。
创建向量索引
OSS 向量 Bucket 创建成功后,您还需要在该向量 Bucket 中创建向量索引,作为存储向量数据的索引表。向量索引创建后,您可以逐行写入向量数据,以及向量数据所携带的标量元数据。向量索引定义了向量的结构(如维度)和检索方式(如距离度量),是存储和查询向量数据的基础。其中,向量索引的维度需要和您在百炼中使用的向量模型的维度保持一致,以下以创建一张向量维度为 1024 维,距离度量函数为余弦距离方式的向量索引表为例。
创建向量索引:
四、生成并写入向量
OSS 向量 Bucket 支持写入任意方式产生的向量数据,如通过阿里云百炼、自建向量化服务等方式。本文使用阿里云百炼的多模态 Embedding 模型“multimodal-embedding-v1 ”来生成图片的向量化数据,将原始图片转换为 1024 维向量,并写入到 OSS 向量 Bucket 的向量索引中。您可以分别调用阿里云百炼和 OSS 的 SDK 来生成和写入向量,也可以使用 OSS-Vectors-Embed-CLI 命令行工具封装好的命令来通过一条命令完成向量数据和写入。
- 使用阿里云百炼 SDK 和 OSS SDK 来生成和写入向量
使用阿里云百炼 SDK 生成向量数据:
使用 OSS SDK 将百炼生成的向量数据写入到 OSS 向量索引:
- 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量生成和写入
OSS-Vectors-Embed-CLI 命令行工具是 OSS 推出的全新命令行工具,用户可以使用该工具的封装命令便捷地调用阿里云百炼向量模型,将 OSS 中原始文件或存储在本地的海量文件进行向量化,并将向量化结果写入到 OSS 向量 Bucket。同时,该命令行工具也支持发起多模态语义检索,简化如 RAG 知识库、AI 助手、多模态语义检索等各类 AI 应用的开发流程,并具有批量处理、灵活自定义、添加标量元数据等丰富的功能,您可以参考< developer.aliyun.com/article/171… >
请求示例:
返回示例:
五、执行语义检索
您可以使用自然语言文本作为 Query 查询条件,调用 OSS 向量 Bucket 提供的 QueryVectors 接口、SDK 或者 OSS-Vectors-Embed-CLI 命令行工具来完成向量语义检索,或者向量和标量的混合检索,以返回最相似的向量 TopK。
5.1 向量检索
- 使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索
将查询文本(例如“狗狗”)向量化后,在索引中查找最接近的 Top-K 个图片向量。
使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索:
- 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量检索
OSS-Vectors-Embed-CLI 提供封装好的命令语句,快速完成 Query 内容的向量化和相似度检索。除了支持本文中的“以文搜图”,还可以满足如“以图搜图”等多模态语义检索需求。您可以参考< developer.aliyun.com/article/171… >。
请求示例:
返回示例:
5.2 结合标量元数据过滤条件进行检索
在进行向量相似度检索的同时,OSS 向量 Bucket 可以根据图片的元数据(如city、height)进行精确过滤,以缩小检索范围。向量检索支持使用and、$or等操作符对元数据进行过滤。
- 使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索 将查询文本(例如“狗狗”)向量化后,在索引中查找最接近的 Top-K 个图片向量,并添加不同的标量元数据过滤条件。
使用阿里云百炼 SDK 和 OSS SDK 来进行向量检索:
- 使用 OSS-Vectors-Embed-CLI 工具的命令来完成向量检索
OSS-Vectors-Embed-CLI 提供封装好的命令语句,也可以添加相应的标量元数据过滤语法进行标量元数据过滤,如 AND、OR、IN 等,以加强检索结果的准确性,快速完成 Query 内容的向量化和相似度检索。除了支持本文中的“以文搜图”,还可以满足如“以图搜图”等多模态语义检索需求。您可以参考< developer.aliyun.com/article/171… >。
请求示例:
返回示例:
六、构建可视化检索界面
为了更直观地展示检索效果,可使用 Gradio 构建一个简单的 Web 界面,提供一个包含文本输入、条件过滤和图片结果展示的交互式检索界面。
安装 Web UI 框架:
将以下代码保存为 gradio_app.py
启动界面:
启动成功后,访问 http://localhost:7860 即可使用检索界面。如检索示例:输入"狗狗",即可返回包含狗的图片。
更多参考
- OSS 向量 Bucket 功能介绍:help.aliyun.com/zh/oss/user…
- OSS-Vectors-Embed-CLI 命令行工具介绍:help.aliyun.com/zh/oss/user…