PolarDB-PG AI最佳实践3 :PolarDB AI多模态相似性搜索最佳实践

本文涉及的产品
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
简介: 本文介绍了如何利用PolarDB结合多模态大模型(如CLIP)实现数据库内的多模态数据分析和查询。通过POLAR_AI插件,可以直接在数据库中调用AI模型服务,无需移动数据或额外的工具,简化了多模态数据的处理流程。具体应用场景包括图像识别与分类、图像到文本检索和基于文本的图像检索。文章详细说明了技术实现、配置建议、实战步骤及多模态检索示例,展示了如何在PolarDB中创建模型、生成embedding并进行相似性检索

业务场景

在很多业务场景中,时时刻刻在产生多模态数据,如图像、音频、视频等。这些数据通常以文件的方式存在对象存储上,如何在数据库内部对这些多模态的数据进行统一的分析和查询,一直是一个热门的问题。

多模态大模型(Multimodal Large Language Models, MLLMs)是人工智能领域的前沿技术,它们结合了多种数据模态(如文本、图像等),通过大规模预训练,实现了对复杂信息的深度理解和高效处理。这些模型不仅扩展了传统语言模型的边界,更在视觉问答、图像字幕生成、语音识别等领域展现出了强大的应用潜力。

数据库结合多模态大模型的能力,实现在数据库中对于多模态数据的查询和分析,一些可能的场景包括:

  • 图像识别与分类:根据特定的图像,识别出图片中的对象。比如用户上传了一些餐食的图片,识别出这些图片中包含了哪些食物,并计算出所有食物的卡路里。

  • 图像到文本检索:也就是根据给定的图像,从一堆文字中找出最匹配的描述。这种技术在搜索商品图片时特别有用,可以从图片中找出相关的商品评论。
  • 基于文本的图像检索(图像搜索):根据用户详细描述的文本,检索出与文本最相近的图片。这不仅对于用户检索商品图片很有用,对于企业内部查找文档和图片也同样重要。

最佳实践

技术实现

PolarDB

PolarDB PostgreSQL版(下文简称为 PolarDB)是一款阿里云自主研发的云原生关系型数据库产品,100% 兼容 PostgreSQL,高度兼容Oracle语法;采用基于 Shared-Storage 的存储计算分离架构,具有极致弹性、毫秒级延迟、HTAP 的能力和高可靠、高可用、弹性扩展等企业级数据库特性。同时,PolarDB 具有大规模并行计算能力,可以应对OLTP与OLAP混合负载。

PolarDB具备POLAR_AI模型服务调用插件,支持使用SQL的方式调用模型服务,不需要拥有机器学习经验,不需要拷贝移动数据,不需要学习新的单独的工具,就可以将AI/ML的能力添加到数据库中。

PolarDB从底层直接调用模型服务,不经过应用程序层,因此访问延迟低、性能优、吞吐大、安全高,也不会影响到数据库的性能。

Embedding

中文可译为嵌入或嵌入式表示,是机器学习和自然语言处理领域中的一个重要概念。它是指将高维、稀疏的特征向量(如词典中的词语、图像像素点等)转换为低维、密集的连续向量空间中的向量表示的过程。

CLIP

CLIP是OpenAI在2021年发布的一种用于图像和文本联合表示的AI模型。其核心思想是通过对比学习来预训练一个模型,使其能够理解图像和文本之间的关系。CLIP使用大规模的图像-文本对数据集进行预训练,例如从互联网上收集的4亿个图像-文本对,这些数据集包含了丰富的图像和对应的描述文本,使得模型能够学习到广泛的视觉概念和语言表达。

CLIP通过对比学习来训练模型。具体来说,对于一个批次中的每个图像-文本对,模型会计算图像和文本的特征向量,并使用对比损失函数来优化模型参数。对比损失函数的目标是使得匹配的图像-文本对的特征向量尽可能接近,而不匹配的图像-文本对的特征向量尽可能远离。

查询流程

