Xây dựng ứng dụng đề xuất trang phục dựa trên AI bằng AlloyDB và thời gian chạy không có máy chủ

Xây dựng ứng dụng đề xuất trang phục dựa trên AI bằng AlloyDB và môi trường thời gian chạy không có máy chủ

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 3 28, 2025
account_circleTác giả: Abirami Sukumaran, Shweta Shetye

1. Tổng quan

Hãy tưởng tượng một ứng dụng thời trang không chỉ giúp bạn tìm thấy bộ trang phục hoàn hảo mà còn đưa ra lời khuyên về cách tạo kiểu theo thời gian thực, tất cả đều nhờ khả năng tích hợp công nghệ AI tạo sinh tiên tiến! Trong bài nói chuyện này, chúng ta sẽ khám phá cách xây dựng một ứng dụng như vậy bằng cách sử dụng các tính năng tìm kiếm vectơ của AlloyDB, kết hợp với chỉ mục ScaNN của Google, cho phép tìm kiếm trang phục phù hợp nhanh như chớp và đưa ra đề xuất thời trang tức thì.

Chúng ta cũng sẽ tìm hiểu cách chỉ mục ScaNN của AlloyDB tối ưu hoá các truy vấn phức tạp để tạo đề xuất kiểu được cá nhân hoá. Chúng tôi cũng sẽ sử dụng Gemini và Imagen, các mô hình AI tạo sinh mạnh mẽ, để cung cấp cảm hứng tạo kiểu sáng tạo và thậm chí là trực quan hoá diện mạo được cá nhân hoá của bạn. Toàn bộ ứng dụng này được xây dựng trên cấu trúc không có máy chủ, đảm bảo trải nghiệm liền mạch và có thể mở rộng cho người dùng.

Thách thức: Bằng cách đưa ra các đề xuất trang phục phù hợp với từng cá nhân, ứng dụng này nhằm giúp những người gặp khó khăn trong việc quyết định phong cách thời trang. Việc này cũng giúp tránh tình trạng mệt mỏi khi phải đưa ra quyết định về việc lên đồ.

Giải pháp: Ứng dụng đề xuất trang phục giải quyết vấn đề cung cấp cho người dùng trải nghiệm thời trang thông minh, cá nhân hoá và hấp dẫn, đồng thời giới thiệu các tính năng của AlloyDB, AI tạo sinh và công nghệ không có máy chủ.

Sản phẩm bạn sẽ tạo ra

Trong lớp học này, bạn sẽ:

  1. Tạo một thực thể AlloyDB và tải Tập dữ liệu thương mại điện tử
  2. Bật tiện ích pgvector và mô hình AI tạo sinh trong AlloyDB
  3. Tạo nội dung nhúng từ nội dung mô tả sản phẩm
  4. Triển khai giải pháp trong các Chức năng Cloud Run không có máy chủ
  5. Tải hình ảnh lên Gemini và tạo câu lệnh mô tả hình ảnh.
  6. Tạo kết quả tìm kiếm dựa trên câu lệnh cùng với các phần nhúng tập dữ liệu thương mại điện tử.
  7. Thêm câu lệnh khác để tuỳ chỉnh câu lệnh và tạo đề xuất về kiểu.
  8. Triển khai giải pháp trong các Chức năng Cloud Run không có máy chủ

Yêu cầu

  • Một trình duyệt, chẳng hạn như Chrome hoặc Firefox
  • Một dự án trên Google Cloud đã bật tính năng thanh toán.

2. Kiến trúc

Cấu trúc cấp cao của ứng dụng như sau:

ce32f865dfe59142.png

Các phần sau đây nêu bật quy trình theo ngữ cảnh của hướng dẫn:

Quy trình truyền dẫn:

Bước đầu tiên của chúng ta là nhập dữ liệu Bán lẻ (kho hàng, nội dung mô tả sản phẩm, hoạt động tương tác của khách hàng) vào AlloyDB.

Công cụ phân tích:

Chúng ta sẽ sử dụng AlloyDB làm công cụ phân tích để thực hiện các bước sau:

  1. Trích xuất ngữ cảnh: Công cụ này phân tích dữ liệu được lưu trữ trong AlloyDB để hiểu mối quan hệ giữa các sản phẩm, danh mục, hành vi của khách hàng, v.v. (nếu có).
  2. Tạo nội dung nhúng: Nội dung nhúng (biểu diễn toán học của văn bản) được tạo cho cả truy vấn của người dùng và thông tin được lưu trữ trong AlloyDB.
  3. Tìm kiếm vectơ: Công cụ này thực hiện tìm kiếm theo mức độ tương đồng, so sánh nội dung nhúng của cụm từ tìm kiếm với nội dung nhúng của nội dung mô tả sản phẩm, bài đánh giá và dữ liệu có liên quan khác. Thao tác này sẽ xác định 25 "hàng xóm gần nhất" phù hợp nhất.

Đề xuất của Gemini:

Mảng byte hình ảnh được truyền đến mô hình Gemini thông qua API Vertex AI, cùng với lời nhắc yêu cầu mô tả bằng văn bản về trang phục trên cùng cùng với đề xuất về trang phục dưới cùng.

Tìm kiếm vectơ và RAG AlloyDB:

