在这篇文章中,将介绍怎么根据向量数据库,构建一个电商产品图片目录的向量类似度查询解决计划。咱们将经过 Amazon SageMaker、pgvector向量数据库扩展插件、小型言语模型助力 AI 图片查找才能,然后在产品目录中查找到最契合条件的产品,提高查询的准确性、效率性和便利性。该计划尤其适合笔直职业运用,可掩盖电商、游戏、短视频,甚至法令、医疗、制造业、人力资源等场景。

亚马逊云科技开发者社区为开发者们供给全球的开发技能资源。这儿有技能文档、开发事例、技能专栏、培训视频、活动与竞赛等。帮助我国开发者对接国际最前沿技能,观点,和项目,并将我国优秀开发者或技能引荐给全球云社区。如果你还没有关注/收藏,看到这儿请一定不要匆匆划过,点这儿让它成为你的技能宝库!

构建布景介绍

各行各业都在探究 AIGC 立异方法,期望经过运用生成式 AI 的巨大潜力,来增强用户体会,探究笔直职业的无限或许。

在游戏美术、电商产品规划、建筑/家装规划等职业,AIGC 正在彻底改变图片方向创造过程。经过大数据剖析用户喜爱和行为数据,人工智能算法能够生成共同的游戏场景和人物、服装样式和规划、家装内饰和风格,将个性化和本钱效益提升到一个新的水平。且经过图画辨认,对终究生成的图片进行审查,完结对成果的鉴黄鉴暴功用。

视频网站、短视频平台同样能够从 AI 才能中获益,尤其是在视频类似度查找和引荐方面,AI 算法能够剖析用户行为,并引荐与他们的爱好点密切相关的视频内容,然后提升用户的全体观感体会,然后添加用户粘性。此外,AI 驱动的图画和视频保管服务能够供给图画去重、图画类似度查找和文本与图画类似度查找等功用,然后完结查找精度和查找体会的全体改进。

生物信息职业也是 AI 运用探究的另一领域。在分子和 DNA 序列分类类似度查找的运用,使得 AI 在药物发现和药物研讨中发挥了关键作用,大大提升了药物研发的速度。无论是辨认潜在的候选药物还是 DNA 序列剖析,AI 都被证明是一种名贵的东西。

在这篇文章中,您将学习怎么构建一个类似的产品目录类似度查找解决计划。该计划首要集成 Amazon SageMaker 和亚马逊联系数据库服务(Amazon RDS)PostgreSQL,而 PostgreSQL 经过启用 pgvector 扩展插件完结了数据的向量存储才能。

Pgvector 作为 PostgreSQL 的开源扩展插件,它供给了 ML 生成式向量的存储和查找功用。还一起支撑精确辨认和近似最近邻算法辨认(KNN)。它的规划初衷就是用于与 PostgreSQL 的其他功用无缝集成,包含了索引和查询等。您甚至能够运用 pgvector 存储来自 Amazon Bedrock 的 ML 生成式向量分片(目前 Bedrock 还处于定量预览版阶段)。

综述,无论您属于哪个职业,无论是以上提到的电商、游戏、视频服务、生命科学,还是法令、医疗、制造业、人力资源等职业,这篇文章都将为您将来进行类似度查找供给有价值的见解。

Vector embeddings 概述

Embeddings(向量化表明/向量嵌入)是指将文本、图画、视频或音频等对象转换成高维向量空间中的数字表明的过程。该技能是经过运用机器学习算法完结,理解数据的意义和上下文的语义联系、句法联系。您能够将生成的 Embeddings 用于各种运用程序,例如信息检索、图画分类、自然言语处理等等。

Vector embeddings 之所以变得越来越受欢迎,是因为它们能够以易于计算和扩展的方法捕捉对象之间的语义意义和类似之处。下图直观地表明了 Word Embedding(词语向量化表明)的特征形状。

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划
图 1 Word Embedding:语义类似的单词在 Embedding 空间中靠得很近