主要的查询步骤包含以下步骤:

  1. 客户端将AI相关的SQL发送给PolarDB
  2. PolarDB从OSS中获取要查询的图片数据,进行重采样和编码操作
  3. PolarDB把编码后的数据发送给CLIP模型服务
  4. CLIP模型服务进行推理后,将结果进行返回
  5. PolarDB将从服务获取的结果转换为数据库类型,并返回给客户端

建议配置

为了得到良好的体验,建议使用以下配置:

项目

推荐配置

PolarDB 版本

标准版 兼容PostgreSQL 14

CPU

>16 Core

内存

>64 GB

磁盘

>100GB (AUTOPL)

版本

>=14.13.28.0(20241230发布)

实战步骤

本文以自动驾驶的图片数据为例,介绍如何使用POLAR AI的能力进行多模态相似性的检索(文搜图,图搜图)。

自动驾驶数据使用的是加州大学伯克利分校发布的 BDD100K 数据集,数据可从此处下载 。

部署CLIP模型服务

CLIP模型以及衍生模型服务由多种方式进行部署,本教程为了简便起见采用了 CLIP-as-service作为CLIP模型服务。CLIP-as-service 支持多种部署形态,多种CLIP模型以及提供HTTP,gPRC等访问协议。

CLIP-as-service部署非常简单:

pip install clip-client
python -m clip_server

即可启动模型服务。

注意:

  1. Polar AI需要使用HTTP接口,因此需要允许HTTP请求,配置参见YAML config章节
  2. CLIP-as-service支持多种CLIP模型,运行环境以及输出的向量维度不相同,配置参见Model support 章节

部署完成后可通过

curl -X POST http://0.0.0.0:51000/post \ 
     -H 'Content-Type: application/json' \
     -d '{"data":[{"text": "First do it"}]}'

来对http服务进行测试。

文档可知,CLIP-as-service的请求数据格式分为两种,文本类型为:

{"data":[{"text": "First do it"}]}

图片类型支持base64编码的图片以及基于uri的访问模式:

{"data":[ {"blob":"base64_string" }]}
{"data":[ {"uri":"https://clip-as-servie/static/test.jpg" }]}

其中图片类型需要转为base64编码且不带mime类型信息。

返回的结果格式为:

{"header":{"requestId":"8b1f4b419bc54e95abxxxxxxx","status":null,"execEndpoint":"/","targetExecutor":""},"parameters":null,"routes":[{"executor":"gateway","startTime":"2022-04-01T15:24:28.267003+00:00","endTime":"2022-04-01T15:24:28.328868+00:00","status":null},{"executor":"clip_t","startTime":"2022-04-01T15:24:28.267189+00:00","endTime":"2022-04-01T15:24:28.328748+00:00","status":null}],"data":[{"id":"b15331b8281ffde1e9f...","parent_id":null,"granularity":null,"adjacency":null,"blob":null,"tensor":null,"mime_type":"text/plain","text":"hello, world!","weight":null,"uri":null,"tags":null,"offset":null,"location":null,"embedding":[-0.022064208984375,0.1044921875, ..., -0.1363525390625,-0.447509765625],"modality":null,"evaluations":null,"scores":null,"chunks":null,"matches":null}]}

embedding包含在 embedding 这个键值中。

数据库准备

创建扩展

创建POLAR_AI扩展

CREATE EXTENSION POLAR_AI WITH SCHEMA PUBLIC;
set search_path="$user", public,polar_ai;

创建模型

一个自定义的模型包含输入,输出以及用户使用的三个函数

输入函数

根据文档,可以定义出相应的输入和输出函数:

  • 文本类型的多模态embedding
-- 此处输入一个文本串
CREATE OR REPLACE FUNCTION clip_text_embedding_in(model text, setence text)
    RETURNS jsonb
    LANGUAGE plpgsql
    AS $function$
    BEGIN
    RETURN ('{"data": [{"text": "' ||setence || '"}]}')::jsonb;
    END;
    $function$;
  • 图像类型的多模态embedding