Nội dung mô tả về áo được dùng để truy vấn cơ sở dữ liệu. Truy vấn này chuyển đổi văn bản tìm kiếm (đề xuất của mô hình Gemini để so khớp trang phục dưới cùng) thành các mục nhúng và thực hiện Tìm kiếm vectơ trên các mục nhúng được lưu trữ trong cơ sở dữ liệu để tìm các mục gần nhất (kết quả trùng khớp). Các vectơ nhúng trong cơ sở dữ liệu AlloyDB được lập chỉ mục bằng chỉ mục ScaNN để có thể gợi nhắc tốt hơn.

Tạo hình ảnh phản hồi:

Các phản hồi đã xác thực được sắp xếp thành một mảng JSON và toàn bộ công cụ được đóng gói thành một Hàm Cloud Run không máy chủ được gọi từ Trình tạo tác nhân.

Tạo hình ảnh bằng Imagen:

Lời nhắc tạo kiểu của người dùng, đề xuất do người dùng chọn và mọi yêu cầu cá nhân hoá được kết hợp để nhắc Imagen 3 bằng một hình ảnh hiện có. Hình ảnh tạo kiểu được tạo dựa trên câu lệnh này bằng API Vertex AI.

3. Trước khi bắt đầu

Tạo một dự án

  1. Trong Google Cloud Console, trên trang bộ chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
  2. Đảm bảo bạn đã bật tính năng thanh toán cho dự án trên Cloud. Tìm hiểu cách kiểm tra xem tính năng thanh toán có được bật trên dự án hay không .
  3. Bạn sẽ sử dụng Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud và được tải sẵn bq. Nhấp vào Kích hoạt Cloud Shell ( f2ae85166a716c5c.png) ở đầu bảng điều khiển Google Cloud.
  4. Sau khi kết nối với Cloud Shell, hãy xác minh rằng bạn đã được xác thực và dự án được đặt thành mã dự án của bạn bằng lệnh sau:
gcloud auth list
  1. Chạy lệnh sau để xác nhận rằng các lệnh gcloud trong tương lai sẽ xác định chính xác dự án của bạn.
gcloud config list project
  1. Nếu dự án của bạn chưa được thiết lập, hãy sử dụng lệnh sau để thiết lập rõ ràng:
gcloud config set project <YOUR_PROJECT_ID>
  1. Bật các API bắt buộc.

Hãy truy cập vào đường liên kết này để bật API.

Nếu bỏ lỡ việc bật bất kỳ API nào, bạn luôn có thể bật API đó trong quá trình triển khai.

Để biết thêm thông tin về các lệnh và cách sử dụng gcloud, hãy tham khảo tài liệu.

4. Thiết lập cơ sở dữ liệu

Trong lớp học lập trình này, chúng ta sẽ sử dụng AlloyDB làm cơ sở dữ liệu để lưu trữ tập dữ liệu thương mại điện tử bán lẻ. Hệ thống này sử dụng các cụm để lưu trữ tất cả tài nguyên, chẳng hạn như cơ sở dữ liệu và nhật ký. Mỗi cụm có một phiên bản chính cung cấp điểm truy cập vào dữ liệu. Bảng là tài nguyên thực tế lưu trữ dữ liệu.

Hãy tạo một cụm, thực thể và bảng AlloyDB nơi tập dữ liệu thương mại điện tử sẽ được tải.

Tạo cụm và thực thể

  1. Trong Google Cloud Console, hãy tìm AlloyDB. Bạn có thể dễ dàng tìm thấy hầu hết các trang trong Cloud Console bằng cách tìm kiếm các trang đó thông qua thanh tìm kiếm của bảng điều khiển.
  2. Nhấp vào TẠO CHUỖI KHOÁ.

f76ff480c8c889aa.png

  1. Tạo cụm và thực thể bằng các giá trị sau:
  • mã cụm: "shopping-cluster"
  • password: "alloydb"
  • Tương thích với PostgreSQL 15
  • Vùng: "us-central1"
  • Mạng: "default"

538dba58908162fb.png

  1. Trong phần Mạng, khi bạn chọn mạng mặc định, tuỳ chọn sau sẽ xuất hiện. Nhấp vào THIẾT LẬP KẾT NỐI để thiết lập mạng mặc định.
    7939bbb6802a91bf.png
  2. Chọn Sử dụng phạm vi IP được phân bổ tự động rồi nhấp vào Tiếp tục. Sau khi xem xét thông tin, hãy nhấp vào TẠO KẾT NỐI. 768ff5210e79676f.png

Chờ quá trình tạo mạng mặc định hoàn tất.

  1. Trong phần Định cấu hình thực thể chính, hãy đặt Mã thực thể thành "shopping-instance"".

2bddecf6b7c7407b.png

  1. Nhấp vào CREATE CLUSTER (TẠO CLUSTER) để hoàn tất việc thiết lập cụm như sau:

24eec29fa5cfdb3e.png

5. Nhập dữ liệu

Bây giờ, đã đến lúc thêm một bảng chứa dữ liệu về cửa hàng. Chờ thực thể của bạn được tạo xong. Sau khi tạo, bạn có thể đăng nhập vào AlloyDB bằng thông tin xác thực mà bạn đã đặt khi tạo cụm.

