端到端图搜解决方案

端到端图搜解决方案

本文将介绍企业在没有向量数据的情况下,如何通过 Ope nSearch 向量检索版,快速搭建图像搜索服务。

用户可以直接导入图片源数据,在 OpenSearch 内部便捷的完成图片向量化、向量搜索等步骤,实现以图搜图、以文搜图等多种图像检索能力。

方案架构

用户可以通过 4 种不同的方式上传图片进行图搜引擎的搭建

  • OSS+MaxCompute+OpenSearch 向量检索版:用户先将图片上传至 OSS 中,在 MaxCompute 中存储业务表数据以及每条数据对应的图片地址(OSS 里的路径,比如/image/1.jpg)。

  • MaxCompute+OpenSearch 向量检索版:用户将图片通过 base64 编码后的图片及其表数据存储在 MaxCompute 中。

  • API+OpenSearch 向量检索版:用户通过 OpenSearch 向量检索版提供的数据推送接口,将 base64 编码后的图片及其表数据推送到 OpenSearch 向量检索版实例中。

  • 数据湖构建(DLF)+OpenSearch 向量检索版:用户将图片数据迁移到数据湖构建 DLF 2.0 Catalog 下的数据表中。

本文演示的是 OSS+MaxCompute+OpenSearch 向量检索版搭建图搜引擎。

环境准备

1.创建 AK SK

第一次开通阿里云账号并登录控制台时,会提示先创建 access key 才能继续使用。

  • 创建及使用应用依赖 access key 参数,主账号下 access key 参数不能为空。

  • 在为主账号创建 access key 参数后,还可以再创建 RAM 子账号 access key 通过 RAM 子账号进行访问,RAM 子账号赋予对应访问权限,请参考 RAM(子账号)的创建及授权

2.创建对象存储 OSS

image_409ce896ccx9

  1. 开通 OSS 服务

  2. 控制台创建存储空间

  3. 控制台上传文件

  1. 添加 opensearch 标签:(key-value 值均为 opensearch)

image

本文在 OSS 中上传了 1000 张图片:

image_409d36b4ccr4

部分图片类型如下:

image_409d84d0cc9c

购买 OpenSearch 向量检索版实例

购买实例可参考 购买 OpenSearch 向量检索版实例

配置实例

实例列表 页面,找到新购买的实例,其状态为“待配置”,需要完成表的配置后,才可正常搜索。

image.png

1. 表基础信息

image.png

配置说明

  • 表名称 :可自定义

  • 数据分片数 :分片数设置时,请填写不超过 256 的正整数, 用于提升全量构建速度、单次查询性能。(部分存量实例,仍需各索引表分片数保持一致;或至少一个索引表分片数为 1,其余索引表分片数一致)

  • 数据更新资源数 :数据更新所用资源数,每个索引默认免费提供 2 4 8G 的更新资源,超出免费额度的资源将产生费用,详情可参考 向量检索版计费概述

  • 场景模板 :选择“向量:图片搜索”。

2. 数据同步

全量数据来源选择 MaxCompute+API 方式,依次完成参数配置,最后需要通过数据来源校验,才能进行下一步的操作。

image.png

配置参数说明

  • AccessKey:阿里云账号或 RAM 用户的 AccessKey ID。

  • AccessKey Secret:AccessKey ID 对应的 AccessKey Secret。

  • 项目名 (Project):访问的目标 MaxCompute 项目名称。

  • 表名 (Table):访问的目标 MaxCompute 表名。

  • 表数据分区 (Partition):MaxCompute 数据源必须设置分区键; 示例:ds=20170626。

  • 自动索引重建:是否开启自动索引重建任务,如果开启,则将在识别到当前数据源的变更时,自动对引用该数据源的索引表进行索引重建。

说明

开启自动索引重建,则必须创建 done 表,创建方式可参考 自动索引重建

3. 字段配置

向量检索版会根据选择的场景模板,预置相关字段,并将全量数据来源中的字段,自动导入字段列表中,下图是「 向量:图片搜索」 模板包含 4 个预置字段。

image.png