函数涉及到以下三个函数

  • ai_loadfile 从OSS上读取一个文件,以bytea的方式进行返回
  • ai_resizeimage 将图片从采样为指定的大小
  • ai_imageasbase64 将图片进行base64编码,返回出编码串

此处输入的参数为一个存储在oss上的图像文件路径,数据库首先会从oss上读取该文件;由于原始的图片分辨率较高,而模型最终需要转换为336*336的分辨率,因此将原始图像转换为336*336分辨率后降低数据传输量,提升推理性能;最后把重采样后的图片转为base64编码。

-- 图片类型
CREATE OR REPLACE FUNCTION clip_image_embedding_in(model text, image_path text)
    RETURNS jsonb
    LANGUAGE plpgsql
    AS $function$
    DECLARE 
     url text;
    BEGIN
      url = 'oss://<ak>:<sk>@<endpoint-internal>/<bucket>/' || $2;
    RETURN ('{"data": [{"blob": "' || ai_imageasbase64(ai_resizeimage(ai_loadfile(url), 336, 336), false)|| '"}]}')::jsonb;
    END;
    $function$;
输出函数

输出函数对于文本和图片类型一致,从返回的结果中提取embedding

CREATE OR REPLACE FUNCTION clip_embedding_out(model_id text, response_json jsonb)
    RETURNS jsonb
    AS $$ select (((((response_json)->>'data')::jsonb->0)::jsonb)->>'embedding')::jsonb as result $$
    LANGUAGE 'sql' IMMUTABLE;
创建模型

创建一个自定义的模型,分别定义文本和图片的embedding模型

-- 文本模式
SELECT polar_ai.ai_createmodel('embedding/clip_text', --模型id
'http://10.10.1.x:51000/post', --访问地址
'other', -- 模型提供商
'embedding', -- 模型类别
'clip', -- 模型名称
'{"author_type": "token", "token": "my_token"}', --认证信息
NULL, -- header函数
'clip_text_embedding_in'::regproc, -- 输入函数
'clip_embedding_out'::regproc --输出函数); 
-- 图片模式
SELECT polar_ai.ai_createmodel('embedding/clip_image', --模型id
'http://10.10.1.x:51000/post',--访问地址
'other',-- 模型提供商
'embedding',-- 模型类别
'clip',-- 模型名称
'{"author_type": "token", "token": "my_token"}', --认证信息
NULL,-- header函数
'clip_image_embedding_in'::regproc,-- 输入函数
'clip_embedding_out'::regproc --输出函数);

注意:url地址与token需要替换为clip-as-service部署时记录的信息

创建用户函数

创建用户使用的函数,分别定义文本和图片两种类型的函数。其中图片类型的函数输入为oss的路径地址。

-- 输入文本生成embedding
CREATE OR REPLACE FUNCTION clip_text_embedding(text text)
    RETURNS float4[]
    AS $$ select array(select json_array_elements_text(polar_ai.AI_CALLMODEL('embedding/clip_text',$1)::json))::float4[] as result $$
    LANGUAGE 'sql' IMMUTABLE;
-- 输入图片路径生成embedding
CREATE OR REPLACE FUNCTION clip_image_embedding(text text)
    RETURNS float4[]
    AS $$ select array(select json_array_elements_text(ganos_ai.AI_CALLMODEL('embedding/clip_image',$1)::json))::float4[] as result $$
    LANGUAGE 'sql' IMMUTABLE;

函数返回的结果是基于float4数组的embedding。

数据准备

数据上传

使用oss工具将BDD100K数据解压后进行上传,图片放置到统一目录下。

数据库建表

创建如下表结构用于保存文件路径以及对应embedding

CREATE TABLE images(id serial, 
url text,  -- 图片路径
embedding vector(512),  -- 图片向量
);

其中url记录了图像的相对路径,如

test_data/bdd100k/images/10k/train/0004a4c0-d4dff0ad.jpg

