使用 AlloyDB 和無伺服器執行階段,建構以 AI 為輔助的服裝推薦應用程式

使用 AlloyDB 和無伺服器執行階段,建構以 AI 為輔助的服裝推薦應用程式

程式碼研究室簡介

subject上次更新時間:3月 28, 2025
account_circle作者:Abirami Sukumaran, Shweta Shetye

1. 總覽

想像一下,時尚應用程式不但能協助您找到完美服裝,還能提供即時的穿搭建議,這一切都歸功於先進的 genAI 整合功能!在本次演講中,我們將探討如何使用 AlloyDB 的向量搜尋功能,搭配 Google 的 ScaNN 索引,打造這類應用程式,以便快速搜尋相符的服裝,並即時提供時尚推薦內容。

我們也會深入探討 AlloyDB 的 ScaNN 索引如何最佳化複雜查詢,產生個人化樣式建議。我們也會使用 Gemini 和 Imagen 這兩個強大的生成式 AI 模型,提供創意造型靈感,甚至將個人化造型以視覺化方式呈現。整個應用程式都是以無伺服器架構建構,可確保為使用者提供順暢且可擴充的體驗。

挑戰:應用程式提供個人化服裝建議,協助無法決定穿搭的使用者。這樣一來,你也不必為穿搭而煩惱。

解決方案:服裝推薦應用程式解決了使用者面臨的問題,為他們提供智慧化、個人化且引人入勝的時尚體驗,同時展示 AlloyDB、生成式 AI 和無伺服器技術的功能。

本實驗室的學習內容如下:

  1. 建立 AlloyDB 例項並載入電子商務資料集
  2. 在 AlloyDB 中啟用 pgvector 和生成式 AI 模型擴充功能
  3. 根據產品說明產生嵌入
  4. 在無伺服器 Cloud Run 函式中部署解決方案
  5. 將圖片上傳至 Gemini,並產生圖片說明提示。
  6. 根據提示和電子商務資料集嵌入項目產生搜尋結果。
  7. 新增其他提示,自訂提示並產生風格建議。
  8. 在無伺服器 Cloud Run 函式中部署解決方案

需求條件

  • ChromeFirefox 等瀏覽器
  • 已啟用計費功能的 Google Cloud 專案。

2. 架構

應用程式的整體架構如下:

ce32f865dfe59142.png

以下各節將說明教學課程的內容流程:

內容擷取

首先,我們要將零售資料 (商品目錄、產品說明、顧客互動) 擷取至 AlloyDB。

數據分析引擎:

我們會使用 AlloyDB 做為數據分析引擎,執行下列操作:

  1. 擷取內容:引擎會分析儲存在 AlloyDB 中的資料,以瞭解產品、類別、客戶行為等之間的關係。
  2. 嵌入項目建立:系統會為使用者的查詢和儲存在 AlloyDB 中的資訊產生嵌入項目 (文字的數學表示法)。
  3. 向量搜尋:引擎會執行相似度搜尋,將查詢嵌入項目與產品說明、評論和其他相關資料的嵌入項目進行比較。這項功能會找出 25 個最相關的「最近鄰居」。

Gemini 建議:

圖片位元組陣列會透過 Vertex AI API 傳遞至 Gemini 模型,同時會顯示提示,要求系統以文字描述上衣穿搭,並提供下身穿搭的建議。

AlloyDB RAG 和向量搜尋:

系統會使用上衣的說明來查詢資料庫。這項查詢會將搜尋文字 (Gemini 模型提供的建議,用於比對下身穿著) 轉換為嵌入項目,並對儲存在資料庫中的嵌入項目執行 Vector Search,找出最相近的項目 (比對結果)。AlloyDB 資料庫中的向量嵌入項目會使用 ScaNN 索引進行索引,以便提高回憶率。

回覆圖片生成:

經過驗證的回應會以 JSON 陣列的形式建構,整個引擎會封裝為從代理程式建構工具叫用的無伺服器 Cloud Run 函式。

Imagen 圖像生成:

使用者的樣式提示、使用者選取的推薦內容和任何個人化要求,都會合併為使用現有圖片的 Imagen 3 提示。系統會使用 Vertex AI API,根據這個提示產生樣式圖片。

3. 事前準備

建立專案

  1. Google Cloud 控制台的專案選取器頁面中,選取或建立 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 Console 中找到大部分的頁面,請使用控制台的搜尋列進行搜尋。
  2. 按一下 [建立叢集]

f76ff480c8c889aa.png

  1. 使用下列值建立叢集和執行個體
  • 叢集 ID:「shopping-cluster
  • 密碼:「alloydb
  • 與 PostgreSQL 15 相容
  • 區域:「us-central1
  • 網路:default

538dba58908162fb.png

  1. 在「網路」中,選取預設網路後,系統會顯示下列選項。按一下「設定連線」,設定預設網路。
    7939bbb6802a91bf.png
  2. 選取「使用系統自動分配的 IP 範圍」,然後按一下「繼續」。查看資訊後,請按一下「建立連線」768ff5210e79676f.png

等待預設網路建立完成。

  1. 在「設定主要執行個體」中,將「Instance 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 後,您可以在「編輯器」分頁中輸入 SQL 指令。您可以使用第一個編輯器分頁右側的加號,新增多個編輯器視窗。

91a86d9469d499c4.png

您會在編輯器視窗中輸入 AlloyDB 指令,並視需要使用「Run」、「Format」和「Clear」選項。

啟用擴充功能