生成 Embeddings 后,咱们能够在向量空间内履行类似度查找。根据 Embedding 的类似度查找能在许多职业的运用中获益,如电子商务、引荐体系和诈骗检测等。例如,体系能够辨认产品或交易之间的数学类似之处,以创立相关的产品引荐,或辨认潜在的诈骗活动。

运用 pgvector 完结高效的 Embedding 类似度查找

经过运用 pgvector 扩展插件,PostgreSQL 能够有效地履行 Vector Embeddings 的类似度查找,为企业供给快速查询的解决计划。

要为本文场景的产品目录生成 Embedding 向量化表明数据,您能够运用 Amazon SageMaker 等机器学习服务,为您轻松训练和布置机器学习模型,包含生成文本数据的 Embedding 模型。

在本文布置履行过程中,为了快速地呈现试验作用,咱们运用 Hugging Face DLCs(深度学习容器) 和 Amazon SageMaker Python SDK 来创立一个实时推理节点,运转 All MiniLM-L6-v2(语句转换器模型),生成文档的 embedding 数据。运用 pgvector 扩展插件将 Vector Embeddings 存储在 RDS for PostgreSQL 数据库中。然后,咱们运用 pgvector 的类似度查找功用,在产品目录中查找最契合客户查找查询目的的产品,并返回图片成果。

在上述过程中,pgvector 的索引功用将进一步增强查找优化。经过对向量数据进行索引,能够加速查找过程,并最大极限地削减辨认最近的邻域对象所需的时间。咱们深入研讨了 pgvector 插件怎么与 PostgreSQL 协同,为向量数据类似度查找供给了一种简化而有效的解决计划。

pgvector 扩展插件的装置与运用验证

pgvector 扩展插件的装置

首先,咱们创立并连接到 RDS for PostgreSQL V15.2 或以上版别的数据库。然后能够启用创立 pgvector 插件,并支撑您能够在数据库中发动 vector embbeding 的存储并根据需求进行查找(Amazon RDS for PostgreSQL 数据库自 15.2 版别起支撑 pgvector 扩展插件,用户能够经过 SQL 规范语句调用 pgvector 插件)。

CREATE EXTENSION vector;

pgvector 扩展插件引入了一种名为vector的新数据类型。vector数据类型在 SQL 语句中的运用如下:

SELECT typname FROM pg_type WHERE typname = 'vector';

您应该看到以下输出:

typname
---------
vector 
(1 row)

Pgvector 扩展插件的运用验证

本文试验中,咱们运用sentence-transformers/all-MiniLM-L6-v2模型来生成 vector embeddings 数据。它将语句和阶段映射到 384 维的密布向量空间,因而咱们在解决计划中运用它来表明向量巨细。

代码示范:创立一个用于存储三维向量的测试表,插入一些样本数据,运用欧几里德间隔(也称为 L2 间隔)进行查询,然后删除测试表:

CREATE TABLE test_embeddings(product_id bigint, embeddings vector(3) );
INSERT INTO test_embeddings VALUES
(1, '[1, 2, 3]'), (2, '[2, 3, 4]'), (3, '[7, 6, 8]'), (4, '[8, 6, 9]');
SELECT product_id, embeddings, embeddings <-> '[3,1,2]' AS distance 
FROM test_embeddings 
ORDER BY embeddings <-> '[3,1,2]';
DROP TABLE test_embeddings;

SELECT 语句应返回以下输出:

product_id | embeddings | distance
------------ ------------ -------------------
 1 | [1,2,3] | 2.449489742783178
 2 | [2,3,4] |                 3
 3 | [7,6,8] | 8.774964387392123
 4 | [8,6,9] |   9.9498743710662
(4 rows)

有关更多详细信息,请参阅GitHub repo

电商产品图片类似度查找计划

根据上述怎么运用 pgvector 构建向量类似度查找的演示,接下来开端运用 pgvector 为电商的产品目录,构建查找解决计划。咱们将构建一个查找体系,让买家经过描绘来查找类似的产品。

