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 được bộ trang phục hoàn hảo mà còn đưa ra lời khuyên về phong cách theo thời gian thực, tất cả là nhờ sức mạnh của việc tích hợp AI tạo sinh tiên tiến! Trong buổi nói chuyện này, chúng ta sẽ khám phá cách chúng tôi tạo ra một ứng dụng như vậy bằng cách sử dụng các chức 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 cực nhanh các trang phục phù hợp và đưa ra các đề 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 ra các đề xuất về phong cách phù hợp với từng cá nhân. 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 về phong cách sáng tạo và thậm chí là hình dung 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 một cấu trúc không máy chủ, đảm bảo mang lại trải nghiệm liền mạch và có khả năng mở rộng cho người dùng.
Thử thách: Bằng cách đưa ra các đề xuất trang phục được cá nhân hóa, ứng dụng này có ý định giúp đỡ những người gặp khó khăn trong việc quyết định mặc gì. Điều này cũng giúp bạn tránh cảm thấy mệt mỏi khi phải đưa ra quyết định chọn trang phục.
Giải pháp: Ứng dụng gợi ý 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 cá nhân hoá và hấp dẫn, đồng thời thể hiện các khả năng của AlloyDB, AI tạo sinh và công nghệ không máy chủ.
Sản phẩm bạn sẽ tạo ra
Trong phần này của khoá học, bạn sẽ:
- Tạo một phiên bản AlloyDB và tải Tập dữ liệu thương mại điện tử
- Bật tiện ích mô hình AI tạo sinh và pgvector trong AlloyDB
- Tạo các vectơ nhúng từ nội dung mô tả sản phẩm
- Triển khai giải pháp trong các hàm Cloud Run không máy chủ
- Tải một hình ảnh lên Gemini để tạo câu lệnh mô tả hình ảnh.
- Tạo kết quả tìm kiếm dựa trên câu lệnh kết hợp với các mục nhúng tập dữ liệu thương mại điện tử.
- Thêm câu lệnh bổ sung để tuỳ chỉnh câu lệnh và tạo đề xuất về phong cách.
- Triển khai giải pháp trong các hàm Cloud Run không máy chủ
Yêu cầu
2. Kiến trúc
Sau đây là cấu trúc cấp cao của ứng dụng:

Các phần sau đây làm nổi bật quy trình theo bối cảnh của hướng dẫn:
Nhập:
Bước đầu tiên là nhập dữ liệu Bán lẻ (kho hàng, nội dung mô tả sản phẩm, lượt tương tác của khách hàng) vào AlloyDB.
Công cụ phân tích:
Chúng tôi sẽ sử dụng AlloyDB làm công cụ phân tích để thực hiện những việc sau:
- Trích xuất bối 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 sản phẩm, hành vi của khách hàng, v.v. (nếu có).
- Tạo thông tin nhúng: Thông tin nhúng (biểu diễn văn bản bằng toán học) được tạo cho cả cụm từ tìm kiếm của người dùng và thông tin được lưu trữ trong AlloyDB.
- Tìm kiếm vectơ: Công cụ này thực hiện tìm kiếm tương tự, so sánh vectơ nhúng của cụm từ tìm kiếm với vectơ nhúng của nội dung mô tả sản phẩm, bài đánh giá và các dữ liệu liên quan khác. Thao tác này xác định 25 "láng giềng 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 Vertex AI API, cùng với câu lệnh yêu cầu mô tả bằng văn bản về trang phục phần trên cùng với các đề xuất về trang phục phần dưới.
RAG và tính năng tìm kiếm vectơ của AlloyDB:
Nội dung mô tả về áo mặc ngoài đượ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 về quần áo mặc dưới) 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 nhúng gần nhất (kết quả phù hợp). Các bản nhúng vectơ trong cơ sở dữ liệu AlloyDB được lập chỉ mục bằng chỉ mục ScaNN để tăng khả năng thu hồi.
Tạo hình ảnh trong câu trả lời:
Các phản hồi đã xác thực được cấu trúc 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:
Câu lệnh 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á sẽ đượ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 Vertex AI API.
3. Trước khi bắt đầu
Tạo dự án
- Trong Google Cloud Console, trên trang chọn dự án, hãy chọn hoặc tạo một dự án trên Google Cloud.
- Đảm bảo rằng 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 trong một dự án hay không .
- 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 (
) ở đầu bảng điều khiển Cloud. - 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
- Chạy lệnh sau để xác nhận rằng các lệnh gcloud trong tương lai sẽ xác định đúng dự án của bạn.
gcloud config list project
- Nếu dự án của bạn chưa được thiết lập, hãy dùng lệnh sau để thiết lập một cách rõ ràng:
gcloud config set project <YOUR_PROJECT_ID>
- Bật các API bắt buộc.
Hãy nhấp vào đường liên kết để bật API.
Nếu quên bật 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 phòng thí nghiệm 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ẻ. Nền tảng này sử dụng 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 thực thể chính cung cấp một đ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 để tải tập dữ liệu thương mại điện tử.
Tạo một cụm và phiên bản
- Trong Google Cloud Console, hãy tìm AlloyDB. Một cách dễ dàng để tìm hầu hết các trang trong Cloud Console là tìm kiếm các trang đó bằng thanh tìm kiếm của bảng điều khiển.
- Nhấp vào TẠO CỤM.

