使用 AlloyDB 和无服务器运行时构建 AI 赋能的服装搭配推荐应用

使用 AlloyDB 和无服务器运行时构建 AI 赋能的服装搭配推荐应用

关于此 Codelab

subject上次更新时间:3月 28, 2025
account_circleAbirami Sukumaran, Shweta Shetye 编写

1. 概览

想象一下,一款时尚应用不仅能帮助您找到理想的服装,还能提供实时造型建议,这一切都得益于强大的先进 genAI 集成技术!在本演讲中,我们将探讨如何使用 AlloyDB 的向量搜索功能以及 Google 的 ScaNN 索引构建这样一款应用,从而能够极速搜索相配的服装并提供即时时尚建议。

我们还将深入探讨 AlloyDB 的 ScaNN 索引如何优化复杂查询以生成个性化的样式建议。我们还将使用强大的生成式 AI 模型 Gemini 和 Imagen,提供富有创意的造型灵感,甚至可直观呈现您的个性化造型。整个应用都是基于无服务器架构构建的,可确保为用户提供顺畅且可扩缩的体验。

问题:该应用旨在通过提供个性化的服装搭配建议,帮助那些在时尚方面举棋不定的人。这还有助于避免因服装搭配而产生决策疲劳。

解决方案:服装搭配推荐应用解决了为用户提供智能、个性化且富有吸引力的时尚体验的问题,同时展示了 AlloyDB、生成式 AI 和无服务器技术的强大功能。

在本实验中,您将执行以下操作:

  1. 创建 AlloyDB 实例并加载电子商务数据集
  2. 在 AlloyDB 中启用 pgvector 和生成式 AI 模型扩展程序
  3. 根据商品说明生成嵌入
  4. 在无服务器 Cloud Run Functions 中部署解决方案
  5. 将图片上传到 Gemini,然后生成图片描述提示。
  6. 根据问题和电子商务数据集嵌入生成搜索结果。
  7. 添加其他提示以自定义提示并生成样式建议。
  8. 在无服务器 Cloud Run Functions 中部署解决方案

要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目。

2. 架构

该应用的概要架构如下所示:

ce32f865dfe59142.png

以下部分重点介绍了本教程的上下文流程:

提取

第一步是将零售数据(目录、商品说明、客户互动)提取到 AlloyDB。

分析引擎

我们将使用 AlloyDB 作为分析引擎来执行以下操作:

  1. 上下文提取:该引擎会分析 AlloyDB 中存储的数据,以了解产品、类别、客户行为等之间的关系(如适用)。
  2. 嵌入创建:为用户的查询和 AlloyDB 中存储的信息生成嵌入(文本的数学表示法)。
  3. Vector Search:该引擎会执行相似性搜索,将查询嵌入与产品说明、评价和其他相关数据的嵌入进行比较。这会确定 25 个最相关的“最近邻”。

Gemini 建议

图片字节数组会通过 Vertex AI API 传递给 Gemini 模型,同时传递一个提示,要求用户对上衣进行文字描述,并提供下衣推荐建议。

AlloyDB RAG 和矢量搜索

上衣的说明用于查询数据库。该查询会将搜索文本(Gemini 模型针对匹配的下装推荐)转换为嵌入,并对存储在数据库中的嵌入执行向量搜索,以查找最近邻(匹配结果)。AlloyDB 数据库中的向量嵌入使用 ScaNN 索引编入索引,以提高检索率。

回答图片生成

经过验证的响应会被构建为 JSON 数组,整个引擎会打包到从 Agent Builder 调用的无服务器 Cloud Run 函数中。

Imagen 图片生成

用户的样式提示、用户选择的推荐内容和任何个性化请求会组合起来,以提示 Imagen 3 使用现有图片。系统会使用 Vertex AI API 根据此提示生成样式图片。

3. 准备工作

创建项目

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq。点击 Google Cloud 控制台顶部的激活 Cloud Shell ( f2ae85166a716c5c.png)。
  4. 连接到 Cloud Shell 后,使用以下命令验证您是否已通过身份验证,以及项目是否已设置为您的项目 ID:
gcloud auth list
  1. 运行以下命令,确认日后 gcloud 命令将正确识别您的项目。
gcloud config list project
  1. 如果项目未设置,请使用以下命令进行显式设置:
gcloud config set project <YOUR_PROJECT_ID>
  1. 启用所需的 API。

点击此链接启用 API。

如果您错过了启用任何 API,可以在实现过程中随时启用。

如需详细了解 gcloud 命令和用法,请参阅文档

4. 数据库设置

在本实验中,我们将使用 AlloyDB 作为数据库来存储零售电子商务数据集。它使用集群来存储所有资源,例如数据库和日志。每个集群都有一个主实例,用于提供对数据的访问点。表是存储数据的实际资源。

我们来创建一个 AlloyDB 集群、实例和表,以便加载电子商务数据集。

创建集群和实例

  1. 在 Google Cloud 控制台中,搜索 AlloyDB。在 Cloud 控制台中查找大多数页面时,最简单的方法是使用控制台的搜索栏进行搜索。
  2. 点击创建集群

f76ff480c8c889aa.png

  1. 使用以下值创建集群和实例
  • 集群 ID:“shopping-cluster
  • 密码:“alloydb
  • 与 PostgreSQL 15 兼容
  • 地区:“us-central1
  • 网络:“default

538dba58908162fb.png

  1. 在“网络”中,选择默认网络后,系统会显示以下选项。点击设置连接以设置默认网络。
    7939bbb6802a91bf.png
  2. 选择使用自动分配的 IP 范围,然后点击继续。查看信息后,点击创建关联768ff5210e79676f.png

等待默认网络创建完成。

  1. 在“配置主实例”中,将实例 ID 设置为“shopping-instance"”。

2bddecf6b7c7407b.png

  1. 点击创建集群,按如下所示完成集群设置:

24eec29fa5cfdb3e.png

5. 数据注入

现在,是时候添加一个包含商店数据的表格了。等待实例创建完成。创建集群后,您可以使用创建集群时设置的凭据登录 AlloyDB。

向 AlloyDB 数据库进行身份验证

  1. 在 Google Cloud 控制台中,前往 AlloyDB。选择主集群,然后点击左侧导航栏中的 AlloyDB Studio

847e35f1bf8a8bd8.png

  1. 输入以下详细信息以对 AlloyDB 数据库进行身份验证:
  • 用户名:“postgres
  • 数据库:“postgres
  • 密码:“alloydb

成功通过身份验证登录 AlloyDB Studio 后,您可以在 Editor 标签页中输入 SQL 命令。您可以使用第一个“Editor”标签页右侧的加号添加多个“Editor”窗口。

91a86d9469d499c4.png

您将在“Editor”窗口中输入 AlloyDB 命令,并根据需要使用“Run”“Format”和“Clear”选项。

启用扩展程序

如需构建此应用,我们将使用“pgvector"”和“google_ml_integration"”扩展程序。

  • 借助 pgvector 扩展,您可以存储和搜索向量嵌入。
  • google_ml_integration 扩展程序提供了一些函数,可用于访问 Vertex AI 预测端点,以便在 SQL 中获取预测结果。
  1. 通过运行以下 DDL 启用这些扩展程序:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector
;
  1. 运行以下 SQL 命令,验证扩展程序是否已安装:
select extname, extversion from pg_extension;

创建表

  1. 使用以下 DDL 语句创建表:
CREATE TABLE
 apparels
( id BIGINT,
   category VARCHAR
(100),
   sub_category VARCHAR
(50),
   uri VARCHAR
(200),
   image VARCHAR
(100),
   content VARCHAR
(2000),
   pdt_desc VARCHAR
(5000),
   embedding vector
(768) );

成功执行上述命令后,您应该能够在

十个地址。下图显示了一个示例:

908e33bbff58a6d.png

注入数据

在本实验中,我们在此 SQL 文件中提供了约 200 条记录的测试数据。其中包含 id, category, sub_category, uri, imagecontent。我们将在稍后的实验中填写其他字段。

  1. 将 SQL 文件中的 20 行/insert 语句复制到 AlloyDB Studio 中新建的“Editor”标签页中,然后点击 RUN
  1. 展开“Explorer”部分,直到看到名为 apparels 的表。
  2. 点击菜单图标 [],然后点击查询。系统会在新建的“编辑器”标签页中打开一个 SELECT 语句。