Xác thực với cơ sở dữ liệu AlloyDB

  1. Trong Google Cloud Console, hãy chuyển đến AlloyDB. Chọn cụm chính, sau đó nhấp vào AlloyDB Studio trong bảng điều hướng bên trái:

847e35f1bf8a8bd8.png

  1. Nhập thông tin sau để xác thực với cơ sở dữ liệu AlloyDB:
  • Tên người dùng : "postgres"
  • Cơ sở dữ liệu : "postgres"
  • Mật khẩu : "alloydb"

Sau khi bạn xác thực thành công vào AlloyDB Studio, các lệnh SQL sẽ được nhập vào thẻ Trình chỉnh sửa. Bạn có thể thêm nhiều cửa sổ Trình chỉnh sửa bằng biểu tượng dấu cộng ở bên phải thẻ Trình chỉnh sửa đầu tiên.

91a86d9469d499c4.png

Bạn sẽ nhập các lệnh cho AlloyDB trong cửa sổ Trình chỉnh sửa, sử dụng các tuỳ chọn Chạy, Định dạng và Xoá nếu cần.

Bật tiện ích

Để xây dựng ứng dụng này, chúng ta sẽ sử dụng các tiện ích "pgvector" và "google_ml_integration".

  • Tiện ích pgvector cho phép bạn lưu trữ và tìm kiếm các vectơ nhúng.
  • Tiện ích google_ml_integration cung cấp các hàm mà bạn sử dụng để truy cập vào các điểm cuối dự đoán của Vertex AI nhằm nhận thông tin dự đoán trong SQL.
  1. Bật các tiện ích này bằng cách chạy các DDL sau:
CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector
;
  1. Xác minh xem các tiện ích đã được cài đặt hay chưa bằng cách chạy lệnh SQL sau:
select extname, extversion from pg_extension;

Tạo bảng

  1. Tạo bảng bằng câu lệnh DDL sau:
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) );

Sau khi thực thi thành công lệnh trên, bạn sẽ có thể xem bảng trong

cơ sở dữ liệu. Hình ảnh sau đây cho thấy một ví dụ:

908e33bbff58a6d.png

Nhập dữ liệu

Đối với lớp học này, chúng ta có dữ liệu kiểm thử gồm khoảng 200 bản ghi trong tệp SQL này. Tệp này chứa id, category, sub_category, uri, imagecontent. Các trường khác sẽ được điền vào sau trong lớp học lập trình.

  1. Sao chép 20 dòng/câu lệnh chèn từ tệp SQL trong thẻ Trình chỉnh sửa mới trong AlloyDB Studio rồi nhấp vào RUN (CHẠY).
  1. Mở rộng phần Explorer (Trình khám phá) cho đến khi bạn thấy bảng có tên apparels.
  2. Nhấp vào biểu tượng trình đơn [] rồi nhấp vào Truy vấn. Câu lệnh SELECT sẽ mở trong thẻ Trình chỉnh sửa mới.

b31ece70e670ab89.png

  1. Nhấp vào Run (Chạy) để xác minh rằng các hàng đã được chèn.

Cấp quyền cho người dùng

Chúng ta sẽ cấp quyền cho người dùng postgres để tạo các phần nhúng từ trong AlloyDB. Trong AlloyDB Studio, hãy chạy câu lệnh sau để cấp quyền thực thi trên hàm embedding cho người dùng postgres:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Cấp VAI TRÒ Người dùng Vertex AI cho tài khoản dịch vụ AlloyDB

Chúng ta sẽ sử dụng các mô hình nhúng văn bản của Vertex AI để tạo các mục nhúng cho ROLE Người dùng Vertex AI cho tài khoản dịch vụ AlloyDB.

Trong Google Cloud Console, hãy nhấp vào biểu tượng cửa sổ dòng lệnh Cloud Shell [ f2ae85166a716c5c.png] rồi chạy lệnh sau:

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. Tạo bối cảnh

Để tạo một phần nhúng, chúng ta cần có context, tức là tất cả thông tin mà chúng ta muốn đưa vào một trường duy nhất. Chúng ta sẽ thực hiện việc này bằng cách tạo nội dung mô tả sản phẩm mà chúng ta sẽ lưu trữ trong cột pdt_desc trong bảng apparels.

Trong trường hợp này, chúng ta sẽ sử dụng tất cả thông tin về từng sản phẩm. Tuy nhiên, khi bạn làm việc này với dữ liệu của riêng mình, hãy thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn thấy có ý nghĩa cho doanh nghiệp của mình.

Trong thẻ Trình chỉnh sửa AlloyDB Studio, hãy chạy lệnh sau để cập nhật trường pdt_desc bằng dữ liệu ngữ cảnh:

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 này tạo một bản tóm tắt ngữ cảnh đơn giản bằng cách sử dụng thông tin từ tất cả các trường có trong bảng và các phần phụ thuộc khác (nếu có trong trường hợp sử dụng của bạn). Để tạo thông tin và bối cảnh chính xác hơn, hãy thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn thấy có ý nghĩa đối với doanh nghiệp của mình.

7. Tạo nội dung nhúng cho ngữ cảnh

