Chào mừng bạn đến với PetVerse!

1. Giới thiệu

Chào mừng bạn đến với Petverse! Chúng tôi chào đón tất cả thú cưng! 🐈🐶🐍🐟🦄

Điều kiện tiên quyết

  • Hiểu biết cơ bản về Google Cloud Console
  • Hiểu biết cơ bản về câu lệnh SQL

Kiến thức bạn sẽ học được

  • Tạo tập dữ liệu và bảng trong BigQuery
  • Tạo các cột ObjectRef để tham chiếu đến nội dung nghe nhìn trong một vùng lưu trữ trong BigQuery
  • Sử dụng các hàm AI trong BigQuery để cải thiện tập dữ liệu từ nội dung của dữ liệu không có cấu trúc
  • Tạo các thành phần đa phương tiện được nhúng để tìm kiếm nội dung nghe nhìn tương tự
  • Tạo các vectơ nhúng văn bản để thực hiện tìm kiếm ngữ nghĩa bằng VECTOR_SEARCH
  • Sử dụng Gemini CLI để tạo một ứng dụng web

Bạn cần có

  • Tài khoản Google Cloud và Dự án Google Cloud có Tài khoản thanh toán
  • Một trình duyệt web như Chrome

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tốc độ của riêng bạn

  1. Đăng nhập vào Google Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự mà các API của Google không sử dụng. Bạn luôn có thể cập nhật thông tin này.
  • Mã dự án là mã duy nhất trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (thường được xác định là PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có được chấp nhận hay không. Bạn không thể thay đổi tên này sau bước này và tên này sẽ tồn tại trong suốt thời gian của dự án.
  • Để bạn nắm được thông tin, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
  1. Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên/API trên Cloud. Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này, bạn có thể xoá các tài nguyên đã tạo hoặc xoá dự án. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.

3. Mở Cloud Shell

Truy cập vào https://shell.cloud.google.com/?show=ide%2Cterminal . Khi được nhắc, hãy nhấp vào Uỷ quyền.

1bfca4be2c270a9f.png

Đảm bảo cả trình chỉnh sửa và bảng điều khiển đều xuất hiện:

785d186a8b11b32b.png

4. Tạo một tập lệnh trợ giúp

Để có trải nghiệm mượt mà hơn, bạn sẽ tạo một tập lệnh trợ giúp để đặt các biến môi trường có liên quan.

Thay <<Project ID>> bằng mã dự án của bạn ở bên dưới.

Sao chép lệnh sau vào cửa sổ dòng lệnh Cloud Shell rồi nhấn phím Enter để thực thi**.**

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

Sao chép lệnh sau vào cửa sổ dòng lệnh Cloud Shell rồi nhấn phím Enter để thực thi**.** Thao tác này sẽ bật các dịch vụ cần thiết, tạo tệp và chỉnh sửa tệp đó trong Cloud Shell.

gcloud services enable compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       aiplatform.googleapis.com \
                       storage-component.googleapis.com  \
                       bigqueryconnection.googleapis.com \
run.googleapis.com \
secretmanager.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com  \
iap.googleapis.com
edit  ~/petverse-setup.sh

Bạn sẽ thấy một thẻ mới có tên của tệp. Dán tập lệnh sau vào tệp mới:

#!/bin/bash

# -----------------------------------------------------------------------------
# 1. Global Variables: Set your desired project ID and region here.
# -----------------------------------------------------------------------------

# 🦄 🦄 Set your project ID here ⬇️.

# Example: PROJECT_ID="your-project-id"
PROJECT_ID=""

# Set your desired region here. Default is 'us-central1'.
# Example: REGION="us-east1"
REGION="us-central1"

# -----------------------------------------------------------------------------
# 2. Check and Authenticate
# -----------------------------------------------------------------------------

echo "  ➡️   Checking for active Google Cloud authentication..."

# Check if the user is authenticated; if not, prompt for authentication.
if ! gcloud auth list --format="value(account)" | grep -q @; then
  echo "⚠️   Not authenticated. Please authenticate now."
  gcloud auth login
fi

echo "  ✅   Authentication check passed."

# -----------------------------------------------------------------------------
# 3. Get Project ID from User if not set
# -----------------------------------------------------------------------------

# If PROJECT_ID is not set in the script or as an environment variable,
# prompt the user to choose one.
if [[ -z "$PROJECT_ID" ]] && [[ -n "$DEVSHELL_PROJECT_ID" ]]; then
  PROJECT_ID=$DEVSHELL_PROJECT_ID
fi

if [[ -z "$PROJECT_ID" ]]; then
  echo "  ⚠️   Project ID is not set. Listing available projects:"
 
  # List projects and store them in an array.
  projects_array=($(gcloud projects list --format="value(projectId)"))
 
  # Check if projects were found.
  if [[ ${#projects_array[@]} -eq 0 ]]; then
    echo "  ❌   No projects found. Please ensure your account has access to projects."
    exit 1
  fi
 
  # Display the projects and prompt for input.
  echo " "
  echo "Available Projects:"
  for project in "${projects_array[@]}"; do
    echo "$project"
  done
 
  echo " "
  read -p "Please enter your desired project ID from the list above: " PROJECT_ID
 
  # Validate the user's input by checking if it's in the array.
  if [[ ! " ${projects_array[@]} " =~ " ${PROJECT_ID} " ]]; then
    echo "  ❌   Invalid project ID. Please run the script again and select a valid ID."
    exit 1
  fi
fi

echo "  ✅   Project ID set to: $PROJECT_ID"

# -----------------------------------------------------------------------------
# 4. Set Environment Variables
# -----------------------------------------------------------------------------

# Set the project and region for the current session.
echo "  🔄   Setting Google Cloud configuration for this session..."
gcloud config set project "$PROJECT_ID"
gcloud config set compute/region "$REGION"

echo "  ✅   Google Cloud configuration updated."
echo "Project ID: $PROJECT_ID"
echo "Region: $REGION"
echo " "
echo "  🎉 🦄 🦄   Script execution complete. You can now use Google Cloud commands in this shell session."

Thay thế phần giữ chỗ cho PROJECT_ID bằng tên dự án của bạn:

aec2195d576244dd.png

Sao chép lệnh sau và thực thi trong dòng lệnh:

chmod +x petverse-setup.sh
~/petverse-setup.sh

Kết quả đầu ra dự kiến:

83d1f7405624443b.png

5. Tạo một bộ chứa lưu trữ

Tạo một bộ chứa Cloud Storage và sao chép nội dung nghe nhìn có sẵn vào bộ chứa của riêng bạn. Bạn sẽ dùng bộ nhớ này để lưu trữ nội dung nghe nhìn có sẵn cho thú cưng đáng yêu của chúng ta. Bạn cũng sẽ tạo một kết nối để truy cập vào bộ chứa thông qua BigQuery.

Dán và thực thi nội dung sau trong thiết bị đầu cuối:

~/petverse-setup.sh
cd ~/
gcloud storage buckets create gs://$DEVSHELL_PROJECT_ID-petverse --uniform-bucket-level-access --location=us-central1
gcloud storage cp -r gs://sample-data-and-media/petverse/* gs://$DEVSHELL_PROJECT_ID-petverse/
bq mk --dataset --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID petverse
bq mk --connection --location=us-central1 --project_id=$DEVSHELL_PROJECT_ID \
--connection_type=CLOUD_RESOURCE pet-connection
echo "your bucket is gs://$DEVSHELL_PROJECT_ID-petverse "

379f72ee2908da36.png

6. Tạo bảng thú cưng

Bây giờ, bạn sẽ tạo một bảng trong BigQuery để lưu trữ thông tin về thú cưng của mình.

Mở một thẻ mới trong trình duyệt. Truy cập vào https://console.cloud.google.com/bigquery .

Đảm bảo bạn chọn cùng một dự án mà bạn đã sử dụng trong bảng điều khiển:

f82010a317866e6.png

Giờ đây, bạn có thể tạo một bảng bằng dữ liệu trong tệp pets.csv. Tệp này chứa tên, đồ ăn, đồ chơi yêu thích và những thông tin thú vị khác về thú cưng của chúng tôi.

Sao chép mã sau đây vào một truy vấn SQL mới để tạo bảng thực và tải dữ liệu.

LOAD DATA INTO petverse.pets
OPTIONS(
    description="Table for furry friend data"
  )
FROM FILES (
  skip_leading_rows=1,
  uris = ['gs://<<your_bucket_name>>/pets.csv'],
  format = 'CSV'
);

Thay thế phần giữ chỗ cho nhóm trong mã bằng nhóm mà bạn đã tạo ở bước trước.

Bạn có thể kiểm tra tất cả các vùng lưu trữ của mình trong một thẻ trình duyệt riêng biệt trỏ đến URL này: https://console.cloud.google.com/storage/browser .

757813944bb3d8ba.png

Sử dụng nút Run (Chạy) để thực thi truy vấn.

Sau khi dữ liệu được tải thành công, hãy nhấp vào Chuyển đến bảng.

d6aab61d533bedde.png

Nhấp vào Xem trước để xem nội dung của bảng. 20fb1cbf8826efca.png

7. Kết nối BigQuery với Storage Bucket

Nếu xem trong nhóm bạn đã tạo trước đó, bạn sẽ thấy một nhóm tệp nội dung nghe nhìn liên quan đến từng thú cưng.

243751f1b0aab329.gif

BigQuery có khả năng đọc vào các bộ chứa này và sử dụng các tệp cùng với dữ liệu trong bảng. Loại giá trị này được gọi là ObjectRef.

Lấy mã tài khoản dịch vụ cho mối kết nối mà bạn đã tạo trước đó bằng cách nhấp vào mối kết nối đó trong mục Kết nối bên ngoài.

1d9d3275483f5650.png

Sao chép mã tài khoản dịch vụ.

Chuyển đến Bảng điều khiển dành cho quản trị viên IAM trong một thẻ trình duyệt mới ( https://console.cloud.google.com/iam-admin/ ).

Cấp cho tài khoản dịch vụ quyền Storage Object Viewer (Người xem đối tượng lưu trữ) và Vertex AI User (Người dùng Vertex AI) (bạn sẽ sử dụng quyền này sau).

f1ff6b305d914532.png

Nhấp vào Lưu và 🕰️ đợi một vài phút.

Trong thẻ BigQuery, hãy sử dụng truy vấn sau trong BigQuery Studio để kiểm tra kết nối giữa BigQuery và bộ chứa lưu trữ.

Thay thế <<PROJECT_ID>> bằng mã dự án của bạn.

SET @@location='us-central1';
SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))

Nhấp vào Xem kết quả. Bạn sẽ nhận được siêu dữ liệu trong kết quả:

9e3d986b797e413a.png

8. Thêm phương tiện lưu trữ vào dữ liệu có cấu trúc

Bạn có thể cải thiện bảng thú cưng để thêm một cột có ảnh hồ sơ của từng thú cưng (nếu có). Bạn cũng sẽ thêm một cột khác có một mảng các mục tham chiếu đến nội dung nghe nhìn để lưu trữ tất cả các tệp khác liên quan đến từng thú cưng.

Để truy cập vào nội dung đa phương tiện, bạn cần có một mối kết nối mà bạn đã tạo khi bắt đầu lớp học lập trình này sau khi tạo vùng chứa.

Dán các lệnh sau vào bảng điều khiển SQL của BigQuery rồi thực thi các lệnh đó để thêm 2 cột vào bảng pets.

SET @@location='us-central1';
ALTER TABLE petverse.pets
ADD COLUMN IF NOT EXISTS profile_picture STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>,
ADD COLUMN IF NOT EXISTS additional_media ARRAY<STRUCT<uri STRING, version STRING, authorizer STRING, details JSON>>;

Sao chép các câu lệnh sau và thay thế phần giữ chỗ cho PROJECT_ID bằng mã dự án của bạn.

SET @@location='us-central1';

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/yoda_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Yoda_asks_for_cuddles.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 1;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/madonna_profile_picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Madonna_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 2;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pixel_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_thug_life.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pixel_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 3;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/sql_profile_picture.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_description.wav', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/SQL_favorite_toy.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 4;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/buddy_golden_retriever.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 5;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/daisy_french_bulldog.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 6;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/max_german_shepherd.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/max_description_tells_jokes.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 7;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 8;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/rocky_description.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))] WHERE Id = 9;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/pip_hamster.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/pip_Hamster_Wheel_Video_Generated.mp4', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 10;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 11;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/scales_snake.png', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = NULL
WHERE Id = 12;

UPDATE petverse.pets SET profile_picture = NULL, additional_media = NULL WHERE Id = 13;

UPDATE petverse.pets
SET profile_picture = (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/Joel_Profile_Picture.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
    additional_media = [(SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Catwalk.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Flowers.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection'))),
                       (SELECT OBJ.FETCH_METADATA(OBJ.MAKE_REF('gs://<<PROJECT_ID>>-petverse/additional_media/Joel_Plays.jpg', 'projects/<<PROJECT_ID>>/locations/us-central1/connections/pet-connection')))]
WHERE Id = 14;

Chạy câu lệnh. Bạn sẽ thấy các lượt thực thi thành công sau vài phút:

4fa3bba70440fa65.png

Kiểm tra kết quả bằng bản xem trước bảng. Bạn sẽ thấy siêu dữ liệu cho ảnh hồ sơ hiện có và nội dung nghe nhìn bổ sung cho chú mèo tên là Pixel.

SELECT *
FROM `petverse.pets`
WHERE name = 'Pixel'

a1511d749e88d5f5.png

9. Tạo nội dung mô tả về thú cưng

Nếu xem trước bảng thú cưng, bạn sẽ nhận thấy một số thú cưng (như Yoda, Pixel hoặc Rocky) bị thiếu thông tin về món ăn hoặc đồ chơi yêu thích.

Câu trả lời cho những câu hỏi này có thể nằm trong các video và âm thanh liên quan đến những thú cưng này. Bạn sẽ dùng các hàm AI được nhúng để kiểm tra.

Hãy thử với câu lệnh sau:

SELECT name,
AI.GENERATE(
   prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
    connection_id => 'us-central1.pet-connection',
    endpoint => 'gemini-2.5-flash',
output_schema => 'food STRING, toy STRING')
FROM petverse.pets
WHERE name = 'Rocky'

Bạn có thể thấy video của Rocky trong nhóm lưu trữ của mình.

Hãy sử dụng câu lệnh sau để cập nhật nội dung mô tả còn thiếu:

UPDATE petverse.pets AS p
SET FavoriteFood = aigen.food
FROM
  (
    SELECT Id, name,
          AI.GENERATE(
                prompt=> ('What are this pet\'s favorite toy and favorite foods', additional_media ),
                connection_id => 'us-central1.pet-connection',
                endpoint => 'gemini-2.5-flash',
                output_schema => 'food STRING').food
    FROM petverse.pets ) AS  aigen
WHERE p.Id = aigen.Id
AND p.FavoriteFood IS NULL
AND p.additional_media IS NOT NULL

Sử dụng câu lệnh sau để tạo nội dung mô tả về thú cưng dựa trên nội dung đa phương tiện của chúng vào một cột mới:

ALTER TABLE petverse.pets ADD COLUMN MediaDescription STRING;
UPDATE petverse.pets AS p
SET MediaDescription = aigen.description
FROM
  (
    SELECT Id, name,
          AI.GENERATE(
                prompt=> ('Create a description in an epic tone for this pet based on these media: ', additional_media ),
                connection_id => 'us-central1.pet-connection',
                endpoint => 'gemini-2.5-flash',
                output_schema => 'description STRING').description
    FROM petverse.pets ) AS  aigen
WHERE p.Id = aigen.Id
AND p.MediaDescription IS NULL
AND p.additional_media IS NOT NULL

Sau vài phút, bạn sẽ thấy một số nội dung mô tả mẫu quảng cáo:

fab3b59caa69aec7.png

10. Tạo các mục nhúng

Tạo một bảng để lưu trữ các vectơ nhúng cho ảnh hồ sơ, nội dung mô tả và sở thích để sử dụng trong tìm kiếm ngữ nghĩa. Chúng ta sẽ tìm điểm tương đồng giữa các thú cưng bằng cách sử dụng tính năng tìm kiếm vectơ.

SET @@location='us-central1';

CREATE OR REPLACE MODEL petverse.multimodalembedding
  REMOTE WITH CONNECTION `us-central1.pet-connection`
  OPTIONS(ENDPOINT = 'multimodalembedding@001');

CREATE TABLE IF NOT EXISTS petverse.profile_embeddings
AS
SELECT *
FROM ML.GENERATE_EMBEDDING(
  MODEL petverse.multimodalembedding,
    (
      SELECT profile_picture as content,
      Id
      FROM petverse.pets)
 );

CREATE OR REPLACE MODEL petverse.textembedding
  REMOTE WITH CONNECTION `us-central1.pet-connection`
  OPTIONS (ENDPOINT = 'text-embedding-005');

CREATE OR REPLACE TABLE petverse.text_embeddings AS
SELECT * FROM ML.GENERATE_EMBEDDING(
  MODEL petverse.textembedding,
  (
    SELECT CONCAT(AdoptionStory, ' . This pet\'s hobby is: ', Hobby, ' and their nickname(s) is: ', COALESCE(Nicknames, Name)) AS content,
    Id, Name
    FROM petverse.pets
    WHERE LENGTH(AdoptionStory) > 0 AND LENGTH(Hobby) > 0
  )
)
WHERE LENGTH(ml_generate_embedding_status) = 0;

Kiểm tra bảng mới trong thẻ kết quả.

c9e876d75147c343.png

Sử dụng câu lệnh sau để kiểm tra trạng thái của tất cả các mục nhúng:

SELECT DISTINCT(ml_generate_embedding_status),
  COUNT(content.uri) AS num_rows
FROM petverse.profile_embeddings
GROUP BY 1;

Nếu có lỗi, bạn sẽ thấy lỗi trong trạng thái không trống. Đây là kết quả đầu ra chính xác – không có bản ghi nào bị lỗi**:**

e6754936c31ca5cf.png

Sau đây là ví dụ về các bản ghi có lỗi. Đây không phải là những vấn đề dự kiến nhưng bạn cần phải khắc phục trước khi tiếp tục thực hiện các bước tiếp theo:

736545fbc7ce4ac8.png

Tìm thú cưng tương tự

Tập dữ liệu mặc định có các thú cưng tương tự. Sau đây là 2 ví dụ: Pixel (Mã nhận dạng: 3) và SQL (Mã nhận dạng: 4):

cfebe01afc5f4858.png

Bạn có thể sử dụng khoảng cách giữa các vectơ nhúng để tính toán các thú cưng tương tự:

SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;

Bạn sẽ nhận được kết quả là mã nhận dạng của những bức ảnh tương tự nhau. Thao tác này sẽ bao gồm mọi thứ trong bức ảnh. Trong ví dụ này, Pixel và SQL tương tự nhau, còn thú cưng tương tự tiếp theo là Joel (Mã nhận dạng: 14).

99ce203add04a6b1.png

Sau đây là hình ảnh của Joel để bạn tham khảo:

f78e0ca0fe235ba2.png

Bạn có thể sử dụng hàm VECTOR_SEARCH để tìm kiếm theo ngữ nghĩa trên các mục nhúng văn bản. Nếu bảng này lớn hơn, bạn sẽ cần tạo và lập chỉ mục cho các mục nhúng.

SELECT query.query, base.content, base.Name
FROM VECTOR_SEARCH(
  TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result',
  (
  SELECT ml_generate_embedding_result, content AS query
  FROM ML.GENERATE_EMBEDDING(
  MODEL `petverse.textembedding`,
  (SELECT 'Pets who like to relax' AS content))
  ),
  top_k => 5, options => '{"fraction_lists_to_search": 0.50}')
ORDER BY distance DESC

Hãy thử thay đổi cụm từ tìm kiếm ngữ nghĩa (Pets who like to relax) cũng như tham số fraction_lists_to_search và xem điều gì sẽ xảy ra. Bạn có thể tìm hiểu thêm về các hàm này tại đây.

11. Lập trình theo cảm hứng để tạo trang hồ sơ

Bạn sẽ dùng Gemini CLI trong Cloud Shell để bắt đầu nhanh một ứng dụng web đơn giản, mang tính minh hoạ. Ứng dụng web này đã được đơn giản hoá trong lời nhắc để minh hoạ cách Petverse có thể trở thành hiện thực.

Quay lại Cloud Shell. Bạn sẽ có trải nghiệm tốt hơn khi chỉ dùng bảng điều khiển ở chế độ toàn màn hình:

b5061fb060f2a958.png

Chạy tập lệnh khởi tạo để đảm bảo các biến môi trường được thiết lập, tạo một thư mục để chứa dự án này và thực thi Gemini CLI:

~/petverse-setup.sh
mkdir petverse-profiles
cd petverse-profiles
gemini

Bạn sẽ thấy CLI của Gemini:

910fda2312082974.png

Thay thế tên của nhóm trong câu lệnh bên dưới.

Dán câu lệnh vào dòng lệnh của Gemini.

You are a fullstack engineer creating an application to display the profiles of cats, dogs and other pets stored in BigQuery. The table where these are stored is called pets, in the dataset petverse.
1.Application Requirements: Display the pets with their profile picture, all the other information in the Pets table, and other media that may be available. The pictures are in a GCS bucket, the field in the table pets profile_picture.uri contains the URI for the storage bucket of that profile picture.  The field additional_media is an array of objectref that contains multiple URI to different media stored in a GCS bucket.
Important: In the code, in the values for the URIs retrieved from BigQuery, replace gs://<<YOUR_PROJECT_ID>>-petverse/ with https://storage.mtls.cloud.google.com/<<YOUR_PROJECT_ID>>-petverse/ as follows: replace('gs://', 'https://storage.mtls.cloud.google.com/'). Use the python library. Media can be pictures, videos and audio. Consider these formats in the code. Some pets may not have profile pictures or additional media.
2.Hosting: Create a web application hosted in a single container and service in Cloud Run, use the following syntax to deploy it using IAP. IMPORTANT: DO NOT ADD IAM AUTHENTICATION AND DO NOT ALLOW UNAUTHENTICATED: gcloud beta run deploy SERVICE_NAME  --region=REGION --image=IMAGE_URL  --no-allow-unauthenticated --iap
3.Database access: Display similar pets based on a similarity between embeddings in table petverse.profile_embeddings. 
Here's the schema for the pets table in CSV format (Field name, type, mode):
Id,INTEGER,NULLABLE
Name,STRING,NULLABLE
Species,STRING,NULLABLE
Breed,STRING,NULLABLE
Nationality,STRING,NULLABLE
Nicknames,STRING,NULLABLE
Hobby,STRING,NULLABLE
AdoptionStory,STRING,NULLABLE
FavoriteFood,STRING,NULLABLE
FavoriteToy,STRING,NULLABLE
profile_picture,RECORD,NULLABLE
additional_media,RECORD,REPEATED
profile_embeddings,FLOAT,REPEATED
Here's a sample query to check for similarity:
SELECT
t2.id AS similar_pet_id,
COSINE_DISTANCE(t1.ml_generate_embedding_result, t2.ml_generate_embedding_result) AS distance
FROM
petverse.profile_embeddings AS t1,
petverse.profile_embeddings AS t2
WHERE
t1.Id = 3 -- The pet you want to find similar ones to
AND t1.Id != t2.Id -- Exclude the pet itself from the results
AND t1.content.uri IS NOT NULL
AND t2.content.uri IS NOT NULL
ORDER BY
distance
LIMIT 5;
Complement the profile of each pet with a description. Here's an example of the access to such table:
SELECT Name, MediaDescription from petverse.pets;
4.For each access to BigQuery, show the SQL statement that is used in the console logs.
5.Search functionality: Add a search bar for a semantic search for pets. There's a text embedding for the Adoption story, the pet's past-time or hobby and their nicknames in the table: petverse.text_embeddings . This is a sample of semantic search:
SELECT query.query, base.content, base.Name FROM VECTOR_SEARCH(TABLE `petverse.text_embeddings`, 'ml_generate_embedding_result', ( SELECT ml_generate_embedding_result, content AS query FROM ML.GENERATE_EMBEDDING(MODEL `petverse.textembedding`,(SELECT 'Pets who like to relax' AS content))), top_k => 5, options => '{"fraction_lists_to_search": 0.50}') ORDER BY distance DESC
6.Use Python for the backend. Generate the deployment scripts for an authenticated service using IAP with the flags --no-allow-unauthenticated --iap
7. Make the UI look like a modern art museum.
8. Use the gunicorn library. Validate version dependencies.

Đây là hành trình của bạn. Bạn sẽ thấy một kế hoạch và được yêu cầu xác nhận trong quá trình này.

Rất khó có khả năng mã và quá trình triển khai tạo ra sẽ hoạt động ngay từ lần thử đầu tiên. Bạn sẽ cần lặp lại thao tác với Gemini CLI cho đến khi nhận được kết quả chính xác.

Nếu thấy quy trình bị kẹt trong một vòng lặp, hãy dừng quy trình đó bằng tổ hợp phím CTRL/Command + C, điều tra vấn đề và nhắc lại.

47d6e394fc4f5b60.png

Bạn nên đọc kỹ từng thông báo xác nhận, từng thông báo một, để hiểu những việc mà CLI sẽ làm:

6a62b9c077d4cd11.png

Sau vài phút, ứng dụng sẽ sẵn sàng thực thi. Có thể xảy ra trường hợp bảng điều khiển bị treo:

ca51ecf7b1ce08bf.png

Bạn có thể thử ứng dụng theo cách thủ công trong một thẻ Cloud Shell mới bằng gunicorn. Đảm bảo bạn đã thiết lập dự án:

f0ee1095386f7ec.png

Bạn sẽ thấy trang web mới của mình (trang web này có thể trông khác với trang web trong hình). Nếu có vấn đề, bạn sẽ thấy nhật ký lỗi và gỡ lỗi trong dòng lệnh Cloud Shell đang thực thi cục bộ.

27bf3e2a8d429169.gif

Nếu mọi thứ đều ổn, bạn có thể triển khai ứng dụng vào Cloud Run (không bắt buộc).

Nếu dự án của bạn thuộc về một tổ chức, hãy đảm bảo bạn định cấu hình IAP theo các hướng dẫn này. Nếu dự án của bạn không thuộc một tổ chức, bạn có thể làm theo hướng dẫn này để bảo mật quyền truy cập vào ứng dụng. Đặc biệt đối với chế độ cài đặt sản xuất, bạn KHÔNG nên cho phép truy cập chưa được xác thực.

2365a90ac6a7d4e5.png

Giả sử quá trình triển khai diễn ra suôn sẻ, bạn sẽ thấy ứng dụng Cloud Run thực thi trong bảng điều khiển Cloud Run.

Đảm bảo rằng quyền truy cập chỉ dành cho IAP. Sử dụng Chỉnh sửa chính sách để thêm người dùng vào hoạt động liên kết và Lưu.

Chờ vài phút để các liên kết IAP truyền đi rồi nhấp vào URL ở trên cùng. Trang web sẽ xuất hiện.

3943c556ba912466.png

12. Dọn dẹp

Bước này sẽ hướng dẫn bạn cách xoá các tài nguyên đã tạo trong lớp học lập trình này.

Xoá dịch vụ Cloud Run (điều chỉnh tên của các dịch vụ và khu vực nếu cần):

gcloud run services delete petverse-profiles --region us-central1

Xoá tất cả thành phần BigQuery:

bq rm -f petverse
gcloud bigquery connections delete pet-connection --location=us-central1