歡迎來到 PetVerse!

1. 簡介

歡迎來到 Petverse!歡迎各種寵物入住!🐈🐶🐍🐟🦄

必要條件

  • 對 Google Cloud 控制台有基本瞭解
  • 對 SQL 陳述式有基本瞭解

課程內容

  • 在 BigQuery 中建立資料集和資料表
  • 建立 ObjectRef 欄,在 BigQuery 的儲存空間值區中參照多媒體內容
  • 在 BigQuery 中使用 AI 函式,根據非結構化資料的內容擴充資料集
  • 建立多媒體嵌入內容,搜尋類似的媒體
  • 建立文字嵌入,使用 VECTOR_SEARCH 執行語意搜尋
  • 使用 Gemini CLI 建立網頁應用程式

軟硬體需求

  • Google Cloud 帳戶和 Google Cloud 專案 (含帳單帳戶)
  • 網路瀏覽器,例如 Chrome

2. 設定和需求

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生專屬字串,通常您不需要在意該字串為何。在大多數程式碼研究室中,您需要參照專案 ID (通常標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試使用自己的名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間會維持不變。
  • 請注意,有些 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成這個程式碼研究室的費用不高,甚至可能完全免費。如要關閉資源,避免在本教學課程結束後繼續產生費用,請刪除您建立的資源或專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

3. 開啟 Cloud Shell

前往 https://shell.cloud.google.com/?show=ide%2Cterminal。如果出現提示訊息,請點選「授權」

1bfca4be2c270a9f.png

確認編輯器和控制台都顯示在畫面上:

785d186a8b11b32b.png

4. 建立輔助指令碼

為確保流程順暢,您將建立輔助指令碼,設定相關環境變數。

將下方的 <<專案 ID>> 替換為您的專案 ID。

將下列指令複製到 Cloud Shell 終端機,然後按下 Enter 鍵執行。

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

將下列指令複製到 Cloud Shell 終端機,然後按下 Enter 鍵執行指令。這會啟用必要服務、建立檔案,並在 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

您應該會看到以檔案名稱命名的新分頁。將下列指令碼貼到新檔案中:

#!/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."

將 PROJECT_ID 的預留位置替換為專案名稱:

aec2195d576244dd.png

複製下列指令,並在終端機中執行:

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

預期輸出內容:

83d1f7405624443b.png

5. 建立儲存空間值區

建立 Cloud Storage bucket,並將可用的媒體複製到自己的 bucket。您將使用這個值區來儲存可愛寵物的媒體。您也會建立連線,透過 BigQuery 存取 bucket。

在終端機中貼上並執行下列指令:

~/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. 建立寵物資料表

現在您要在 BigQuery 中建立資料表,儲存寵物的相關資訊。

在瀏覽器中開啟新分頁。前往 https://console.cloud.google.com/bigquery

確認您在控制台中選取的是先前使用的專案:

f82010a317866e6.png

現在您可以使用 pets.csv 檔案中的資料建立資料表。這個檔案包含寵物的名字、最喜歡的食物、玩具和其他有趣資訊。

將下列程式碼複製到新的 SQL 查詢中,建立實體資料表並載入資料。

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'
);

將程式碼中的值區預留位置,替換為您在上一步建立的值區。

如要查看所有儲存空間值區,請在新瀏覽器分頁中前往這個網址:https://console.cloud.google.com/storage/browser

757813944bb3d8ba.png

使用「執行」按鈕執行查詢。

資料載入成功後,請按一下「前往資料表」

d6aab61d533bedde.png

點選「預覽」,查看資料表內容。20fb1cbf8826efca.png

7. 將 BigQuery 連至儲存空間 Bucket

如果您查看先前建立的 bucket,會發現一組與每隻寵物相關的媒體檔案。

243751f1b0aab329.gif

BigQuery 能夠讀取這些值區,並搭配資料表中的資料使用檔案。這個值類型稱為「ObjectRef」ObjectRef

按一下「外部連線」下方的連線,取得您先前建立的連線服務帳戶 ID。

1d9d3275483f5650.png

複製服務帳戶 ID