Máy tính xử lý số dễ dàng hơn nhiều so với xử lý văn bản. Hệ thống nhúng chuyển đổi văn bản thành một loạt số dấu phẩy động đại diện cho văn bản đó, bất kể văn bản được viết như thế nào, sử dụng ngôn ngữ nào, v.v.

Hãy cân nhắc việc mô tả một địa điểm bên bờ biển. Nó có thể được gọi là "on the water", "beachfront", "walk from your room to the ocean", "sur la mer", "на берегу океана", v.v. Tất cả các thuật ngữ này đều có vẻ khác nhau, nhưng ý nghĩa ngữ nghĩa của chúng hoặc trong thuật ngữ học máy, các thuật toán nhúng của chúng phải rất gần nhau.

Giờ đây, khi dữ liệu và ngữ cảnh đã sẵn sàng, chúng ta sẽ chạy SQL để thêm các phần nhúng của cột nội dung mô tả sản phẩm(pdt_desc) vào bảng trong trường embedding. Bạn có thể sử dụng nhiều mô hình nhúng. Chúng ta sẽ sử dụng text-embedding-005 từ Vertex AI.

  1. Trong AlloyDB Studio, hãy chạy lệnh sau để tạo các phần nhúng và cập nhật cột pdt_desc bằng các phần nhúng cho dữ liệu mà cột này lưu trữ:
UPDATE
 apparels
SET
 embedding
= embedding( 'text-embedding-005',
   pdt_desc
)
WHERE
 TRUE
;
  1. Xác minh rằng các phần nhúng được tạo bằng cách chạy lệnh sau:
SELECT
 id
,
 category
,
 sub_category
,
 content
,
 embedding
FROM
 
Apparels
LIMIT
5;

Sau đây là một vectơ nhúng mẫu, trông giống như một mảng số thực, cho văn bản mẫu trong truy vấn như sau:

c69c08d085389f74.png

8. Tìm kiếm vectơ

Giờ đây, bảng, dữ liệu và nội dung nhúng đã sẵn sàng, hãy thực hiện tìm kiếm vectơ theo thời gian thực cho văn bản tìm kiếm của người dùng.

Giả sử văn bản tìm kiếm của người dùng là "pink color, casual, pure cotton tops for women"

Để tìm nội dung trùng khớp cho truy vấn này, hãy chạy truy vấn SQL sau:

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;

Hãy cùng xem chi tiết truy vấn này:

Trong truy vấn này,

  1. Văn bản tìm kiếm của người dùng là: "I want womens tops, pink casual only pure cotton."
  2. Chúng ta sẽ chuyển đổi văn bản tìm kiếm này thành nội dung nhúng bằng phương thức embedding() cùng với mô hình: text-embedding-005. Bước này sẽ trông quen thuộc sau bước cuối cùng, khi chúng ta áp dụng hàm nhúng cho tất cả các mục trong bảng.
  3. "<=>" thể hiện việc sử dụng phương thức khoảng cách COSINE SIMILARITY (TƯƠNG ĐỒNG COSINE). Bạn có thể tìm thấy tất cả các chỉ số tương đồng có trong tài liệu về pgvector.
  4. Chúng ta sẽ chuyển đổi kết quả của phương thức nhúng thành loại dữ liệu vectơ để tương thích với các vectơ được lưu trữ trong cơ sở dữ liệu.
  5. LIMIT 5 cho biết chúng ta muốn trích xuất 5 từ gần nhất cho văn bản tìm kiếm.

Sau đây là ví dụ về phản hồi của truy vấn SQL này:

4193a68737400535.png

Như bạn có thể quan sát trong kết quả, các cụm từ trùng khớp khá gần với văn bản tìm kiếm. Hãy thử thay đổi màu sắc để xem kết quả thay đổi như thế nào.

Chỉ mục AlloyDB ScaNN để tăng hiệu suất truy vấn

Giả sử chúng ta muốn tăng hiệu suất (thời gian truy vấn), hiệu quả và khả năng gợi nhắc của kết quả Tìm kiếm vectơ này bằng cách sử dụng chỉ mục ScaNN.

Nếu bạn muốn sử dụng chỉ mục ScaNN, hãy thử các bước sau:

  1. Vì đã tạo cụm, thực thể, ngữ cảnh và nội dung nhúng, nên chúng ta chỉ cần cài đặt tiện ích ScaNN bằng câu lệnh sau:
CREATE EXTENSION IF NOT EXISTS alloydb_scann;
  1. Tạo chỉ mục ScaNN:
CREATE INDEX apparel_index ON apparels
USING scann
(embedding cosine)
WITH
(num_leaves=54);

Trong DDL trên:

  • apparel_index là tên của chỉ mục.
  • apparels là tên bảng.
  • scann là phương thức chỉ mục.
  • embedding là cột trong bảng mà bạn muốn lập chỉ mục.
  • cosine là phương thức khoảng cách mà bạn muốn sử dụng với chỉ mục.
  • 54 là số lượng phân vùng cần áp dụng cho chỉ mục này. Đặt thành giá trị bất kỳ trong khoảng từ 1 đến 1048576. Để biết thêm thông tin về cách quyết định giá trị này, hãy xem phần Điều chỉnh chỉ mục ScaNN.