- Tạo một cụm và thực thể bằng các giá trị sau:
- mã cụm: "
shopping-cluster" - mật khẩu: "
alloydb" - Tương thích với PostgreSQL 15
- Khu vực: "
us-central1" - Mạng: "
default"

- Trong phần Mạng, khi bạn chọn mạng mặc định, lựa chọn sau đây 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.

- Chọn Sử dụng một dải 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.

Chờ quá trình tạo mạng mặc định hoàn tất.
- Trong phần Định cấu hình phiên bản chính, hãy đặt Mã phiên bản thành "
shopping-instance".

- Nhấp vào TẠO CỤM để hoàn tất việc thiết lập cụm như sau:

5. Nhập dữ liệu
Bây giờ, đã đến lúc thêm một bảng có 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 đăng nhập mà bạn đã thiết lập khi tạo cụm.
Xác thực với cơ sở dữ liệu AlloyDB
- Trong Google Cloud Console, hãy chuyển đến AlloyDB. Chọn cụm chính, rồi nhấp vào AlloyDB Studio trong trình đơn điều hướng bên trái:

- Nhập các thông tin chi tiết sau để xác thực vào 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 cách nhấp vào dấu cộng ở bên phải thẻ Trình chỉnh sửa đầu tiên.

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 lựa chọn Chạy, Định dạng và Xoá khi cần.
Bật tiện ích
Để tạo ứ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 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 bằng SQL.
- 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;
- 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
- 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) );
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ụ:

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. Nội dung này có id, category, sub_category, uri, image và content. Các trường khác sẽ được điền vào sau trong phòng thí nghiệm.
- Sao chép 20 dòng/câu lệnh chèn từ tệp SQL vào một thẻ Trình chỉnh sửa mới trong AlloyDB Studio, rồi nhấp vào RUN (CHẠY).
- Mở rộng phần Trình khám phá cho đến khi bạn thấy bảng có tên
apparels. - 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ở ra trong một thẻ Trình chỉnh sửa mới.

