程式碼研究室簡介
1. 總覽
想像一下,時尚應用程式不但能協助您找到完美服裝,還能提供即時的穿搭建議,這一切都歸功於先進的 genAI 整合功能!在本次演講中,我們將探討如何使用 AlloyDB 的向量搜尋功能,搭配 Google 的 ScaNN 索引,打造這類應用程式,以便快速搜尋相符的服裝,並即時提供時尚推薦內容。
我們也會深入探討 AlloyDB 的 ScaNN 索引如何最佳化複雜查詢,產生個人化樣式建議。我們也會使用 Gemini 和 Imagen 這兩個強大的生成式 AI 模型,提供創意造型靈感,甚至將個人化造型以視覺化方式呈現。整個應用程式都是以無伺服器架構建構,可確保為使用者提供順暢且可擴充的體驗。
挑戰:應用程式提供個人化服裝建議,協助無法決定穿搭的使用者。這樣一來,你也不必為穿搭而煩惱。
解決方案:服裝推薦應用程式解決了使用者面臨的問題,為他們提供智慧化、個人化且引人入勝的時尚體驗,同時展示 AlloyDB、生成式 AI 和無伺服器技術的功能。
建構項目
本實驗室的學習內容如下:
- 建立 AlloyDB 例項並載入電子商務資料集
- 在 AlloyDB 中啟用 pgvector 和生成式 AI 模型擴充功能
- 根據產品說明產生嵌入
- 在無伺服器 Cloud Run 函式中部署解決方案
- 將圖片上傳至 Gemini,並產生圖片說明提示。
- 根據提示和電子商務資料集嵌入項目產生搜尋結果。
- 新增其他提示,自訂提示並產生風格建議。
- 在無伺服器 Cloud Run 函式中部署解決方案
需求條件
2. 架構
應用程式的整體架構如下:
以下各節將說明教學課程的內容流程:
內容擷取:
首先,我們要將零售資料 (商品目錄、產品說明、顧客互動) 擷取至 AlloyDB。
數據分析引擎:
我們會使用 AlloyDB 做為數據分析引擎,執行下列操作:
- 擷取內容:引擎會分析儲存在 AlloyDB 中的資料,以瞭解產品、類別、客戶行為等之間的關係。
- 嵌入項目建立:系統會為使用者的查詢和儲存在 AlloyDB 中的資訊產生嵌入項目 (文字的數學表示法)。
- 向量搜尋:引擎會執行相似度搜尋,將查詢嵌入項目與產品說明、評論和其他相關資料的嵌入項目進行比較。這項功能會找出 25 個最相關的「最近鄰居」。
Gemini 建議:
圖片位元組陣列會透過 Vertex AI API 傳遞至 Gemini 模型,同時會顯示提示,要求系統以文字描述上衣穿搭,並提供下身穿搭的建議。
AlloyDB RAG 和向量搜尋:
系統會使用上衣的說明來查詢資料庫。這項查詢會將搜尋文字 (Gemini 模型提供的建議,用於比對下身穿著) 轉換為嵌入項目,並對儲存在資料庫中的嵌入項目執行 Vector Search,找出最相近的項目 (比對結果)。AlloyDB 資料庫中的向量嵌入項目會使用 ScaNN 索引進行索引,以便提高回憶率。
回覆圖片生成:
經過驗證的回應會以 JSON 陣列的形式建構,整個引擎會封裝為從代理程式建構工具叫用的無伺服器 Cloud Run 函式。
Imagen 圖像生成:
使用者的樣式提示、使用者選取的推薦內容和任何個人化要求,都會合併為使用現有圖片的 Imagen 3 提示。系統會使用 Vertex AI API,根據這個提示產生樣式圖片。
3. 事前準備
建立專案
- 在 Google Cloud 控制台的專案選取器頁面中,選取或建立 Google Cloud 專案。
- 確認 Cloud 專案已啟用計費功能。瞭解如何檢查專案是否已啟用計費功能。
- 您將使用 Cloud Shell,這是在 Google Cloud 中運作的指令列環境,並預先載入 bq。按一下 Google Cloud 控制台頂端的「啟用 Cloud Shell」圖示
。
- 連線至 Cloud Shell 後,請使用下列指令確認您已通過驗證,且專案已設為您的專案 ID:
gcloud auth list
- 執行下列指令,確認日後的 gcloud 指令會正確識別您的專案。
gcloud config list project
- 如果未設定專案,請使用下列指令明確設定:
gcloud config set project <YOUR_PROJECT_ID>
- 啟用必要的 API。
點選這裡即可啟用 API。
如果您忘記啟用任何 API,可以在實作期間隨時啟用。
如要進一步瞭解 gcloud 指令和用法,請參閱說明文件。
4. 資料庫設定
在本實驗室中,我們會使用 AlloyDB 做為資料庫,用於儲存零售電子商務資料集。它會使用叢集來儲存所有資源,例如資料庫和記錄。每個叢集都有一個主要例項,可提供資料的存取點。資料表是儲存資料的實際資源。
我們來建立 AlloyDB 叢集、執行個體和資料表,用於載入電子商務資料集。
建立叢集和執行個體
- 在 Google Cloud 控制台中搜尋 AlloyDB。如要輕鬆在 Cloud Console 中找到大部分的頁面,請使用控制台的搜尋列進行搜尋。
- 按一下 [建立叢集]。
- 使用下列值建立叢集和執行個體:
- 叢集 ID:「
shopping-cluster
」 - 密碼:「
alloydb
」 - 與 PostgreSQL 15 相容
- 區域:「
us-central1
」 - 網路:
default
- 在「網路」中,選取預設網路後,系統會顯示下列選項。按一下「設定連線」,設定預設網路。
- 選取「使用系統自動分配的 IP 範圍」,然後按一下「繼續」。查看資訊後,請按一下「建立連線」。
等待預設網路建立完成。
- 在「設定主要執行個體」中,將「Instance ID」設為「
shopping-instance"
」。
- 按一下「建立叢集」,完成叢集設定,如下所示:
5. 資料擷取
接下來,我們要新增含有商店資料的表格。等待執行個體建立完成。建立完成後,您可以使用建立叢集時設定的憑證登入 AlloyDB。
向 AlloyDB 資料庫進行驗證
- 在 Google Cloud 控制台中,前往 AlloyDB。選取主要叢集,然後按一下左側導覽面板中的「AlloyDB Studio」:
- 輸入下列詳細資料,以便驗證 AlloyDB 資料庫:
- 使用者名稱:"
postgres
" - 資料庫:
postgres
- 密碼:
alloydb
成功驗證 AlloyDB Studio 後,您可以在「編輯器」分頁中輸入 SQL 指令。您可以使用第一個編輯器分頁右側的加號,新增多個編輯器視窗。
您會在編輯器視窗中輸入 AlloyDB 指令,並視需要使用「Run」、「Format」和「Clear」選項。
啟用擴充功能
為了建構這個應用程式,我們會使用「pgvector"
」和「google_ml_integration"
」擴充功能。
- pgvector 擴充功能可讓您儲存及搜尋向量嵌入。
- google_ml_integration 擴充功能提供可用於存取 Vertex AI 預測端點的函式,以便在 SQL 中取得預測結果。
- 執行下列 DDL 啟用這些擴充功能:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;
- 執行下列 SQL 指令,確認是否已安裝擴充功能:
select extname, extversion from pg_extension;
建立表格
- 使用下列 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) );
成功執行上述指令後,您應該就能在
。下圖為範例:
擷取資料
在本實驗室中,我們在這個 SQL 檔案中提供約 200 筆記錄的測試資料。其中包含 id, category, sub_category, uri, image
和 content
。其他欄位會在稍後的實驗室中填入。
- 在 AlloyDB Studio 的新「Editor」分頁中,複製 SQL 檔案中的 20 行/插入陳述式,然後按一下「RUN」。
- 展開「Explorer」專區,直到您看到名為
apparels
的表格。 - 按一下選單圖示 [⋮],然後點選「查詢」。系統會在新編輯器分頁中開啟 SELECT 陳述式。
- 按一下「執行」,確認是否已插入資料列。
授予使用者權限
我們會授予 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 終端機」[ ] 圖示,然後執行下列指令:
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
。
- 在 AlloyDB Studio 中執行下列指令,產生嵌入資料,並更新
pdt_desc
欄,以便為儲存的資料嵌入資料:
UPDATE
apparels
SET
embedding = embedding( 'text-embedding-005',
pdt_desc)
WHERE
TRUE;
- 執行下列指令,確認是否已產生嵌入:
SELECT
id,
category,
sub_category,
content,
embedding
FROM
Apparels
LIMIT 5;
以下是查詢中範例文字的嵌入向量 (看起來像浮點陣列):
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;
讓我們進一步瞭解這個查詢:
在這個查詢中,
- 使用者的搜尋文字為:「
I want womens tops, pink casual only pure cotton.
」 - 我們會使用
embedding()
方法和模型text-embedding-005
,將這段搜尋文字轉換為嵌入項目。在上一節中,我們將嵌入函式套用至資料表中的所有項目,因此這個步驟應該會讓您感到熟悉。 - 「
<=>
」代表使用 COSINE SIMILARITY 距離方法。如要查看所有可用的相似度評估指標,請參閱 pgvector 的說明文件。 - 我們會將嵌入方法的結果轉換為向量資料類型,以便與資料庫中儲存的向量相容。
- LIMIT 5 代表我們要擷取搜尋文字的 5 個最相近項目。
以下是此 SQL 查詢的範例回應:
如您在結果中看到的,相符項目與搜尋文字非常相近。嘗試變更顏色,看看結果會如何變化。
AlloyDB ScaNN 索引可提升查詢效能
假設我們想使用 ScaNN 索引提升向量搜尋結果的成效 (查詢時間)、效率和回憶率。
如要使用 ScaNN 索引,請嘗試下列步驟:
- 由於我們已建立叢集、例項、情境和嵌入,因此只需使用以下陳述式安裝 ScaNN 擴充功能:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
- 建立 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
應大致等於資料點數的平方根。
- 檢查是否使用以下查詢建立索引:
SELECT * FROM pg_stat_ann_indexes;
- 使用與前述相同的查詢執行向量搜尋,但不使用索引:
select * from apparels
ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
LIMIT 20
上述查詢與實驗室步驟 8 中使用的查詢相同。不過,現在我們已使用 ScaNN 索引為欄位建立索引。
- 請使用簡單的搜尋查詢進行測試,並比較有無索引的結果。如要進行不含索引的測試,您必須捨棄索引:
white tops for girls without any print
在 Vector Search 查詢中使用上述搜尋文字,針對已編入索引的嵌入資料,可取得高品質的搜尋結果和效率。使用索引後,效率大幅提升 (執行時間:不使用 ScaNN 為 10.37 毫秒,使用 ScaNN 為 0.87 毫秒)。如要進一步瞭解這個主題,請參閱這篇網誌文章。
9. 使用 LLM 進行比對驗證
在繼續建立服務,為應用程式傳回最相符的內容之前,我們先使用生成式 AI 模型驗證這些潛在回覆是否確實相關,且可安全地與使用者分享。
確認已為 Gemini 設定執行個體
- 確認叢集和執行個體已啟用
google_ml_integration
。在 AlloyDB Studio 中執行下列指令:
show google_ml_integration.enable_model_support;
如果顯示的值為「開啟」,您可以略過接下來的 2 個步驟,直接設定
AlloyDB 和 Vertex AI 模型整合功能。
- 前往 AlloyDB 叢集的主要執行個體,然後按一下「編輯主要執行個體」。
- 在「進階設定選項」中,展開「新資料庫旗標」專區,並確認
google_ml_integration.enable_model_support flag
已設為「on
」如下所示:
3. 如果未設為「
on
」,請將其設為「on
」,然後按一下「更新執行個體」。
這項步驟需要幾分鐘的時間。
AlloyDB 與 Vertex AI 模型整合
您現在可以連線至 AlloyDB Studio,並執行下列 DML 陳述式,在 AlloyDB 中設定 Gemini 模型存取權,並在指定位置使用專案 ID。執行指令前,系統可能會警告您語法錯誤,但指令應該會正常執行。
- 在 Google Cloud 控制台中,前往 AlloyDB。選取主要叢集,然後按一下左側導覽面板中的「AlloyDB Studio」。
- 我們會使用
google_ml_integration
擴充功能預設提供的gemini-1.5-pro:generateContent
。 - 您可以透過 AlloyDB Studio 中的下列指令,檢查已設定存取權限的模型:
select model_id,model_type from google_ml.model_info_view;
- 執行下列指令,授予資料庫使用者執行 ml_predict_row 函式權限,以便使用 Google Vertex AI 模型執行預測作業:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;
評估回覆
雖然我們會在下一節中使用一個大型查詢,實際將應用程式移至 Cloud Run,以確保查詢的回應合理,但查詢可能難以理解。
我們將查看各個部分,瞭解如何建構最終使用的大型查詢。
- 首先,我們會向資料庫傳送要求,取得與使用者查詢最相符的 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
- 為了判斷回應的有效性,我們會使用複雜的查詢,說明如何評估回應。它會使用
xyz
資料表中的user_text
和content
做為查詢的一部分。
"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."
- 接著,我們會使用該查詢,查看
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;
predict_row
會以 JSON 格式傳回結果。程式碼「-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'"
」用於從該 JSON 中擷取實際文字。如要查看實際傳回的 JSON,您可以移除這段程式碼。- 最後,如要取得 LLM 欄位,您只需從 x 資料表中擷取該欄位:
SELECT
LLM_RESPONSE
FROM
x;
- 這可以結合為單一查詢,如下所示:
警告:如果您已執行上述查詢來檢查中間結果,
請務必先從 AlloyDB 資料庫中刪除/移除 xyz
和 x
資料表,再執行這項查詢。
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 模型預設會開啟串流功能,因此實際回覆會分散在多行中:
10. 將應用程式發布到網路
我們現在會代管這個應用程式,讓使用者能夠透過網際網路存取。
建立 Cloud Run 函式
- 在 Google Cloud 控制台中,使用以下連結前往 Cloud Run 函式:
https://console.cloud.google.com/run/create?deploymentType=function
- 在「Configure」(設定) 中,將「Function Name」(函式名稱) 設為「retail-engine」,並選取「us-central1」做為地區。
- 在「端點網址」中,將執行階段選為 Java 17。
- 在「驗證」中,選取「允許未經驗證的叫用」。
- 展開「容器、磁碟區、網路與安全性」,然後按一下「網路」分頁標籤。
- 選取「連線至虛擬私有雲,以傳出流量」,然後按一下「使用無伺服器虛擬私有雲存取連接器」。
- 在「網路」中,按一下「新增虛擬私有雲連接器」。啟用 Serverless VPC Access API (如果尚未啟用)。
- 在「Create connector」(建立連接器) 中,將名稱設為
alloydb-test-conn
。 - 將區域設為
us-central
。 - 將「Network」(網路) 值保留為「default」(預設),並將「Subnet」(子網路) 設為「Custom IP Range」(自訂 IP 範圍),並使用 10.8.0.0 或類似的 IP 範圍。
- 展開「Show scaling」設定,並將「Minimum instances」設為 2,將「Maximum instances」設為 3。
- 將執行個體類型選為 f1-micro。下方顯示「建立連接器」選項:
- 按一下「建立」即可建立連接器。
- 在流量轉送中,選取「將所有流量轉送至虛擬私有雲」。
- 按一下「建立」即可建立函式。
部署應用程式
建立函式後,請更新原始碼並重新部署應用程式。
- 在 Cloud Run 中,按一下「Services」分頁,然後點選「retail-engine」函式。
- 按一下「來源」分頁標籤。將預設的「函式進入點」設為「
gcfv2.HelloHttpFunction
」。 - 將 HelloHttpFunction.java 檔案的內容替換為這個 Java 檔案的內容。
- 根據 AlloyDB 執行個體和叢集的詳細資料,更新檔案中的 AlloyDbJdbcConnector 詳細資料。將
$PROJECT_ID
替換為 AlloyDB 叢集和執行個體的專案 ID。
- 將 pom.xml 檔案的內容替換為這個 XML 檔案的內容。
- 按一下「儲存並重新部署」,即可部署函式。
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 .
結果如下:
我們已在 AlloyDB 資料上使用嵌入模型執行相似向量搜尋,現在可以開始建立應用程式,使用這些嵌入項目和圖片,並提示產生樣式建議。
12. 瞭解服裝推薦流程
服裝推薦應用程式是 Sprint Boot 應用程式,已設定為搭配我們在 AlloyDB 零售引擎應用程式中建立的嵌入內容,以及 Gemini 和 Imagen 產生的視覺服裝造型選項。您也可以新增自訂提示,並即興發揮提供建議。
舉例來說,您將衣櫃中的亮粉紅上衣圖片上傳到這個應用程式。當您點選「顯示」時,應用程式會根據應用程式程式碼中設定的提示,以及 AlloyDB 資料庫中的嵌入資料,產生與原始圖片相符的多個選項。接著,您想知道建議的選項搭配藍色項鍊的效果,因此在這些行上新增提示,然後點選「樣式」。系統會產生最終圖片,結合原始圖片和推薦內容,打造出相配的服裝。
如要開始建立服裝推薦應用程式,請按照下列步驟操作:
- 在 Cloud Run 中開啟 retail-engine 應用程式,並記下應用程式的網址。這是我們用來產生類似建議的嵌入式資料庫。
- 在 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
:定義專案依附元件和設定。
- 在 Visual Studio 程式碼中,開啟
HelloWorldController.java
,並根據建立 AlloyDB 執行個體的位置更新專案 ID 和位置。
- 將
endpoint
更新為先前代管的零售引擎應用程式網址。
- 開啟
GenerateImageSample.java
,並根據您建立 AlloyDB 執行個體的位置更新專案 ID 和位置。
- 儲存所有檔案。
我們現在會將這個應用程式部署至 Cloud Run 無伺服器執行階段。
13. 將應用程式發布到網路
在 outfit-recommender 的 spring boot 應用程式中,我們已新增相關專案、位置和零售引擎應用程式詳細資料,因此可以將應用程式部署至 Cloud Run。
我們會在 Visual Studio Code 終端機中使用 gcloud run deploy
指令部署應用程式。如果您使用的是 Visual Studio Code,可以安裝 Google Cloud Code 擴充功能,開始使用 gcloud CLI。
如要部署應用程式,請按照下列步驟操作:
- 在 IDE 中開啟複製的目錄,並啟動終端機。在 Visual Code Studio 中,依序點選「Terminal」 >「New Terminal」。
- 請按照這份文件中的指示安裝 gcloud CLI。
- 如果您使用的是 Visual Code Studio,請按一下「Extensions」,搜尋「Google Cloud Code」並安裝擴充功能。
- 在 IDE 終端機中,執行下列指令驗證 Google 帳戶:
gcloud auth application-default login
- 將專案 ID 設為 AlloyDB 執行個體所在的專案。
gcloud config set project PROJECT_ID
- 開始部署程序。
gcloud run deploy
- 在
Source code location
中按下 Enter 鍵,選取已複製的 GitHub 目錄。 - 在
Service name
中輸入服務名稱 (例如 outfit-recommender),然後按下 Enter 鍵。 - 在
Please specify a region
中輸入 AlloyDB 執行個體和零售引擎應用程式所在位置,例如 us-central1 的 32,然後按下 Enter 鍵。
- 在
Allow unauthenticated invocations to [..]
中輸入 Y,然後按下 Enter 鍵。
下圖顯示應用程式的部署進度:
14. 測試服裝推薦應用程式
應用程式成功部署至 Cloud Run 後,您可以在 Google Cloud 控制台中看到服務,如下所示:
- 前往 Google Cloud 控制台中的「Cloud Run」。
- 在「服務」中,按一下您部署的服裝推薦器服務。您應該會看到 retail-engine 和 outfit-recommender 服務,如下所示:
- 按一下應用程式網址,開啟推薦器應用程式 UI。
The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
部署的應用程式如下所示:
使用應用程式
如要開始使用應用程式,請按照下列步驟操作:
- 按一下「上傳」,然後上傳服飾商品的相片。
- 上傳圖片後,按一下「樣式」。應用程式會使用圖片做為提示,並根據零售引擎應用程式提供的提示產生底部選項,其中包含零售資料集的嵌入資料。
應用程式會根據圖片產生圖片建議和提示,並提供樣式建議。例如:A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- 您可以將其他提示傳遞至這項自動產生的風格建議。例如:
STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
- 按一下「顯示」即可查看最終樣式。
15. 清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取這篇文章中所用資源的費用,請按照下列步驟操作:
16. 恭喜
恭喜!您已成功使用 AlloyDB、pgvector 和 Vector 搜尋功能執行相似度搜尋,並將搜尋結果與強大的 Imagen 模型結合,產生樣式建議。