接下来将逐渐演示怎么履行产品类似度查询。咱们将在 SageMaker 实例上运用 Hugging Face 预训练的模型,为产品描绘生成 vector embeddings 数据;运用 Amazon RDS for PostgreSQL 并集成 pgvector 扩展插件,对咱们的 vector embeddings 数据进行存储和类似度查找。

计划过程

  1. Amazon SageMaker notebook实例中,创立 Jupyter notebook,由 SageMaker 负责管理创立实例和相关资源。
  1. 布置预先训练的Hugging Face sentence transformer model(语句转换器模型)到 SageMaker,以便下一步运用实时推理和数据转换,生成物品描绘的 embeddings 数据。
  1. 运用 Amazon SageMaker 实时推理为产品目录描绘生成 Embeddings 数据。
  1. 运用 Amazon RDS for PostgreSQL 来存储原始产品描绘和对应的文本 Embeddings。
  1. 运用 Amazon SageMaker 实时推理将需求查询的文本描绘也生成 Embedding 数据。
  1. 运用 Amazon RDS for PostgreSQL 的 pgvector 插件,履行类似度查找。

计划架构

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划

前置条件

若要完本钱 Demo,您需求具有一个亚马逊云科技账户,并具有相应的 Amazon IAM 权限,以发动供给的 Amazon CloudFormation 模板。此解决计划将产生一定本钱,请参阅亚马逊云科技定价页面了解更多信息。

解决计划布置

咱们将运用 CloudFormation Stack 来布置这个解决计划。该仓库会自动在您的账户内创立所有必要的资源,包含以下资源:

  • 网络组件,包含 VPC 、子网、路由,安全组等资源。
  • 一个 SageMaker Notebook 实例,用于在 Jupyter Notebook 中运转 Python 代码。
  • 与 Notebook 实例相关的 IAM 人物。
  • 一个 RDS for PostgreSQL 实例,用于存储和查询产品目录的 Embedding 数据。

解决计划布置开端,请完结以下过程:

  1. 运用您的 IAM 用户名和密码登录亚马逊云科技管理控制台
  1. 挑选 “发动仓库 Launch Stack”,并在新的浏览器标签页中翻开。

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划

  1. 挑选默认值,点击“Next”,鄙人一页选中复选框以确认 IAM 资源的创立,挑选“Create Stack”。
  1. 等待仓库创立完结,状况 CREATE_COMPLETE。您能够在 “Event” 选项卡上查看仓库创立过程中的状况。
  1. 在“Outputs”选项卡上,翻开 NotebookInstanceUrl。此链接将翻开 Jupyter Notebook,来完结剩下的部分。

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划

  1. 翻开笔记本 rdspg-vector.ipynb,然后按次序逐一在所有单元格中运转代码。

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划

在以下部分中,咱们将查看 Jupyter Notebook 中几个重要单元格的部分代码,以演示解决计划。

演示数据获取

咱们运用 Zalando ResearchFEIDEGGER数据,该数据由 8,732 张高分辨率的时髦图片和五张德语文字注释组成,每张都是由单独的用户生成的。咱们已经运用Amazon Translate将每条着装描绘从德语翻译成英语。代码如下所示:

import urllib.request
import os
import json
import boto3
from multiprocessing import cpu_count
from tqdm.contrib.concurrent import process_map
filename = 'metadata.json'
def download_metadata(url):
    if not os.path.exists(filename):
        urllib.request.urlretrieve(url, filename)
## The German text has been translated into English and the resulting translation has been stored in this repository for convenience.
download_metadata('https://raw.githubusercontent.com/aws-samples/rds-postgresql-pgvector/master/data/FEIDEGGER_release_1.2.json')
with open(filename) as json_file:
    results = json.load(json_file)
results[0]

SageMaker 模型保管与向量化表明数据生成

在本节中,咱们将预先训练的 Hugging Faceall-MiniLM-L6-v2语句转换器模型保管到 SageMaker 中,并为咱们的产品目录生成 384 维向量化表明数据(Embedding)。过程如下:

  1. 定义 SageMaker 的履行人物,作业 S3 桶和树立 SageMaker。