Theo đề xuất trong kho lưu trữ ScaNN, chúng tôi đã sử dụng căn bậc hai của số điểm dữ liệu. Khi phân vùng, num_leaves phải gần bằng căn bậc hai của số điểm dữ liệu.

  1. Kiểm tra xem chỉ mục có được tạo bằng truy vấn hay không:
SELECT * FROM pg_stat_ann_indexes;
  1. Thực hiện Tìm kiếm vectơ bằng chính truy vấn mà chúng ta đã sử dụng mà không có chỉ mục:
select * from apparels
   ORDER BY embedding
<=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))
   LIMIT
20

Truy vấn ở trên giống với truy vấn chúng ta đã sử dụng trong lớp học lập trình ở bước 8. Tuy nhiên, giờ đây, chúng ta đã lập chỉ mục trường bằng chỉ mục ScaNN.

  1. Thử nghiệm bằng một cụm từ tìm kiếm đơn giản có và không có chỉ mục. Để kiểm thử mà không có chỉ mục, bạn phải xoá chỉ mục:

white tops for girls without any print

Văn bản tìm kiếm ở trên trong truy vấn Tìm kiếm vectơ trên dữ liệu nhúng ĐƯỢC LẬP CHỈ MỤC sẽ mang lại kết quả tìm kiếm chất lượng và hiệu quả. Hiệu suất được cải thiện đáng kể (theo thời gian thực thi: 10,37 mili giây không có ScaNN và 0,87 mili giây ScaNN) với chỉ mục. Để biết thêm thông tin về chủ đề này, vui lòng tham khảo blog này.

9. Xác thực kết quả bằng LLM

Trước khi tiếp tục và tạo một dịch vụ để trả về kết quả phù hợp nhất cho một ứng dụng, hãy sử dụng mô hình AI tạo sinh để xác thực xem những câu trả lời tiềm năng này có thực sự phù hợp và an toàn để chia sẻ với người dùng hay không.

Đảm bảo thực thể được thiết lập cho Gemini

  1. Xác minh rằng bạn đã bật google_ml_integration cho Cụm và Thực thể của mình. Trong AlloyDB Studio, hãy chạy lệnh sau:
show google_ml_integration.enable_model_support;

Nếu giá trị hiển thị là "bật", bạn có thể bỏ qua 2 bước tiếp theo và chuyển thẳng đến phần thiết lập

tính năng tích hợp AlloyDB và Mô hình Vertex AI.

  1. Chuyển đến thực thể chính của cụm AlloyDB rồi nhấp vào CHỈNH SỬA THỰC THỂ CHÍNH.

456ffdf292d3c0e0.png

  1. Trong phần Advanced configuration options (Tuỳ chọn cấu hình nâng cao), hãy mở rộng phần database flag (Cờ cơ sở dữ liệu) mới và đảm bảo rằng google_ml_integration.enable_model_support flag được đặt thành "on" như sau:

6a59351fcd2a9d35.png 3. Nếu bạn chưa đặt giá trị này thành "on", hãy đặt thành "on" rồi nhấp vào UPDATE INSTANCE (CẬP NHẬT MẪU).

Bước này sẽ mất vài phút.

Tích hợp AlloyDB và Mô hình Vertex AI

Giờ đây, bạn có thể kết nối với AlloyDB Studio và chạy câu lệnh DML sau để thiết lập quyền truy cập vào mô hình Gemini từ AlloyDB, sử dụng mã dự án của bạn ở nơi được chỉ định. Bạn có thể nhận được cảnh báo về lỗi cú pháp trước khi chạy lệnh, nhưng lệnh này sẽ chạy tốt.

  1. Trong Google Cloud Console, hãy chuyển đến AlloyDB. Chọn cụm chính, sau đó nhấp vào AlloyDB Studio trong bảng điều hướng bên trái.
  2. Chúng ta sẽ sử dụng gemini-1.5-pro:generateContent có sẵn theo mặc định với tiện ích google_ml_integration. cdb5af753a625777.png
  3. Bạn có thể kiểm tra các mô hình được định cấu hình để truy cập thông qua lệnh sau trong AlloyDB Studio:
select model_id,model_type from google_ml.model_info_view;        
  1. Cấp quyền cho người dùng cơ sở dữ liệu thực thi hàm ml_predict_row để chạy các dự đoán bằng mô hình Google Vertex AI bằng cách chạy lệnh sau:
GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Đánh giá phản hồi

Mặc dù chúng ta sẽ sử dụng một truy vấn lớn cho phần tiếp theo, nơi chúng ta thực sự đưa ứng dụng lên Cloud Run, nhưng để đảm bảo các phản hồi từ truy vấn là hợp lý, truy vấn này có thể khó hiểu.

Chúng ta sẽ xem xét từng phần riêng lẻ để tạo truy vấn lớn hơn mà cuối cùng chúng ta sẽ sử dụng.

  1. Trước tiên, chúng ta sẽ gửi một yêu cầu đến cơ sở dữ liệu để lấy 5 kết quả phù hợp nhất với truy vấn của người dùng. Chúng ta sẽ mã hoá cứng truy vấn để đơn giản hoá việc này, nhưng đừng lo, chúng ta sẽ nội suy truy vấn đó vào sau.