数据写入

根据数据的目录结构向数据库中插入数据,如:

INSERT INTO images(url)
VALUES ('test_data/bdd100k/images/10k/train/0004a4c0-d4dff0ad.jpg');

创建embedding

路径插入完成后,可以使用前一步创建的图片向量生成函数进行图片embedding的创建:

UPDATE images
SET embedding=clip_image_embedding(url)::vector(512);

创建索引

图片embedding创建完成后,可对embedding进行索引创建,加速后续的查询

CREATE INDEX ON images USING hnsw (embedding vector_l2_ops);

对于向量索引的更多用法参见PGVector

多模态检索

当完成以上准备工作后,就能进行以下的检索查询:

文搜图

使用一段文本,检索与该文本最相近的图片。

例如:使用关键词 `white truck in a snow day`,找出包含以上关键词最相关的10张图片

SELECT id, url
FROM images
ORDER BY embedding <-> clip_text_embedding('white truck in a snow day')::vector(512) DESC
limit 10;

使用附录中的notebook可以预览效果,:

检索还可以结合其他的条件过滤,使用的方法与普通的SQL条件查询一致,可以与b树,全文检索,时空等多模态检索进行组合。

例如:使用关键词 `black car in the night`,找出id > 1000 中包含以上关键词最相关的10张图片

SELECT id, url
FROM images
WHERE id > 1000
ORDER BY embedding <-> clip_text_embedding('black car in the night')::vector(512) DESC
limit 10;

图搜图

给定一张图片,检索与该图片在语义上最类似的图片。

例如:找出与id = 5560 图片语义上最相似的10张图片

SELECT id, url
FROM images
ORDER BY embedding <-> (
  SELECT clip_image_embedding(url)::vector(512)::vector(512) FROM images WHERE id = 5560) DESC 
limit 10;

注意:CLIP从本质上搭建的文本和图片之间的关系,用图片检索图片效果不一定最佳。如有以图搜图的需求,可使用 RESNETVGG模型,除了模型部署的步骤,其他操作流程与本文一致。

总结

PolarDB POLAR_AI模型服务具备灵活的特性,通过调用CLIP多模态模型服务,定制SQL实现多模态数据的embedding生成和相似性检索功能。使用时仅使用简单的SQL语句,不需要专业的AI/ML背景,不需要移动数据,就满足文搜图和图搜图的业务需求。

试用体验

欢迎访问PolarDB免费试用页面,选择试用“云原生数据库PolarDB PostgreSQL版”,体验PolarDB的AI能力

附录

图片预览代码

import psycopg
import io
from PIL import Image
import matplotlib.pyplot as plt
def connect():
    try:
        conn = psycopg2.connect(
            dbname="dbname",  # 数据库名
            host="localhost", # 数据库地址,如果是本地就是'localhost'
            port="5432"       # 数据库端口,默认是5432
        )
      
    except (Exception, psycopg2.Error) as error:
        print("连接到PostgreSQL数据库时发生错误: ", error)
    return conn
def exec_sql(sql):
    connection = connect()
    
    try:
        # 创建游标对象,用来执行SQL命令
        cursor = connection.cursor()
    
        cursor.execute(sql)
        rows = cursor.fetchall();
        image = None
        for row in rows:
            print(str(row[0]) + ":" +row[2])
            image = Image.open(io.BytesIO(row[1]))
            plt.imshow(image)
            plt.axis('off')
            plt.show()
        cursor.close()              
    except (Exception, psycopg2.Error) as error:
        print(error)
        cursor.close()
    connection.close()