字段配置说明:

  • 预设字段 1.id(主键)、2.source_image(源图片)、3.namespace(命名空间)、4.source_image_vector(源图片向量)。

  • 必选字段:主键字段和向量字段,主键字段为 int string 类型并且需要勾选主键按钮,向量字段为 float 类型并且需要勾选向量字段按钮。

  • 向量字段默认为多值的 float 类型,控制台建表默认采用英文逗号切分,支持自定义多值分隔符。

  • 图片向量化的字段,需要在 需数据预处理 中勾选 去配置 ,对 source_image 预设字段 进行配置。

  • 使用向量检索,在定义字段时有位置要求,需要按照主键字段、命名空间字段(非必要)、向量字段的顺序创建(如上图所示)。

字段 source_image 数据预处理配置说明:

image.png

  • 数据来源:有 OSS 对象存储和 Base64 编码的两种数据类型选项。

    • OSS 对象存储:需要填写 OSS 路径,其实是将图片存储在 OSS 的文件夹里面,从 OSS 直接导入。

    • Base64 编码:相当于需要先将图片进行一次编码,然后存储在数据库中,或者直接用 API 方式进行传输。

  • 预处理模板:会根据要进行预处理的数据类型(文本或图片)而展示不同模板,由于字段的数据是图片类型,所以此时预处理模板展示的分别为(1.图片向量化、2.OCR 图片文字识别、3.OCR 图片文字识别+图片向量化)三种模板。

  • 服务列表:

    • 选定预处理模板后,自动出现模板下的服务列表,展示该模板下所用到的模型种类。

    • 可选的模型有两个来源:

      • 内置模型:模型种类与数量较少,可免费调用。

      • AI 搜索开放平台:模型能力丰富,需按调用量收费,计费详情参见 计费方式和计费项 ,在使用 AI 搜索开放平台 前完成工作空间和 API Key 开通。

      • 自定义模型:用户创建的自定义模型,可参考 自定义模型 进行创建。

    • AI 平台 OCR 图片文字识别/文本向量服务

      • OCR 图片文字识别:针对架构图、分析图表等图片数据,AI 搜索开放平台提供图片内容理解服务,可基于多模态大模型对图片内容进行解析理解以及文字识别,也可基于 OCR 能力对图片文字进行识别,将文字信息提取出来,用于图片检索及问答等场景。

      • 文本向量化:提供将文本数据转化为稠密向量形式表达的服务,支持多款不同语言、输入长度、输出维度的文本向量模型,可用于信息检索、文本分类、相似性比较等场景。

  • 生成字段:原始图片数据经过模型处理后,会被自动转化为其他格式,生成新的字段内容

    • embedding 处理类的服务,默认必须生成字段。

    • ocr 服务可选是否生成字段。

  • 接口调用配置:为了成功访问 AI 搜索开放平台,需要完成工作空间、API Key、连接域名的设置。 image.png

4. 索引结构

image.png

配置说明:

  • 向量索引名称与向量字段名称相同。

  • 包含字段为主键、向量字段、命名空间字段可选。

  • 高级配置可按需要填写,详情可参考 向量索引通用配置

5. 确认创建

点击确认创建,完成表的创建,在左侧导航栏 日志记录 变更历史 ,可以查看表的创建进度,当状态显示完成后,就可以进行查询测试的操作。

image.png

image.png

查询测试

1.控制台查询测试

在左侧导航栏选择 向量管理 > 查询测试 ,控制台的查询测试功能同时支持表单/开发者模式,控制台查询用法可以参考: 查询测试

1.1 表单模式

依次选择好 表单模式 > 表名 Query 类型 以图片类型为例(支持向量、文本、图片三种方式), 图片提供方式 选择上传图片文件,完成查询图片的上传后,点击搜索就可以在搜索结果栏中查看到结果。

image

1.2 开发者模式

依次选择好 开发者模式 > 表名 ,在下方的搜索框内输入查询参数,完成后点击搜索就可以在右侧的结果栏内看到查询结果。

image

字段说明

  • vector:具体要查询的向量

  • topK:取 top K 个结果

  • includeVector:是否返回文档中的向量信息

详细的查询语法可参考下方的语法说明。

2.SDK 查询

查询示例 :可参考 预测查询

结果展示

{
    "totalCount": 5,
    "result": [
            "id": 5,
            "score": 1.103209137916565
            "id": 3,
            "score": 1.1278988122940064
            "id": 2,
            "score": 1.1326735019683838
    "totalTime": 242.615
}

result 中记录着返回结果。

语法说明

SDK 中使用向量检索