Chúng ta sẽ thêm nội dung mô tả sản phẩm từ bảng apparels và thêm hai trường mới – một trường kết hợp nội dung mô tả với chỉ mục và một trường khác với yêu cầu ban đầu. Dữ liệu này đang được lưu trong một bảng có tên là xyz, đây là tên bảng tạm thời.

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;

Kết quả của truy vấn này sẽ là 5 hàng tương tự nhất liên quan đến cụm từ tìm kiếm của người dùng. 2

bảng mới xyz sẽ chứa 5 hàng, mỗi hàng sẽ có các cột sau:

  • literature
  • content
  • user_text
  1. Để xác định độ hợp lệ của các câu trả lời, chúng ta sẽ sử dụng một truy vấn phức tạp để giải thích cách đánh giá các câu trả lời. Hàm này sử dụng user_textcontent trong bảng xyz như một phần của truy vấn.
"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. Sau đó, bằng cách sử dụng truy vấn đó, chúng ta sẽ xem xét "độ tốt" của các phản hồi trong bảng xyz. Khi nói đến độ tốt, chúng tôi muốn nói đến mức độ chính xác của các câu trả lời được tạo ra so với những gì chúng tôi mong đợi.
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 trả về kết quả ở định dạng JSON. Mã "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" được dùng để trích xuất văn bản thực tế từ JSON đó. Để xem JSON thực tế được trả về, bạn có thể xoá mã này.
  2. Cuối cùng, để lấy trường LLM, bạn chỉ cần trích xuất trường đó từ bảng x:
SELECT 
LLM_RESPONSE
FROM
        x
;
  1. Bạn có thể kết hợp các thông tin này thành một truy vấn như sau:

Cảnh báo: Nếu bạn đã chạy các truy vấn trên để kiểm tra kết quả trung gian,

hãy đảm bảo rằng bạn xoá/loại bỏ các bảng xyzx khỏi cơ sở dữ liệu AlloyDB trước khi chạy truy vấn này,

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;

Truy vấn lớn hơn là sự kết hợp của tất cả các truy vấn mà chúng ta chạy ở các bước trước. Kết quả sẽ cho biết liệu có trùng khớp hay không, tỷ lệ phần trăm trùng khớp và một số nội dung giải thích về điểm xếp hạng.

Xin lưu ý rằng theo mặc định, mô hình Gemini có tính năng truyền trực tuyến bật, vì vậy, câu trả lời thực tế được phân bổ trên nhiều dòng: 14e74d71293b7b9.png

10. Chuyển ứng dụng sang web

Bây giờ, chúng ta sẽ lưu trữ ứng dụng này để có thể truy cập từ Internet.

Tạo hàm Cloud Run

  1. Trong Google Cloud Console, hãy chuyển đến Cloud Run Functions bằng đường liên kết sau:

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

  1. Trong phần Định cấu hình, hãy đặt Tên hàm thành "retail-engine" và chọn khu vực là "us-central1".
  2. Trong URL điểm cuối, hãy chọn môi trường thời gian chạy là Java 17.
  3. Trong phần Xác thực, hãy chọn Cho phép các lệnh gọi chưa xác thực.
  4. Mở rộng mục (Các) vùng chứa, Dung lượng, Kết nối mạng, Bảo mật rồi nhấp vào thẻ Kết nối mạng.
  5. Chọn Kết nối với VPC cho lưu lượng truy cập đi, sau đó nhấp vào Sử dụng trình kết nối Cho phép truy cập VPC không máy chủ.
  6. Trong Mạng, hãy nhấp vào Thêm trình kết nối VPC mới. Bật Serverless VPC Access API (API Truy cập VPC không máy chủ) nếu bạn chưa bật.
  7. Trong phần Tạo trình kết nối, hãy đặt tên thành alloydb-test-conn.
  8. Đặt vùng thành us-central.
  9. Để giá trị Mạng ở chế độ mặc định và đặt Mạng con thành Dải IP tuỳ chỉnh với dải IP là 10.8.0.0 hoặc một dải IP tương tự có sẵn.
  10. Mở rộng chế độ cài đặt Hiển thị tỷ lệ và đặt Số lượng thực thể tối thiểu thành 2 và Số lượng thực thể tối đa thành 3.
  11. Chọn Loại thực thể là f1-micro. Sau đây là các tuỳ chọn Tạo trình kết nối:

bed4b2af6795a8ba.png

  1. Nhấp vào Tạo để tạo trình kết nối.
  2. Trong mục Định tuyến lưu lượng truy cập, hãy chọn Định tuyến tất cả lưu lượng truy cập đến VPC.
  3. Nhấp vào Create (Tạo) để tạo hàm.

Triển khai ứng dụng

Sau khi tạo hàm, hãy cập nhật nguồn và triển khai lại ứng dụng.

  1. Trong Cloud Run, hãy nhấp vào thẻ Services (Dịch vụ) rồi nhấp vào hàm retail-engine.
  2. Nhấp vào thẻ Nguồn. Đặt Điểm truy cập hàm mặc định thành "gcfv2.HelloHttpFunction".
  3. Thay thế nội dung của tệp HelloHttpFunction.java bằng nội dung của tệp Java này.
  4. Cập nhật thông tin chi tiết về AlloyDbJdbcConnector trong tệp theo thông tin chi tiết về thực thể và cụm AlloyDB. Thay thế $PROJECT_ID bằng mã dự án của cụm và phiên bản AlloyDB.