b31ece70e670ab89.png

  1. 点击运行以验证是否已插入行。

向用户授予权限

我们将向 postgres 用户授予在 AlloyDB 中生成嵌入的权限.在 AlloyDB Studio 中,运行以下语句可向用户 postgres 授予对 embedding 函数的执行权限:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

向 AlloyDB 服务账号授予 Vertex AI User 角色

我们将使用 Vertex AI 中的文本嵌入模型为 AlloyDB 服务账号生成嵌入,并为该账号授予 Vertex AI User 角色。

在 Google Cloud 控制台中,点击 Cloud Shell 终端 [f2ae85166a716c5c.png] 图标,然后运行以下命令:

PROJECT_ID=$(gcloud config get-value project)

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")@gcp-sa-alloydb.iam.gserviceaccount.com" \
--role="roles/aiplatform.user"

6. 构建上下文

如需创建嵌入,我们需要有一个 context,即我们要包含在单个字段中的所有信息。为此,我们将创建一个商品说明,并将其存储在 apparels 表的 pdt_desc 列中。

在我们的示例中,我们将使用每件商品的所有信息,但当您使用自己的数据执行此操作时,可以随意按照对您的业务有意义的方式对数据进行工程处理。

在 AlloyDB Studio 的“Editor”标签页中,运行以下命令,使用上下文数据更新 pdt_desc 字段:

UPDATE
 apparels
SET
 pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
 id IS NOT NULL;

此 DML 会使用表中所有可用字段以及其他依赖项(如果您的用例中有)中的信息创建一个简单的情境摘要。为了更精确地分类信息和创建情境,您可以随意以对您的业务有意义的方式对数据进行工程化处理。

7. 为上下文创建嵌入

计算机处理数字比处理文本要容易得多。嵌入系统会将文本转换为一组浮点数,这些浮点数应能代表文本,无论文本的措辞、所用语言等如何。

不妨考虑描述海边地点。它可以称为“"on the water”“beachfront”“walk from your room to the ocean”“sur la mer”“на берегу океана”等。这些术语看起来各不相同,但它们的语义含义(或用机器学习术语来说,它们的嵌入)应该非常接近。

现在,数据和上下文已准备就绪,我们将运行 SQL 查询,将商品说明(pdt_desc) 列的嵌入添加到表中的 embedding 字段。您可以使用多种嵌入模型。我们将使用 Vertex AI 中的 text-embedding-005

  1. 在 AlloyDB Studio 中,运行以下命令以生成嵌入,并使用 pdt_desc 列中存储的数据的嵌入更新 pdt_desc 列:
UPDATE
 apparels
SET
 embedding
= embedding( 'text-embedding-005',
   pdt_desc
)
WHERE
 TRUE
;
  1. 运行以下命令,验证是否已生成嵌入:
SELECT
 id
,
 category
,
 sub_category
,
 content
,
 embedding
FROM
 
Apparels
LIMIT
5;

以下是查询中示例文本的嵌入向量示例,该向量看起来像一个浮点数数组,如下所示:

c69c08d085389f74.png

8. 执行矢量搜索

现在,表格、数据和嵌入都已准备就绪,接下来我们将针对用户搜索文本执行实时向量搜索。

假设用户的搜索文本为“pink color, casual, pure cotton tops for women

如需查找与此查询匹配的记录,请运行以下 SQL 查询:

SELECT
id
,
category
,
sub_category
,
content
,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding
<=> embedding('text-embedding-005',
 
'pink color, casual, pure cotton tops for women')::vector
LIMIT
5;

我们来详细看看这个查询:

在此查询中,

  1. 用户的搜索文本为:“I want womens tops, pink casual only pure cotton.
  2. 我们将使用 embedding() 方法和模型 text-embedding-005 将此搜索文本转换为嵌入。与上一步(我们将嵌入函数应用于表格中的所有项)相比,此步骤应该会显得熟悉。
  3. <=>”表示使用余弦相似度距离方法。您可以在 pgvector 文档中找到所有可用相似度衡量方法。
  4. 我们将嵌入方法的结果转换为向量数据类型,以使其与存储在数据库中的向量兼容。
  5. LIMIT 5 表示我们要提取搜索文本的 5 个最近邻。

以下是此 SQL 查询的示例响应:

4193a68737400535.png

如您在结果中所见,匹配项与搜索文本非常接近。尝试更改颜色,看看结果如何变化。

用于提升查询性能的 AlloyDB ScaNN 索引

现在,假设我们想使用 ScaNN 索引提高此向量搜索结果的性能(查询时间)、效率和召回率。

如果您想使用 ScaNN 索引,请尝试按以下步骤操作:

  1. 由于我们已经创建了集群、实例、上下文和嵌入,因此只需使用以下语句安装 ScaNN 扩展程序即可:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. 创建 ScaNN 索引:
CREATE INDEX apparel_index ON apparels
USING scann
(embedding cosine)
WITH
(num_leaves=54);

在上述 DDL 中:

  • apparel_index 是索引的名称。
  • apparels 是表名称。
  • scann 是索引方法。
  • embedding 是您要编制索引的表中的列。
  • cosine 是您要与索引搭配使用的距离方法。
  • 54 是将应用于此索引的分区数量。设置为 1 到 1048576 之间的任意值。如需详细了解如何确定此值,请参阅调整 ScaNN 索引

根据 ScaNN 代码库中的建议,我们使用了数据点数量的平方根。进行分区时,num_leaves 应大致为数据点数量的平方根。

  1. 使用以下查询检查是否已创建索引:
SELECT * FROM pg_stat_ann_indexes;
  1. 使用我们在未使用索引时使用的相同查询执行 Vector Search:
select * from apparels
   ORDER BY embedding
<=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
   LIMIT
20

上述查询与我们在实验的第 8 步中使用的查询相同。不过,现在我们使用 ScaNN 索引为该字段编入了索引。

  1. 使用有索引和无索引的简单搜索查询进行测试。如需在不使用索引的情况下进行测试,您必须删除索引:

white tops for girls without any print

在对已编入索引的嵌入数据执行 Vector Search 查询时,使用上述搜索文本可获得优质的搜索结果并提高效率。使用索引后,效率大大提高(在执行时间方面:不使用 ScaNN 时为 10.37 毫秒,使用 ScaNN 时为 0.87 毫秒)。如需详细了解此主题,请参阅这篇博文

9. 使用 LLM 进行匹配验证

在继续创建用于针对应用返回最佳匹配项的服务之前,我们先使用生成式 AI 模型来验证这些潜在回答是否确实相关且可以安全地与用户分享。

确保已为实例设置 Gemini

  1. 验证您的集群和实例是否已启用 google_ml_integration。在 AlloyDB Studio 中,运行以下命令:
show google_ml_integration.enable_model_support;

如果值显示为“开启”,您可以跳过接下来的 2 个步骤,直接设置

AlloyDB 与 Vertex AI 模型集成。

  1. 前往 AlloyDB 集群的主实例,然后点击修改主实例

456ffdf292d3c0e0.png

  1. 高级配置选项中,展开“新建数据库标志”部分,并确保 google_ml_integration.enable_model_support flag 设置为“on”,如下所示:

6a59351fcd2a9d35.png 3. 如果未设置为“on”,请将其设置为“on”,然后点击更新实例

此步骤需要几分钟时间。

AlloyDB 与 Vertex AI 模型集成

现在,您可以连接到 AlloyDB Studio,并运行以下 DML 语句,以便在 AlloyDB 中设置 Gemini 模型访问权限,并在指示位置使用您的项目 ID。在运行该命令之前,您可能会收到语法错误警告,但该命令应该可以正常运行。

  1. 在 Google Cloud 控制台中,前往 AlloyDB。选择主集群,然后点击左侧导航栏中的 AlloyDB Studio
  2. 我们将使用默认随 google_ml_integration 扩展程序提供的 gemini-1.5-pro:generateContentcdb5af753a625777.png
  3. 您可以在 AlloyDB Studio 中通过以下命令查看已配置为可访问的模型:
select model_id,model_type from google_ml.model_info_view;        
  1. 通过运行以下命令,向数据库用户授予执行 ml_predict_row 函数的权限,以便使用 Google Vertex AI 模型运行预测:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

评估回答

虽然我们最终会在下一部分中使用一个大型查询来实际将应用部署到 Cloud Run,但为了确保查询的响应合理,该查询可能很难理解。

我们将了解构建最终使用的更大查询的各个部分。

  1. 首先,我们会向数据库发送请求,以获取与用户查询最接近的 5 个匹配项。为了简单起见,我们将对查询进行硬编码,但别担心,我们稍后会将其插入到查询中。

我们将添加 apparels 表中的商品说明,并添加两个新字段,一个用于将说明与索引组合,另一个用于将说明与原始请求组合。这些数据会保存在名为 xyz 的表中,这是临时表名称。

CREATE TABLE
 xyz AS
SELECT
 id || ' - ' || pdt_desc AS literature,
 pdt_desc AS content,
 'I want womens tops, pink casual only pure cotton.' AS  user_text
FROM
 apparels
ORDER BY
 embedding <=> embedding('text-embedding-005',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

此查询的输出将是与用户查询相关的5 个最相似的行。该

新表 xyz 将包含 5 行,每行都包含以下列:

  • literature
  • content
  • user_text
  1. 为了确定回答的有效性,我们将使用一个复杂的查询来说明如何评估回答。它会在查询中使用 xyz 表中的 user_textcontent
"Read this user search text: ', user_text, 
' Compare it against the product inventory data set: ', content,
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."

  1. 然后,我们将使用该查询检查 xyz 表中的回答“好坏”。我们所说的“好”是指生成的回答与预期回答的接近程度。
CREATE TABLE
  x AS
SELECT
  json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
      request_body => CONCAT('{
 "contents": [
        { "role": "user",
          "parts":
             [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
             } ]
         }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
    xyz;
  1. predict_row 会以 JSON 格式返回结果。代码“-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"”用于从该 JSON 中提取实际文本。如需查看实际返回的 JSON,您可以移除此代码。
  2. 最后,如需获取 LLM 字段,您只需从 x 表中提取该字段即可:
SELECT 
LLM_RESPONSE
FROM
        x
;
  1. 这可以组合成单个查询,如下所示:

警告:如果您已运行上述查询来检查中间结果,

确保在运行此查询之前从 AlloyDB 数据库中删除/移除 xyzx 表,

SELECT
 LLM_RESPONSE
FROM (
 SELECT
 json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
     request_body => CONCAT('{
     "contents": [
       { "role": "user",
         "parts":
            [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
            } ]
        }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
   FROM (
         SELECT
           id || ' - ' || pdt_desc AS literature,
           pdt_desc AS content,
         'I want womens tops, pink casual only pure cotton.' user_text
         FROM
           apparels
         ORDER BY
             embedding <=> embedding('text-embedding-005',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

较大的查询是前面步骤中运行的所有查询的组合。结果会显示是否有匹配项、匹配百分比,以及对分级的某些说明。

请注意,Gemini 模型默认处于流式传输状态,因此实际回答会分布在多行中:14e74d71293b7b9.png

10. 将应用移至 Web

现在,我们将托管此应用,以便您可以通过互联网访问它。

创建 Cloud Run 函数

  1. 在 Google Cloud 控制台中,使用以下链接前往 Cloud Run Functions:

https://console.cloud.google.com/run/create?deploymentType=function

  1. 在“配置”中,将“函数名称”设置为“retail-engine”,并将区域选择为“us-central1”。
  2. 在“端点网址”中,将运行时选择为 Java 17
  3. 在“Authentication”(身份验证)中,选择 Allow unauthenticated invocations(允许未通过身份验证的调用)。
  4. 展开容器、卷、网络、安全性,然后点击网络标签页。
  5. 选择连接到 VPC 以发送出站流量,然后点击使用无服务器 VPC 访问通道连接器
  6. 在“网络”中,点击添加新的 VPC 连接器。启用 Serverless VPC Access API(如果尚未启用)。
  7. 在“创建连接器”中,将名称设置为 alloydb-test-conn
  8. 将区域设置为 us-central
  9. 将“网络”值保留为默认,并将“子网”设置为自定义 IP 地址范围,IP 地址范围为 10.8.0.0 或其他可用的类似 IP 地址。
  10. 展开显示缩放设置,并将实例数下限设置为 2,将实例数上限设置为 3。
  11. 将实例类型选择为 f1-micro。以下是“创建连接器”选项:

bed4b2af6795a8ba.png

  1. 点击“创建”以创建连接器。
  2. 在“流量路由”中,选择将所有流量路由到 VPC
  3. 点击创建以创建函数。

部署应用

创建函数后,更新源代码并重新部署应用。

  1. Cloud Run 中,点击服务标签页,然后点击 retail-engine 函数。
  2. 点击“来源”标签页。将默认的函数入口点设为“gcfv2.HelloHttpFunction”。
  3. HelloHttpFunction.java 文件的内容替换为此 Java 文件中的内容。
  4. 根据您的 AlloyDB 实例和集群的详细信息,更新文件中的 AlloyDbJdbcConnector 详细信息。将 $PROJECT_ID 替换为 AlloyDB 集群和实例的项目 ID。

a89dc5af3580fbcf.png

  1. pom.xml 文件的内容替换为此 XML 文件的内容。
  2. 点击保存并重新部署以部署该函数。

11. 测试 retail-engine 应用

更新后的 Cloud Functions 函数部署完毕后,您应该会看到采用以下格式的端点:

https://retail-engine-PROJECT_NUMBER.us-central1.run.app

您可以通过在 Cloud Shell 终端中运行以下命令来对其进行测试:

gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'

或者,您也可以按如下所示测试 Cloud Run 函数:

PROJECT_ID=$(gcloud config get-value project)

curl
-X POST https://retail-engine-$PROJECT_NUMBER.us-central1.run.app \
 
-H 'Content-Type: application/json' \
 
-d '{"search":"I want some kids clothes themed on Disney"}' \
 
| jq .

结果如下:

88bc1ddfb5644a28.png

现在,我们已经使用 AlloyDB 数据通过嵌入模型运行了相似矢量搜索,接下来可以创建一个应用,该应用会使用这些嵌入和您的图片,并提示生成样式建议

12. 了解服装搭配推荐流程

服装搭配推荐应用是一款 Sprint 启动应用,配置为与我们在 AlloyDB 零售引擎应用中创建的嵌入以及 Gemini 和 Imagen 搭配使用,以生成可视化的服装搭配样式选项。您还可以添加自定义提示并即兴发挥来提供建议。

举个例子,您将衣柜中粉红色上衣的图片上传到此应用。当您点击“显示”时,应用会根据应用代码中设置的提示和 AlloyDB 数据库中的嵌入,生成与原始图片匹配的多个选项。现在,您想知道建议的选项搭配蓝色项链会是什么样子,因此您在这些行上添加了提示,然后点击“样式”。系统会生成最终图片,将原始图片和推荐内容的强大组合相结合,打造出搭配合适的服装。

如需开始创建服装搭配推荐应用,请按以下步骤操作:

  1. Cloud Run 中,打开 retail-engine 应用,并记下应用的网址。这是我们将用于生成类似建议的嵌入库。
  2. 在 IDE 中,克隆 https://github.com/AbiramiSukumaran/outfit-recommender/ 代码库。对于本练习,请在 Visual Studio Code IDE 中执行所示步骤。
git clone https://github.com/AbiramiSukumaran/outfit-recommender/

以下是应用目录中的一些重要文件:

  • src/main:应用文件和 HTML 所在的源目录:
  • HelloWorldApplication.java:Spring Boot 应用的主要入口点。
  • HelloWorldController.java:Spring Boot REST 控制器,用于处理与服装推荐应用相关的 HTTP 请求。此文件会处理 GET 和 POST 请求、处理用户提示、分析图片、与 AlloyDB 嵌入交互,并将最终响应返回给界面。此控制器会调用 GenerateImageSample 类。
  • GenerateImageSample.java:包含用于连接到 Vertex AI、设置用户提示格式、向 Imagen 模型发出 API 调用、将预测图片返回给控制器类的图片生成类。
  • Resources:此目录包含生成应用界面所需的图片和 HTML 文件。
  • Pom.xml:定义项目依赖项和配置。
  1. 在 Visual Studio Code 中,打开 HelloWorldController.java,并根据 AlloyDB 实例的创建位置更新项目 ID 和位置的实例。

9fff8f5cbb62567.png

  1. endpoint 更新为您之前托管的零售引擎应用网址。

ae6227e88eec5485.png

  1. 打开 GenerateImageSample.java,然后根据 AlloyDB 实例的创建位置更新项目 ID 和位置。

db1f81a6f51d80de.png

  1. 保存所有文件。

现在,我们将此应用部署到 Cloud Run 无服务器运行时。

13. 将应用移至 Web

现在,我们已向服装推荐系统 Spring Boot 应用添加了相关项目、位置和零售引擎应用详细信息,接下来可以将该应用部署到 Cloud Run。

我们将在 Visual Studio Code 终端中使用 gcloud run deploy 命令部署应用。对于 Visual Studio Code,您可以安装 Google Cloud Code 扩展程序,以便开始使用 gcloud CLI。

如需部署该应用,请按以下步骤操作:

  1. 在 IDE 中,打开克隆的目录并启动终端。对于 Visual Code Studio,请依次点击 Terminal(终端)> New Terminal(新建终端)。
  2. 按照本文档中的说明安装 gcloud CLI。
  3. 如果您使用的是 Visual Code Studio,请点击 Extensions(扩展程序),搜索 Google Cloud Code 并安装该扩展程序。
  4. 在 IDE 终端中,运行以下命令以对您的 Google 账号进行身份验证:
gcloud auth application-default login
  1. 将您的项目 ID 设置为 AlloyDB 实例所在的项目。
gcloud config set project PROJECT_ID
  1. 开始部署流程。
gcloud run deploy
  1. Source code location 中,按 Enter 键选择克隆的 GitHub 目录。
  2. Service name 中,输入服务的名称(例如 outfit-recommender),然后按 Enter 键。
  3. Please specify a region 中,输入 AlloyDB 实例和 retail-engine 应用的托管位置,例如 us-central1 对应的 32,然后按 Enter 键。

12c0de4248660d4d.png

  1. Allow unauthenticated invocations to [..] 中,输入 Y,然后按 Enter 键。

下图显示了应用的部署进度:

1babbb82faa31fce.png

14. 测试服装推荐应用

应用成功部署到 Cloud Run 后,您可以在 Google Cloud 控制台中看到该服务,如下所示:

  1. 在 Google Cloud 控制台中,前往 Cloud Run
  2. 在“服务”中,点击您部署的服装推荐器服务。您应该会看到 retail-engineoutfit-recommender 服务,如下所示:

24dd0aebe224059e.png

  1. 点击应用网址以打开推荐系统应用界面。

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

https://outfit-recommender-22905290964.us-central1.run.app/style

已部署的应用如下所示:

76245d1a6152d313.png

使用应用

如需开始使用该应用,请按以下步骤操作:

  1. 点击上传,然后上传一件服装的照片。
  2. 图片上传完毕后,点击样式。该应用将图片用作提示,并根据 retail-engine 应用中的提示(包含零售数据集的嵌入)生成底部选项。

该应用会根据图片生成图片建议和提示,并提供样式建议。例如 A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. 您可以向此自动生成的样式建议传递其他提示。例如 STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
  2. 点击显示可查看最终样式。

38d6d08e9a0a44c0.png

15. 清理

为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,前往管理资源页面。
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关停以删除项目。

16. 恭喜

恭喜!您已成功使用 AlloyDB、pgvector 和 Vector Search 执行相似搜索,并将搜索结果与强大的 Imagen 模型结合使用,以生成造型建议。