- 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 tôi sẽ cấp quyền cho người dùng postgres để tạo các mục nhúng trong AlloyDB. Trong AlloyDB Studio, hãy chạy câu lệnh sau để cấp quyền thực thi cho người dùng postgres đối với hàm embedding:
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 từ Vertex AI để tạo các giá trị nhúng mà Vertex AI User ROLE sẽ gán cho tài khoản dịch vụ AlloyDB.
Trong Google Cloud Console, hãy nhấp vào biểu tượng Cloud Shell terminal (Thiết bị đầu cuối Cloud Shell) [
] 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. Xây dựng bối cảnh
Để tạo một mục nhúng, chúng ta cần có một 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 một 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 thực hiện việc này với dữ liệu của riêng bạn, hãy thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn cho là có ý nghĩa đối với doanh nghiệp của mình.
Trong thẻ AlloyDB Studio Editor, hãy chạy lệnh sau để cập nhật trường pdt_desc bằng dữ liệu bối 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 ra nhiều thông tin và bối cảnh chính xác hơn, bạn có thể thoải mái thiết kế dữ liệu theo bất kỳ cách nào mà bạn cho là có ý nghĩa đối với doanh nghiệp của mình.
7. Tạo các vectơ nhúng cho bối cảnh
Máy tính xử lý các con số dễ dàng hơn nhiều so với xử lý văn bản. Một hệ thống nhúng sẽ chuyển đổi văn bản thành một chuỗi các số thực dấu phẩy động để biểu thị văn bản, bất kể văn bản đó được diễn đạt như thế nào, sử dụng ngôn ngữ gì, v.v.
Hãy cân nhắc việc mô tả một địa điểm ven biển. Có thể là "on the water", "beachfront", "walk from your room to the ocean", "sur la mer", "на берегу океана", v.v. Tất cả các cụm từ này đều có hình thức khác nhau, nhưng ý nghĩa ngữ nghĩa của chúng (hoặc theo thuật ngữ học máy, các mục nhúng của chúng) phải rất gần nhau.
Giờ đây, khi dữ liệu và bối cảnh đã sẵn sàng, chúng ta sẽ chạy SQL để thêm các mục 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 tôi đang sử dụng text-embedding-005 từ Vertex AI.
- Trong AlloyDB Studio, hãy chạy lệnh sau để tạo các mục nhúng và cập nhật cột
pdt_descbằng các mục 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;
- Xác minh rằng các mục 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 ví dụ về vectơ embeddings (có dạng một mảng số thực) cho văn bản mẫu trong truy vấn như sau:

8. Thực hiện tìm kiếm vectơ
Giờ đây, khi bảng, dữ liệu và các thành phần nhúng đều đã 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 các kết quả 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 xem xét cụm từ tìm kiếm này một cách chi tiết:
Trong truy vấn này,
- Văn bản tìm kiếm của người dùng là: "
I want womens tops, pink casual only pure cotton." - Chúng ta sẽ chuyển đổi văn bản tìm kiếm này thành các embeddings bằng phương thức
embedding()cùng với mô hình:text-embedding-005. Bước này có vẻ quen thuộc sau bước cuối cùng, trong đó chúng ta đã áp dụng hàm nhúng cho tất cả các mục trong bảng. - "
<=>" biểu thị việc sử dụng phương thức khoảng cách COSINE SIMILARITY. Bạn có thể tìm thấy tất cả các chỉ số về mức độ tương đồng có trong tài liệu của pgvector. - Chúng tôi đang chuyển đổi kết quả của phương thức nhúng thành kiểu dữ liệu vector để tương thích với các vectơ được lưu trữ trong cơ sở dữ liệu.
- LIMIT 5 cho biết chúng ta muốn trích xuất 5 hàng xóm 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:

Như bạn có thể thấy trong kết quả, các kết quả 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 ScaNN của AlloyDB để nâng cao 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 thu hồi 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:
- Vì chúng ta đã tạo cụm, thực thể, bối cảnh và các mục 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;
- 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_indexlà tên của chỉ mục.apparelslà tên bảng.scannlà phương thức chỉ mục.embeddinglà cột trong bảng mà bạn muốn lập chỉ mục.cosinelà phương thức khoảng cách mà bạn muốn sử dụng với chỉ mục.54là 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ố lượng điểm dữ liệu. Khi phân vùng, num_leaves phải xấp xỉ căn bậc hai của số lượng điểm dữ liệu.
- Kiểm tra xem chỉ mục có được tạo bằng truy vấn sau hay không:
SELECT * FROM pg_stat_ann_indexes;
- 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 cũng chính là truy vấn mà chúng ta đã dùng trong phòng thí nghiệm ở bước 8. Tuy nhiên, hiện tại, chúng tôi đã lập chỉ mục trường này bằng chỉ mục ScaNN.
- 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 cụm từ tìm kiếm Vector Search trên dữ liệu embeddings ĐƯỢ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ể (về thời gian thực thi: 10,37 mili giây không có ScaNN và 0,87 mili giây có 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ả trùng khớp bằng LLM
Trước khi chuyển sang bước tiếp theo 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
- Xác minh rằng bạn đã bật
google_ml_integrationcho Cụm và Phiên bản 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à "on", bạn có thể bỏ qua 2 bước tiếp theo và chuyển thẳng đến bước thiết lập
tích hợp AlloyDB và mô hình Vertex AI.
- Chuyển đến phiên bản chính của cụm AlloyDB rồi nhấp vào CHỈNH SỬA PHIÊN BẢN CHÍNH.

- Trong Các lựa chọn định cấu hình nâng cao, hãy mở rộng mục 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:
3. Nếu chưa đặt thành "on", hãy đặt thành "on" rồi nhấp vào UPDATE INSTANCE (CẬP NHẬT THỰC THỂ).
Bước này sẽ mất vài phút.
Tích hợp Mô hình Vertex AI và AlloyDB
Giờ đây, bạn có thể kết nối với AlloyDB Studio và chạy câu lệnh DML sau đây để thiết lập quyền truy cập vào mô hình Gemini từ AlloyDB, bằng cách 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 sẽ chạy bình thường.
- Trong Google Cloud Console, hãy chuyển đến AlloyDB. Chọn cụm chính, rồi nhấp vào AlloyDB Studio trong trình đơn điều hướng bên trái.
- Chúng ta sẽ sử dụng
gemini-1.5-pro:generateContentcó sẵn theo mặc định với tiện íchgoogle_ml_integration.
- 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;
- 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á câu trả lời
Mặc dù cuối cùng 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 vào Cloud Run, nhưng để đảm bảo các phản hồi từ truy vấn là hợp lý, truy vấn có thể khó hiểu.
Chúng ta sẽ xem xét từng phần riêng lẻ để tạo nên truy vấn lớn hơn mà chúng ta sẽ sử dụng sau cùng.
- 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 cho một cụm từ tìm kiếm của người dùng. Chúng ta sẽ mã hoá cứng truy vấn để giữ cho truy vấn này đơn giản. Tuy nhiên, đừng lo lắng, chúng ta sẽ nội suy truy vấn này vào truy vấn 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 có 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 truy vấn của người dùng. 2
Bảng xyz mới sẽ chứa 5 hàng, trong đó mỗi hàng sẽ có các cột sau:
literaturecontentuser_text
- Để xác định mức độ 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. Thao tác này sử dụng
user_textvàcontenttrong bảngxyznhư 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."
- Sau đó, bằng cách sử dụng truy vấn đó, chúng ta sẽ xem xét "mức độ phù hợp" của các câu trả lời trong bảng
xyz. Khi nói về độ phù hợp, 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;
predict_rowsẽ 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.- 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;
- Bạn có thể kết hợp các điều kiện này thành một truy vấn duy nhất như sau:
Cảnh báo: Nếu đã chạy các truy vấn ở trên để kiểm tra kết quả trung gian,
đảm bảo rằng bạn đã xoá/loại bỏ các bảng xyz và x 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 trong các bước trước đó. Kết quả cho biết có trùng khớp hay không, tỷ lệ phần trăm trùng khớp và một số giải thích về điểm xếp hạng.
Xin lưu ý rằng mô hình Gemini có tính năng truyền trực tuyến bật theo mặc định, vì vậy, câu trả lời thực tế sẽ trải rộng trên nhiều dòng: 
10. Đưa ứng dụng lên web
Giờ đây, chúng ta sẽ lưu trữ ứng dụng này để có thể truy cập vào ứng dụng từ Internet.
Tạo hàm Cloud Run
- 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
- Trong phần Định cấu hình, hãy đặt Tên hàm là "retail-engine" và chọn khu vực là "us-central1".
- Trong Endpoint URL (URL điểm cuối), hãy chọn thời gian chạy là Java 17.
- Trong phần Xác thực, hãy chọn Cho phép lệnh gọi chưa được xác thực.
- Mở rộng Container(s), Volumes, Networking, Security (Vùng chứa, Ổ đĩa, Kết nối mạng, Bảo mật), rồi nhấp vào thẻ Networking (Kết nối mạng).
- Chọn Kết nối với một VPC cho lưu lượng truy cập đi, rồi 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ủ.
- Trong phần Network (Mạng), hãy nhấp vào Add New VPC Connector (Thêm trình kết nối VPC mới). Bật Serverless VPC Access API (nếu chưa bật).
- Trong phần Create connector (Tạo trình kết nối), hãy đặt tên thành
alloydb-test-conn. - Đặt vùng thành
us-central. - Để nguyên giá trị Mạng là 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ự hiện có.
- Mở rộng chế độ cài đặt Show scaling (Hiện tính năng mở rộng quy mô), rồi đặt Minimum instances (Số phiên bản tối thiểu) thành 2 và Maximum instances (Số phiên bản tối đa) thành 3.
- Chọn Loại phiên bản là f1-micro. Sau đây là các lựa chọn để tạo trình kết nối:

- Nhấp vào Tạo để tạo trình kết nối.
- Trong phần Đị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.
- 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.
- Trong Cloud Run, hãy nhấp vào thẻ Dịch vụ rồi nhấp vào hàm retail-engine.
- Nhấp vào thẻ Nguồn. Để Điểm truy cập hàm mặc định được đặt thành "
gcfv2.HelloHttpFunction". - Thay thế nội dung của tệp HelloHttpFunction.java bằng nội dung trong tệp Java này.
- Cập nhật thông tin chi tiết về AlloyDbJdbcConnector trong tệp theo thông tin chi tiết về cụm và phiên bản AlloyDB của bạn. Thay thế
$PROJECT_IDbằng mã dự án của cụm và phiên bản AlloyDB.

- Thay thế nội dung của tệp pom.xml bằng nội dung của tệp XML này.
- Nhấp vào Lưu và triển khai lại để triển khai hàm.
11. Kiểm thử ứng dụng retail-engine
Sau khi triển khai Cloud Function đã 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ính năng này trong 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 .
Kết quả là:

Giờ đây, sau khi chạy tính năng tìm kiếm vector tương tự 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 bản nhúng này cùng với hình ảnh và câu lệnh của bạn để tạo các đề xuất về kiểu dáng
12. Tìm hiểu quy trình đề xuất trang phục
Ứng dụng gợi ý 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 mục nhúng mà chúng tôi đã tạo trong ứng dụng 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 câu lệnh tuỳ chỉnh và ứng biến đề xuất.
Hãy hình dung như sau: bạn tải hình ảnh một chiếc áo màu hồng tươi trong tủ quần áo của mình lên ứng dụng này. Khi bạn nhấp vào nút Hiển thị, dựa trên câu lệnh được đặt trong mã xử lý ứ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. Giờ đây, bạn thắc mắc không biết các lựa chọn được đề xuất sẽ trông như thế nào khi có một chiếc vòng cổ màu xanh dương, vì vậy, bạn thêm một câu lệnh theo hướng dẫn đó rồi nhấp vào Kiểu. Hình ảnh cuối cùng được tạo ra là sự kết hợp hiệu quả giữa hình ảnh gốc và các đề xuất để tạo ra một 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:
- 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ữ các vectơ nhúng mà chúng ta sẽ dùng để tạo các đề xuất tương tự.
- 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 minh hoạ sẽ đượ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 nơi các tệp ứng dụng và HTML lưu trú:HelloWorldApplication.java: Điểm truy cập chính cho ứng dụng khởi động mùa xuân.HelloWorldController.java: Bộ điều khiển REST Spring Boot xử lý các yêu cầu HTTP liên quan đến một ứ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ý câu lệnh của người dùng, phân tích hình ảnh, tương tác với các embeddings AlloyDB và trả về phản hồi cuối cùng cho giao diện người dùng. Bộ đ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 câu lệnh của người dùng, thực hiện các lệnh gọi API đến mô hình Imagen, trả về hình ảnh dự đoán cho lớp trình điều khiển.Resources: Thư mục này chứa những 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 cấu hình và phần phụ thuộc của dự án.
- Trong mã Visual Studio, hãy mở
HelloWorldController.javavà cập nhật các phiên bản của mã dự án và vị trí theo nơi bạn tạo thực thể AlloyDB.

- Cập nhật
endpointthành URL ứng dụng retail-engine mà bạn đã lưu trữ trước đó.

- 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.

- Lưu tất cả tệp.
Giờ đây, chúng ta sẽ triển khai ứng dụng này vào thời gian chạy không máy chủ của Cloud Run.
13. Đưa ứng dụng lên web
Giờ đây, sau khi thêm dự án, vị trí và chi tiết ứng dụng retail-engine có liên quan vào ứng dụng Spring Boot đề xuất trang phục, chúng ta có thể triển khai ứng dụng này vào 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:
- Trong IDE, hãy mở thư mục được sao chép và khởi động thiết bị đầu cuối. Đối với Visual Code Studio, hãy nhấp vào Terminal (Thiết bị đầu cuối) > New Terminal (Thiết bị đầu cuối mới).
- Làm theo hướng dẫn trong tài liệu này để cài đặt gcloud CLI.
- 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 này.
- Trong cửa sổ dòng lệnh của 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
- Đặt mã dự án thành cùng một dự án nơi đặt phiên bản AlloyDB của bạn.
gcloud config set project PROJECT_ID
- Bắt đầu quy trình triển khai.
gcloud run deploy
- Trong
Source code location, hãy nhấn Enter để chọn thư mục GitHub đã sao chép. - 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. - Trong
Please specify a region, hãy nhập vị trí lưu trữ thực thể AlloyDB và ứng dụng retail-engine của bạn, chẳng hạn như 32 cho us-central1, rồi nhấn Enter.

- 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 của bạn:

14. Kiểm thử ứng dụng đề xuất trang phục
Sau khi triển khai thành công ứng dụng vào Cloud Run, bạn có thể thấy dịch vụ này trong Google Cloud Console như sau:
- Trong Google Cloud Console, hãy chuyển đến Cloud Run.
- Trong mục Services (Dịch vụ), hãy nhấp vào dịch vụ outfit recommender (đề xuất trang phục) mà bạn đã triển khai. Bạn sẽ thấy cả dịch vụ retail-engine và outfit-recommender như sau:

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

The following is a sample URL that you will use:
https://outfit-recommender-22905290964.us-central1.run.app/style
Bạn có thể thấy ứng dụng đã triển khai như sau:

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:
- Nhấp vào Tải lên rồi tải ảnh chụp một món quần áo lên.
- Sau khi tải hình ảnh lên, hãy nhấp vào Kiểu. Ứng dụng này sử dụng hình ảnh làm câu lệnh và tạo các lựa chọn ở dưới cùng dựa trên câu lệnh từ ứng dụng retail-engine có chứa các mục nhúng cho tập dữ liệu bán lẻ.
Ứng dụng này tạo ra 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ó đề xuất về kiểu. Ví dụ: A white semi-sheer button up blouse with pink floral patterns on it, with balloon sleeves.
- Bạn có thể truyền thêm câu lệnh cho đề xuất về 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. - Nhấp vào Hiển thị để xem kiểu cuối cùng.

15. Dọn dẹp
Để tránh bị tính phí vào tài khoản Google Cloud của bạn cho các tài nguyên được dùng trong bài đăng này, hãy làm theo các bước sau:
- Trong bảng điều khiển Cloud, hãy chuyển đến trang Quản lý tài nguyên.
- 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á.
- Trong hộp thoại, hãy nhập mã dự án rồi nhấp vào 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 tự bằng cách sử dụng AlloyDB, pgvector và tính năng Tìm kiếm vectơ kết hợp với việc sử dụng kết quả tìm kiếm bằng mô hình Imagen mạnh mẽ để tạo đề xuất về kiểu dáng.