a89dc5af3580fbcf.png

  1. Thay thế nội dung của tệp pom.xml bằng nội dung của tệp XML này.
  2. Nhấp vào Lưu và triển khai lại để triển khai hàm.

11. Kiểm thử ứng dụng công cụ bán lẻ

Sau khi triển khai Chức năng đám mây đã cập nhật, bạn sẽ thấy điểm cuối ở định dạng sau:

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

Bạn có thể kiểm thử từ Cửa sổ dòng lệnh Cloud Shell bằng cách chạy lệnh sau:

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

Ngoài ra, bạn có thể kiểm thử Hàm Cloud Run như sau:

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 .

Và kết quả:

88bc1ddfb5644a28.png

Giờ đây, khi đã chạy tìm kiếm vectơ tương đồng bằng mô hình nhúng trên dữ liệu AlloyDB, chúng ta có thể chuyển sang tạo ứng dụng sử dụng các mục nhúng này cùng với hình ảnh của bạn và lời nhắc tạo đề xuất tạo kiểu

12. Tìm hiểu quy trình đề xuất trang phục

Ứng dụng đề xuất trang phục là một ứng dụng khởi động nhanh được định cấu hình để hoạt động với các phần nhúng mà chúng tôi đã tạo trong ứng dụng công cụ bán lẻ AlloyDB cùng với Gemini và Imagen để tạo các lựa chọn tạo kiểu trang phục trực quan. Công cụ này cũng cho phép bạn thêm lời nhắc tuỳ chỉnh và điều chỉnh đề xuất.

Hãy xem xét ví dụ sau: bạn tải hình ảnh một chiếc áo màu hồng nóng bỏng trong tủ quần áo lên ứng dụng này. Khi bạn nhấp vào Show (Hiển thị), dựa trên câu lệnh được đặt trong mã ứng dụng và các mục nhúng trong cơ sở dữ liệu AlloyDB, ứng dụng sẽ tạo ra nhiều lựa chọn phù hợp với hình ảnh gốc. Bây giờ, bạn muốn biết các lựa chọn được đề xuất sẽ trông như thế nào với một chiếc vòng cổ màu xanh dương, vì vậy, bạn thêm một lời nhắc trên các dòng đó rồi nhấp vào Tạo kiểu. Hình ảnh cuối cùng được tạo ra bằng cách kết hợp hình ảnh gốc và các đề xuất để tạo ra một bộ trang phục phù hợp.

Để bắt đầu tạo ứng dụng đề xuất trang phục, hãy làm theo các bước sau:

  1. Trong Cloud Run, hãy mở ứng dụng retail-engine và ghi lại URL của ứng dụng. Đây là kho lưu trữ nội dung nhúng mà chúng ta sẽ sử dụng để tạo các đề xuất tương tự.
  2. Trong IDE, hãy sao chép kho lưu trữ https://github.com/AbiramiSukumaran/outfit-recommender/. Đối với bài tập này, các bước được thực hiện trong IDE Visual Studio Code.
git clone https://github.com/AbiramiSukumaran/outfit-recommender/

Sau đây là một số tệp quan trọng trong thư mục của ứng dụng:

  • src/main: Thư mục nguồn chứa các tệp ứng dụng và HTML:
  • HelloWorldApplication.java: Điểm truy cập chính cho ứng dụng khởi động mùa xuân.
  • HelloWorldController.java: Trình điều khiển Spring Boot REST xử lý các yêu cầu HTTP liên quan đến ứng dụng đề xuất trang phục. Tệp này xử lý các yêu cầu GET và POST, xử lý lời nhắc của người dùng, phân tích hình ảnh, tương tác với các phần nhúng AlloyDB và trả về phản hồi cuối cùng cho giao diện người dùng. Trình điều khiển này gọi lớp GenerateImageSample.
  • GenerateImageSample.java: Chứa lớp tạo hình ảnh kết nối với Vertex AI, định dạng lời nhắc của người dùng, thực hiện lệnh gọi API đến mô hình Imagen, trả về hình ảnh được dự đoán cho lớp điều khiển.
  • Resources: Thư mục này chứa hình ảnh và tệp HTML cần thiết để tạo giao diện người dùng của ứng dụng.
  • Pom.xml: Xác định các phần phụ thuộc và cấu hình của dự án.
  1. Trong mã Visual Studio, hãy mở HelloWorldController.java và cập nhật các thực thể của mã nhận dạng dự án và vị trí theo vị trí tạo thực thể AlloyDB.

9fff8f5cbb62567.png

  1. Cập nhật endpoint thành URL ứng dụng công cụ bán lẻ mà bạn đã lưu trữ trước đó.

ae6227e88eec5485.png

  1. Mở GenerateImageSample.java rồi cập nhật mã dự án và vị trí theo nơi bạn tạo thực thể AlloyDB.

db1f81a6f51d80de.png

  1. Lưu tất cả tệp.