import sagemaker
import boto3
sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket=None
if sagemaker_session_bucket is None and sess is not None:
    # set to default bucket if a bucket name is not given
    sagemaker_session_bucket = sess.default_bucket()
try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client('iam')
    role = iam.get_role(RoleName='sagemaker_execution_role')['Role']['Arn']
sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)
print(f"sagemaker role arn: {role}")
print(f"sagemaker bucket: {sess.default_bucket()}")
print(f"sagemaker session region: {sess.boto_region_name}")
  1. 指定模型装备参数,布置模型推理节点。
from sagemaker.huggingface.model import HuggingFaceModel
# Hub Model configuration. <https://huggingface.co/models>
hub = {
  'HF_MODEL_ID': 'sentence-transformers/all-MiniLM-L6-v2',
  'HF_TASK': 'feature-extraction'
}
# Deploy Hugging Face Model 
predictor = HuggingFaceModel(
               env=hub, # configuration for loading model from Hub
               role=role, # iam role with permissions to create an Endpoint
               transformers_version='4.26',
               pytorch_version='1.13',
               py_version='py39',
            ).deploy(
               initial_instance_count=1,
               instance_type="ml.m5.xlarge",
               endpoint_name="rdspg-vector"
            )
print(f"Hugging Face Model has been deployed successfully to SageMaker")
  1. 调用 SageMaker 实时推理节点生成 Embeddings,成果将显示给定输入文本的 384 维向量的维度。
def cls_pooling(model_output):
    # first element of model_output contains all token embeddings
    return [sublist[0] for sublist in model_output][0] 
data = {
    "inputs": ' '.join(results[0].get('descriptions'))
} 
res = cls_pooling( predictor.predict(data=data) )
print(len(res))
  1. 运用 SageMaker 推理,为咱们的产品目录描绘生成 384 维的向量化表明数据(embedding)。
def generate_embeddings(data):
    r = {}
    r['url'] = data['url']
    r['descriptions'] = data['descriptions']
    r['split'] = data['split']
    inp = {'inputs' : ' '.join( data['descriptions'] ) }
    vector = cls_pooling( predictor.predict(inp) )
    r['descriptions_embeddings'] = vector
    return r
workers = 1 * cpu_count() 
chunksize = 32 
# generate embeddings   
data = process_map(generate_embeddings, results, max_workers=workers, chunksize=chunksize)

PostgreSQL 与 pgvetor 插件的存储与检索

  1. 连接到 RDS for PostgreSQL,运用向量数据类型创立产品表并提取数据。然后,为类似度查找创立索引,以查找最近的 L2 间隔邻域向量对象。
import psycopg2
from pgvector.psycopg2 import register_vector 
import boto3 
import json 
client = boto3.client('secretsmanager')
response = client.get_secret_value( SecretId='rdspg-vector-secret')
database_secrets = json.loads(response['SecretString'])
dbhost = database_secrets['host'] 
dbport = database_secrets['port'] 
dbuser = database_secrets['username'] 
dbpass = database_secrets['password']
dbconn = psycopg2.connect(host=dbhost, user=dbuser, password=dbpass, port=dbport, connect_timeout=10) 
dbconn.set_session(autocommit=True)
cur = dbconn.cursor()
cur.execute("CREATE EXTENSION IF NOT EXISTS vector;")
register_vector(dbconn)
cur.execute("DROP TABLE IF EXISTS products;")
cur.execute("""CREATE TABLE IF NOT EXISTS products(
  id bigserial primary key,
  description text,
  url text,
  split int,
  descriptions_embeddings vector(384)
);""")
for x in data:
    cur.execute("""INSERT INTO products (description, url, split, descriptions_embeddings)
      VALUES (%s, %s, %s, %s);""",
      (' '.join(x.get('descriptions', [])), x.get('url'), x.get('split'), x.get('descriptions_embeddings') ))
cur.execute("""CREATE INDEX ON products
  USING ivfflat (descriptions_embeddings vector_l2_ops) WITH (lists = 100);""")