'''
my_loadfile函数需要预先在数据库内创建,用于从oss上读取文件并缩放大小到512便于显示
CREATE OR REPLACE FUNCTION my_loadfile(text)
    RETURNS bytea
    AS $$ SELECT AI_RESIZEIMAGE(AI_LOADFILE('OSS://<ak>:<sk>@<endpoint-internal>/<bucket>/' || $1), 512, 0 )$$
    LANGUAGE 'sql' IMMUTABLE;
'''
## 文搜图
sql = "SELECT id, my_loadfile(url),url \
FROM images \
WHERE url 
ORDER BY embedding <-> clip_text_embedding('white truck in a snow day')::vector(512) \
limit 5"
exec_sql(sql)

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
2天前
|
SQL 人工智能 关系型数据库
PolarDB-PG AI最佳实践 2 :PolarDB AI X EAS实现自定义库内模型推理最佳实践
PolarDB通过POLAR_AI插件支持使用SQL调用AI/ML模型,无需专业AI知识或额外部署环境。结合阿里云EAS在线模型服务,可轻松部署自定义模型,在SQL中实现如文本翻译等功能。
|
2天前
|
存储 数据采集 算法
构建AI数据管道:从数据到洞察的高效之旅最佳实践
本文探讨了大模型从数据处理、模型训练到推理的全流程解决方案,特别强调数据、算法和算力三大要素。在数据处理方面,介绍了多模态数据的高效清洗与存储优化;模型训练中,重点解决了大规模数据集和CheckPoint的高效管理;推理部分则通过P2P分布式加载等技术提升效率。案例展示了如何在云平台上实现高性能、低成本的数据处理与模型训练,确保业务场景下的最优表现。
|
1天前
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案。
|
机器学习/深度学习 人工智能 算法
让机器读懂视频:亿级淘宝视频背后的多模态AI算法揭秘 | 开发者必读(142期)
在移动互联网行业整体增速放缓的大背景下,短视频行业异军突起,成为“行业黑洞”抢夺用户时间,尽管移动互联网人口红利见顶,新的增长点难以寻觅,但中国短视频人均使用时长及头部短视频平台日均活跃用户均持续增常,在淘宝,短视频业务一直以来都是非常重要的业务,让我们一起揭秘亿级淘宝视频背后的多模态AI算法…
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
92 10
|
7天前
|
机器学习/深度学习 人工智能 自动驾驶
企业内训|AI大模型在汽车行业的前沿应用研修-某汽车集团
本课程是TsingtaoAI为某汽车集团高级项目经理设计研发,课程全面系统地解析AI的发展历程、技术基础及其在汽车行业的深度应用。通过深入浅出的理论讲解、丰富的行业案例分析以及实战项目训练,学员将全面掌握机器学习、深度学习、NLP与CV等核心技术,了解自动驾驶、智能制造、车联网与智能营销等关键应用场景,洞悉AI技术对企业战略布局的深远影响。
136 97
|
12天前
|
机器学习/深度学习 人工智能 物联网
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
12月14日,由中国软件行业校园招聘与实习公共服务平台携手魔搭社区共同举办的AI赋能大学计划·大模型技术与产业趋势高校行AIGC项目实战营·湖南大学站圆满结营。
AI赋能大学计划·大模型技术与应用实战学生训练营——湖南大学站圆满结营
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
CogAgent-9B 是智谱AI基于 GLM-4V-9B 训练的专用Agent任务模型,支持高分辨率图像处理和双语交互,能够预测并执行GUI操作,广泛应用于自动化任务。
39 12
CogAgent-9B:智谱 AI 开源 GLM-PC 的基座模型,专注于预测和执行 GUI 操作,可应用于自动化交互任务
|
11天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
199 0
|
19天前
|
机器学习/深度学习 人工智能 算法
探索AI在医疗诊断中的应用与挑战
【10月更文挑战第21天】 本文深入探讨了人工智能(AI)技术在医疗诊断领域的应用现状与面临的挑战,旨在为读者提供一个全面的视角,了解AI如何改变传统医疗模式,以及这一变革过程中所伴随的技术、伦理和法律问题。通过分析AI技术的优势和局限性,本文旨在促进对AI在医疗领域应用的更深层次理解和讨论。
106 31

热门文章

最新文章

相关产品

  • 云原生数据库 PolarDB