為了建構這個應用程式,我們會使用「pgvector"」和「google_ml_integration"」擴充功能。

  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. 在 AlloyDB Studio 的新「Editor」分頁中,複製 SQL 檔案中的 20 行/插入陳述式,然後按一下「RUN」
  1. 展開「Explorer」專區,直到您看到名為 apparels 的表格。
  2. 按一下選單圖示 [],然後點選「查詢」。系統會在新編輯器分頁中開啟 SELECT 陳述式。

b31ece70e670ab89.png

  1. 按一下「執行」,確認是否已插入資料列。

授予使用者權限

我們會授予 postgres 使用者權限,讓他們從 AlloyDB 內產生嵌入內容.。在 AlloyDB Studio 中,執行下列陳述式,將 embedding 函式的執行權限授予 postgres 使用者:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

將 Vertex AI 使用者角色授予 AlloyDB 服務帳戶

我們將使用 Vertex AI 的文字嵌入模型,為 AlloyDB 服務帳戶的 Vertex AI 使用者角色產生嵌入資料。

在 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 編輯器分頁中,執行下列指令,使用內容資料更新 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 欄,以便為儲存的資料嵌入資料:
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. <=>」代表使用 COSINE SIMILARITY 距離方法。如要查看所有可用的相似度評估指標,請參閱 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. 使用與前述相同的查詢執行向量搜尋,但不使用索引:
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. 將應用程式發布到網路

我們現在會代管這個應用程式,讓使用者能夠透過網際網路存取。

建立 Cloud Run 函式

  1. 在 Google Cloud 控制台中,使用以下連結前往 Cloud Run 函式:

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

  1. 在「Configure」(設定) 中,將「Function Name」(函式名稱) 設為「retail-engine」,並選取「us-central1」做為地區。
  2. 在「端點網址」中,將執行階段選為 Java 17
  3. 在「驗證」中,選取「允許未經驗證的叫用」
  4. 展開「容器、磁碟區、網路與安全性」,然後按一下「網路」分頁標籤。
  5. 選取「連線至虛擬私有雲,以傳出流量」,然後按一下「使用無伺服器虛擬私有雲存取連接器」
  6. 在「網路」中,按一下「新增虛擬私有雲連接器」。啟用 Serverless VPC Access API (如果尚未啟用)。
  7. 在「Create connector」(建立連接器) 中,將名稱設為 alloydb-test-conn
  8. 將區域設為 us-central
  9. 將「Network」(網路) 值保留為「default」(預設),並將「Subnet」(子網路) 設為「Custom IP Range」(自訂 IP 範圍),並使用 10.8.0.0 或類似的 IP 範圍。
  10. 展開「Show scaling」設定,並將「Minimum instances」設為 2,將「Maximum instances」設為 3。
  11. 將執行個體類型選為 f1-micro。下方顯示「建立連接器」選項:

bed4b2af6795a8ba.png

  1. 按一下「建立」即可建立連接器。
  2. 在流量轉送中,選取「將所有流量轉送至虛擬私有雲」
  3. 按一下「建立」即可建立函式。

部署應用程式

建立函式後,請更新原始碼並重新部署應用程式。

  1. Cloud Run 中,按一下「Services」分頁,然後點選「retail-engine」函式。
  2. 按一下「來源」分頁標籤。將預設的「函式進入點」設為「gcfv2.HelloHttpFunction」。
  3. HelloHttpFunction.java 檔案的內容替換為這個 Java 檔案的內容。
  4. 根據 AlloyDB 執行個體和叢集的詳細資料,更新檔案中的 AlloyDbJdbcConnector 詳細資料。將 $PROJECT_ID 替換為 AlloyDB 叢集和執行個體的專案 ID。

a89dc5af3580fbcf.png

  1. pom.xml 檔案的內容替換為這個 XML 檔案的內容。
  2. 按一下「儲存並重新部署」,即可部署函式。

11. 測試零售引擎應用程式

更新後的 Cloud 函式部署完成後,您應該會看到以下格式的端點:

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 Boot 應用程式,已設定為搭配我們在 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 嵌入內容互動,並將最終回應傳回 UI。這個控制器會呼叫 GenerateImageSample 類別。
  • GenerateImageSample.java:包含圖片生成類別,可連線至 Vertex AI、格式化使用者提示、對 Imagen 模型發出 API 呼叫,並將預測圖片傳回至控制器類別。
  • Resources:這個目錄包含產生應用程式 UI 所需的圖片和 HTML 檔案。
  • Pom.xml:定義專案依附元件和設定。
  1. 在 Visual Studio 程式碼中,開啟 HelloWorldController.java,並根據建立 AlloyDB 執行個體的位置更新專案 ID 和位置。

9fff8f5cbb62567.png

  1. endpoint 更新為先前代管的零售引擎應用程式網址。

ae6227e88eec5485.png

  1. 開啟 GenerateImageSample.java,並根據您建立 AlloyDB 執行個體的位置更新專案 ID 和位置。

db1f81a6f51d80de.png

  1. 儲存所有檔案。

我們現在會將這個應用程式部署至 Cloud Run 無伺服器執行階段。

13. 將應用程式發布到網路

在 outfit-recommender 的 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 執行個體和零售引擎應用程式所在位置,例如 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. 按一下應用程式網址,開啟推薦器應用程式 UI。

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. 上傳圖片後,按一下「樣式」。應用程式會使用圖片做為提示,並根據零售引擎應用程式提供的提示產生底部選項,其中包含零售資料集的嵌入資料。

應用程式會根據圖片產生圖片建議和提示,並提供樣式建議。例如: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,然後按一下「Shut down」(關閉) 即可刪除專案。

16. 恭喜

恭喜!您已成功使用 AlloyDB、pgvector 和 Vector 搜尋功能執行相似度搜尋,並將搜尋結果與強大的 Imagen 模型結合,產生樣式建議。