cur.execute("VACUUM ANALYZE products;")
cur.close()
dbconn.close()
print ("Vector embeddings has been successfully loaded into PostgreSQL")
  1. 运用 pgvector 插件,在 RDS for PostgreSQL 履行产品图片的最类似图片查找。
import numpy as np
from skimage import io 
import matplotlib.pyplot as plt 
import requests 
data = {"inputs": "green sleeveless summer wear"} 
res1 = cls_pooling(predictor.predict(data=data)) 
client = boto3.client('secretsmanager')
response = client.get_secret_value( SecretId='rdspg-vector-secret' )
database_secrets = json.loads(response['SecretString'])
dbhost = database_secrets['host']
dbport = database_secrets['port']
dbuser = database_secrets['username']
dbpass = database_secrets['password']
dbconn = psycopg2.connect(host=dbhost, user=dbuser, password=dbpass, port=dbport, connect_timeout=10)
dbconn.set_session(autocommit=True)
cur = dbconn.cursor()
cur.execute("""SELECT id, url, description, descriptions_embeddings
  FROM products
  ORDER BY descriptions_embeddings <-> %s limit 3;""",
  (np.array(res1),))
r = cur.fetchall()
urls = []
plt.rcParams["figure.figsize"] = [7.50, 3.50]
plt.rcParams["figure.autolayout"] = True
for x in r:
    url = x[1].split('?')[0]
    urldata = requests.get(url).content
    print("Product Item Id: "   str(x[0]))
    a = io.imread(url)
    plt.imshow(a)
    plt.axis('off')
    plt.show()
cur.close()
dbconn.close()

大家能够修改查询用的描绘文本,或 Limit 参数,尝试不同图片成果和输出图片的数量。本文的查询文本:“green sleeveless summer wear”,Limit 参数 3,返回产品 ID(Product Item Id)分别为:2328、5117、479。

根据 PostgreSQL 构建 AI 电商产品图片类似度查找计划

现在,向量类似度查找功用已为您返回最接近的匹配成果。

计划资源整理

  1. 在 Jupyter notebook 单元中运转以下代码以删除模型和节点。
predictor.delete_model()
predictor.delete_endpoint()
  1. 在 CloudFormation stack 中,整理本 Demo 中创立的 Stack,整理剩下的资源。

结论

将 Amazon SageMaker,Amazon RDS for PostgreSQL 与 pgvector 开源扩展集成,配合小型言语模型(MiniLM),能够供给根据 Vector Embedding 的高精度 AI 图片智能数据检索。能够运用于电商产品目录的类似度查找,优化查询体会。经过运用机器学习模型和 Vector Embedding,企业能够提高类似度查找、个性化引荐和诈骗检测的准确性和速度,终究提高用户满意度和更个性化的体会。

Pgvector 的运用为大型多模态数据集(图片、文本)的查询供给了可扩展性,而且能够无缝集成 PostgreSQL 的存储功用。Amazon SageMaker 和 pgvector 的组合可在动态和数据驱动国际中获得更好的运用作用。

跟着作业负载的持续发展,PostgreSQL 在向量数据库方向的可扩展性,使开发人员能够在笔直职业构建新的数据类型和索引机制。跟着 AI/ML 立异的不断涌现,您未来能够在查询终端集成LLM(大言语模型),进一步构成用户友爱的智能查询 ChatBot,构建新的企业级智能化运用程序。

附录

1、有关本文中运用的代码示例的更多信息,请参阅GitHub repo

2、本文是在亚马逊云科技原有的英文 Blog 的基础上,进行更新和调整。原文作者为 Krishna Sarabu,原文链接:aws.amazon.com/cn/blogs/da…

参考资料

huggingface.co/sentence-tr…

docs.aws.amazon.com/zh_cn/Amazo…

aws.amazon.com/cn/about-aw…

docs.aws.amazon.com/zh_cn/sagem…

文章来历:
dev.amazoncloud.cn/column/arti…