在新瀏覽器分頁中前往 IAM 管理控制台 ( https://console.cloud.google.com/iam-admin/)。

Storage 物件檢視者Vertex AI 使用者授予服務帳戶 (您稍後會使用這項權限)。

f1ff6b305d914532.png

按一下「儲存」,然後等待幾分鐘

返回 BigQuery 分頁,在 BigQuery Studio 中使用下列查詢,測試 BigQuery 與儲存空間 bucket 之間的連線。

將 <<PROJECT_ID>> 替換為您的專案 ID。

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'))

按一下「查看結果」。結果應會顯示中繼資料:

9e3d986b797e413a.png

8. 在結構化資料中加入儲存媒體

您可以擴充「寵物」表格,在其中新增資料欄,顯示每隻寵物的個人資料相片 (如有)。您也會新增另一個資料欄,其中包含媒體參照陣列,用於存放與每隻寵物相關的所有其他檔案。

如要存取多媒體內容,必須建立連線。在本程式碼實驗室的開頭,您已在建立 bucket 後建立連線。

將下列指令貼到 BigQuery SQL 控制台,然後執行,即可在 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>>;

複製下列陳述式,並將 PROJECT_ID 的預留位置換成您的專案 ID。

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;

執行陳述式。幾分鐘後,您應該會看到執行成功:

4fa3bba70440fa65.png

使用表格預覽功能查看結果。您應該會看到名為 Pixel 的貓咪現有個人資料相片和其他媒體的中繼資料。

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

a1511d749e88d5f5.png

9. 生成寵物說明

預覽 pets 資料表時,你會發現部分寵物 (例如 Yoda、Pixel 或 Rocky) 缺少最愛的食物或玩具。

這些問題的答案可能就在與寵物相關的影片和音訊中。您將使用內建的 AI 函式進行檢查。

使用下列陳述式測試:

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'

您可以在儲存空間 bucket 中查看 Rocky 的影片。

請使用下列陳述式更新缺少的說明:

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

使用下列陳述式,根據寵物的多媒體內容在新資料欄中建立描述:

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

幾分鐘後,您應該會看到一些廣告素材說明:

fab3b59caa69aec7.png

10. 建立嵌入

建立資料表,儲存個人資料相片、說明和興趣的嵌入,以用於語意搜尋。我們會使用向量搜尋功能,找出寵物之間的相似之處。

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;

在「結果」分頁中查看新資料表。

c9e876d75147c343.png

使用下列陳述式檢查所有嵌入的狀態:

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

如有任何錯誤,狀態會顯示錯誤訊息。這是正確的輸出內容 - 沒有錯誤記錄**:**

e6754936c31ca5cf.png

以下是含有錯誤的記錄範例。這些錯誤不應發生,但必須修正才能繼續執行後續步驟:

736545fbc7ce4ac8.png

尋找類似的寵物

預設資料集包含類似的寵物。以下是兩個範例:Pixel (ID:3) 和 SQL (ID:4):

cfebe01afc5f4858.png

您可以根據嵌入之間的距離計算相似的寵物:

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;

結果應會顯示彼此相似的圖片 ID。這包括圖片中的所有內容。在這個範例中,Pixel 和 SQL 相似,而下一個最相似的寵物是 Joel (ID:14)。

99ce203add04a6b1.png

以下是 Joel 的圖片,供您參考:

f78e0ca0fe235ba2.png

您可以使用 VECTOR_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

請嘗試變更語意搜尋字詞 (Pets who like to relax) 和參數 fraction_lists_to_search,看看會發生什麼事。如要進一步瞭解這些函式,請參閱這篇文章

11. 直覺式程式開發個人資料頁面

您將在 Cloud Shell 中使用 Gemini CLI,快速啟動簡單的範例網頁應用程式。這個網頁應用程式的提示已簡化,用來示範 Petverse 的運作方式。

返回 Cloud Shell。全螢幕顯示控制台可帶來更優質的體驗:

b5061fb060f2a958.png

執行初始化指令碼,確保環境變數已設定完成,建立目錄來存放這個專案,並執行 Gemini CLI:

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

您應該會看到 Gemini 的 CLI:

910fda2312082974.png

在下列提示中,取代值區名稱。

將提示詞貼到 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.

這就是你現在的冒險。系統會顯示方案,並要求你確認。

程式碼和部署作業不太可能在第一次嘗試時就正常運作。您需要與 Gemini CLI 疊代,直到獲得正確結果為止。

如果發現程序陷入迴圈,請按下 CTRL/Command + C 鍵停止程序、調查問題,然後再次提示。

47d6e394fc4f5b60.png

建議您仔細閱讀每項確認訊息,瞭解 CLI 的作用:

6a62b9c077d4cd11.png

幾分鐘後,應用程式應該就能執行。控制台可能會顯示卡住的狀態:

ca51ecf7b1ce08bf.png

您可以在新的 Cloud Shell 分頁中,使用 gunicorn 手動測試應用程式。確認專案已設定完成:

f0ee1095386f7ec.png

您應該會看到新網站 (外觀可能與這個網站不同)。如果發生任何問題,您應該可以在本機執行的 Cloud Shell 指令列中,查看錯誤和偵錯記錄。

27bf3e2a8d429169.gif

如果一切正常,您可以選擇將應用程式部署至 Cloud Run。

如果專案屬於機構,請務必按照這些操作說明設定 IAP。如果專案不屬於機構,請改為按照這些操作說明,確保應用程式存取權安全無虞。特別是針對生產環境設定,我們建議不要允許未經驗證的存取權。

2365a90ac6a7d4e5.png

如果部署作業順利完成,您應該會在 Cloud Run 控制台中看到執行中的 Cloud Run 應用程式。

請確認存取權僅限 IAP。使用「編輯政策」將使用者新增至繫結,然後「儲存」

請稍候幾分鐘,等待 IAP 繫結傳播,然後按一下頂端的「URL」。網站應會顯示。

3943c556ba912466.png

12. 清理

這個步驟會引導您刪除在本程式碼研究室中建立的資源。

刪除 Cloud Run 服務 (視需要調整服務名稱和區域):

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

刪除所有 BigQuery 資產:

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