Bây giờ, chúng ta sẽ triển khai ứng dụng này vào môi trường thời gian chạy không có máy chủ của Cloud Run.

13. Đưa ứng dụng lên web

Giờ đây, khi đã thêm dự án, vị trí và thông tin chi tiết về ứng dụng công cụ bán lẻ có liên quan vào ứng dụng khởi động mùa xuân của trình đề xuất trang phục, chúng ta có thể triển khai ứng dụng này cho Cloud Run.

Chúng ta sẽ sử dụng lệnh gcloud run deploy trong thiết bị đầu cuối Visual Code Studio để triển khai ứng dụng. Đối với Visual Studio Code, bạn có thể cài đặt tiện ích Google Cloud Code để bắt đầu sử dụng gcloud CLI.

Để triển khai ứng dụng, hãy làm theo các bước sau:

  1. Trong IDE, hãy mở thư mục được nhân bản và khởi động dòng lệnh. Đối với Visual Code Studio, hãy nhấp vào Terminal (Cổng) > New Terminal (Cổng mới).
  2. Làm theo hướng dẫn trong tài liệu này để cài đặt gcloud CLI.
  3. Nếu bạn đang sử dụng Visual Code Studio, hãy nhấp vào Extensions (Tiện ích), tìm Google Cloud Code rồi cài đặt tiện ích đó.
  4. Trong dòng lệnh IDE, hãy xác thực Tài khoản Google của bạn bằng cách chạy lệnh sau:
gcloud auth application-default login
  1. Đặt mã dự án của bạn thành cùng một dự án chứa thực thể AlloyDB.
gcloud config set project PROJECT_ID
  1. Bắt đầu quy trình triển khai.
gcloud run deploy
  1. Trong Source code location, hãy nhấn Enter để chọn thư mục GitHub đã nhân bản.
  2. Trong Service name, hãy nhập tên cho dịch vụ, chẳng hạn như outfit-recommender rồi nhấn Enter.
  3. Trong Please specify a region, hãy nhập vị trí lưu trữ thực thể AlloyDB và ứng dụng retail-engine, chẳng hạn như 32 cho us-central1, rồi nhấn Enter.

12c0de4248660d4d.png

  1. Trong Allow unauthenticated invocations to [..], hãy nhập Y rồi nhấn Enter.

Hình ảnh sau đây cho thấy tiến trình triển khai ứng dụng:

1babbb82faa31fce.png

14. Kiểm thử ứng dụng đề xuất trang phục

Sau khi ứng dụng được triển khai thành công trên Cloud Run, bạn có thể thấy dịch vụ này trong Google Cloud Console như sau:

  1. Trong Google Cloud Console, hãy chuyển đến Cloud Run.
  2. Trong phần Dịch vụ, hãy nhấp vào dịch vụ đề xuất trang phục mà bạn đã triển khai. Bạn sẽ thấy cả dịch vụ retail-engineoutfit-recommender như sau:

24dd0aebe224059e.png

  1. Nhấp vào URL ứng dụng để mở giao diện người dùng của ứng dụng đề xuất.

cdc9c1625b1648d2.png

    The following is a sample URL that you will use:

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

Bạn có thể xem ứng dụng đã triển khai như sau:

76245d1a6152d313.png

Sử dụng ứng dụng

Để bắt đầu sử dụng ứng dụng, hãy làm theo các bước sau:

  1. Nhấp vào Tải lên rồi tải ảnh một bộ quần áo lên.
  2. Sau khi tải hình ảnh lên, hãy nhấp vào Kiểu. Ứng dụng sử dụng hình ảnh làm câu lệnh và tạo các tuỳ chọn dưới cùng dựa trên câu lệnh từ ứng dụng công cụ bán lẻ, trong đó có các phần nhúng cho tập dữ liệu bán lẻ.

Ứng dụng sẽ tạo các đề xuất về hình ảnh cùng với một câu lệnh dựa trên hình ảnh có các đề xuất về kiểu. Ví dụ: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.

  1. Bạn có thể truyền các câu lệnh khác đến đề xuất kiểu được tạo tự động này. Ví dụ: STYLE RECOMMENDATION: Cute brown skirt on a curly updo. Make it photo realistic. Accessorize with cherry earrings and burgundy plastic case sling bag.
  2. Nhấp vào Hiện để xem kiểu cuối cùng.

38d6d08e9a0a44c0.png

15. Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud của bạn đối với các tài nguyên được sử dụng trong bài đăng này, hãy làm theo các bước sau:

  1. Trong Google Cloud Console, hãy chuyển đến trang Quản lý tài nguyên.
  2. Trong danh sách dự án, hãy chọn dự án mà bạn muốn xoá, rồi nhấp vào Xoá.
  3. Trong hộp thoại, hãy nhập mã dự án, sau đó nhấp vào Shut down (Tắt) để xoá dự án.

16. Xin chúc mừng

Xin chúc mừng! Bạn đã thực hiện thành công một lượt tìm kiếm tương đồng bằng cách sử dụng AlloyDB, pgvector và tìm kiếm vectơ, kết hợp với việc sử dụng kết quả tìm kiếm với mô hình Imagen mạnh mẽ để tạo đề xuất về kiểu.