PetVerse'e hoş geldiniz.

1. Giriş

Petverse'e hoş geldiniz. Tüm evcil hayvanlar kabul edilir. 🐈🐶🐍🐟🦄

Ön koşullar

  • Google Cloud Console hakkında temel bilgiler
  • SQL ifadeleri hakkında temel bilgi

Neler öğreneceksiniz?

  • BigQuery'de veri kümeleri ve tablolar oluşturma
  • BigQuery'deki bir depolama paketinde multimedyaya referans vermek için ObjectRef sütunları oluşturma
  • BigQuery'deki yapay zeka işlevlerini kullanarak yapılandırılmamış verilerin içeriğinden yararlanıp veri kümenizi geliştirme
  • Benzer medyaları aramak için multimedya yerleştirmeleri oluşturma
  • VECTOR_SEARCH ile semantik arama yapmak için metin yerleştirmeleri oluşturma
  • Web uygulaması oluşturmak için Gemini CLI'yı kullanma

Gerekenler

  • Faturalandırma hesabı olan bir Google Cloud hesabı ve Google Cloud projesi
  • Chrome gibi bir web tarayıcısı

2. Kurulum ve Gereksinimler

Yönlendirmesiz ortam kurulumu

  1. Google Cloud Console'da oturum açın ve yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir. Bu bilgiyi istediğiniz zaman güncelleyebilirsiniz.
  • Proje kimliği, tüm Google Cloud projelerinde benzersizdir ve sabittir (ayarlandıktan sonra değiştirilemez). Cloud Console, benzersiz bir dizeyi otomatik olarak oluşturur. Genellikle bu dizenin ne olduğuyla ilgilenmezsiniz. Çoğu codelab'de proje kimliğinize (genellikle PROJECT_ID olarak tanımlanır) başvurmanız gerekir. Oluşturulan kimliği beğenmezseniz başka bir rastgele kimlik oluşturabilirsiniz. Dilerseniz kendi adınızı deneyerek kullanılabilir olup olmadığını kontrol edebilirsiniz. Bu adım tamamlandıktan sonra değiştirilemez ve proje süresince geçerli kalır.
  • Bazı API'lerin kullandığı üçüncü bir değer olan Proje Numarası da vardır. Bu üç değer hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
  1. Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i tamamlamak neredeyse hiç maliyetli değildir. Bu eğitimin ötesinde faturalandırılmayı önlemek için kaynakları kapatmak üzere oluşturduğunuz kaynakları veya projeyi silebilirsiniz. Yeni Google Cloud kullanıcıları 300 ABD doları değerinde ücretsiz deneme programından yararlanabilir.

3. Cloud Shell'i açın

https://shell.cloud.google.com/?show=ide%2Cterminal adresine gidin . İstendiğinde Yetkilendir'i tıklayın.

1bfca4be2c270a9f.png

Hem düzenleyicinin hem de konsolun görünür olduğundan emin olun:

785d186a8b11b32b.png

4. Yardımcı komut dosyası oluşturma

Bu deneyimi daha sorunsuz hale getirmek için ilgili ortam değişkenlerini ayarlayan bir yardımcı komut dosyası oluşturacaksınız.

Aşağıdaki <<Project ID>> kısmını proje kimliğinizle değiştirin.

Aşağıdaki komutu Cloud Shell terminaline kopyalayın ve yürütmek için Enter tuşuna basın**.**

gcloud config set project <<PROJECT_ID>>

ffd97bad1f398b4b.png

Aşağıdaki komutu Cloud Shell terminaline kopyalayın ve yürütmek için Enter tuşuna basın**.** Bu işlem, gerekli hizmetleri etkinleştirir, dosyayı oluşturur ve Cloud Shell'de düzenler.

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

Dosyanın adını içeren yeni bir sekme görürsünüz. Aşağıdaki komut dosyasını yeni dosyaya yapıştırın:

#!/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 yer tutucusunu projenizin adıyla değiştirin:

aec2195d576244dd.png

Aşağıdaki komutu kopyalayıp terminalde çalıştırın:

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

Beklenen çıktı:

83d1f7405624443b.png

5. Storage paketi oluşturma

Cloud Storage paketi oluşturun ve mevcut medyaları kendi paketinize kopyalayın. Bu alanı, harika evcil hayvanlarımızın mevcut medyalarını depolamak için kullanacaksınız. Ayrıca, pakete BigQuery üzerinden erişmek için bir bağlantı oluşturacaksınız.

Terminalde aşağıdakileri yapıştırıp çalıştırın:

~/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. Evcil hayvanlar tablosunu oluşturma

Şimdi evcil hayvanlarınızla ilgili bilgileri depolamak için BigQuery'de bir tablo oluşturacaksınız.

Tarayıcıda yeni bir sekme açın. https://console.cloud.google.com/bigquery adresine gidin .

Konsolda, kullandığınız projenin seçili olduğundan emin olun:

f82010a317866e6.png

Artık pets.csv dosyasındaki verileri kullanarak bir tablo oluşturabilirsiniz. Bu dosyada evcil hayvanlarımızın adları, en sevdikleri yiyecekler, oyuncaklar ve diğer ilginç bilgiler yer alıyor.

Fiziksel bir tablo oluşturmak ve verileri yüklemek için aşağıdaki kodu yeni bir SQL sorgusuna kopyalayın.

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

Koddaki paket yer tutucusunu önceki adımda oluşturduğunuz paketle değiştirin.

Tüm depolama gruplarınızı şu URL'ye yönlendirilmiş ayrı bir tarayıcı sekmesinde kontrol edebilirsiniz: https://console.cloud.google.com/storage/browser .

757813944bb3d8ba.png

Sorguyu yürütmek için Çalıştır düğmesini kullanın.

Veriler başarıyla yüklendikten sonra Tabloya git'i tıklayın.

d6aab61d533bedde.png

Tablonun içeriğini görmek için Önizleme'yi tıklayın. 20fb1cbf8826efca.png

7. BigQuery'yi depolama paketine bağlama

Daha önce oluşturduğunuz pakete bakarsanız her evcil hayvanla ilgili bir dizi medya dosyası görürsünüz.

243751f1b0aab329.gif

BigQuery, bu paketleri okuyabilir ve tablolardaki verilerle birlikte dosyaları kullanabilir. Bu değer türüne ObjectRef adı verilir.

Daha önce oluşturduğunuz bağlantının hizmet hesabı kimliğini almak için Harici bağlantılar bölümünde bağlantıyı tıklayın.

1d9d3275483f5650.png

Hizmet hesabı kimliğini kopyalayın.

Yeni bir tarayıcı sekmesinde IAM Yönetici Konsolu'na gidin ( https://console.cloud.google.com/iam-admin/).

Hizmet hesabına Storage Object Viewer ve Vertex AI User rollerini verin (bu izni daha sonra kullanacaksınız).

f1ff6b305d914532.png

Kaydet'i tıklayın ve 🕰️ birkaç dakika bekleyin.

BigQuery sekmesine geri dönün. BigQuery ile depolama paketi arasındaki bağlantıyı test etmek için BigQuery Studio'da aşağıdaki sorguyu kullanın.

<<PROJECT_ID>> kısmını proje kimliğinizle değiştirin.

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

Sonuçları Göster'i tıklayın. Sonuçlarda meta verileri görmeniz gerekir:

9e3d986b797e413a.png

8. Depolama medyasını yapılandırılmış verilerinize ekleme

Evcil hayvanlar tablosunu geliştirerek, her evcil hayvanın profil resmini içeren bir sütun ekleyebilirsiniz. Ayrıca, her evcil hayvanla ilgili diğer tüm dosyaları tutmak için medya referansları dizisi içeren başka bir sütun ekleyeceksiniz.

Multimedya içeriğine erişmek için bu kod laboratuvarının başında, paketinizi oluşturduktan sonra oluşturduğunuz bağlantı gerekir.

Aşağıdaki komutları bir BigQuery SQL konsoluna yapıştırın ve pets tablonuza iki sütun eklemek için bunları çalıştırın.

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

Aşağıdaki ifadeleri kopyalayın ve PROJECT_ID yer tutucusunu proje kimliğinizle değiştirin.

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;

Ekstreyi çalıştırın. Birkaç dakika sonra başarılı yürütmeler görmeniz gerekir:

4fa3bba70440fa65.png

Tablo önizlemesini kullanarak sonuçları kontrol edin. Mevcut profil resimlerinin ve Pixel adlı kediye ait ek medya içeriklerinin meta verilerini görürsünüz.

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

a1511d749e88d5f5.png

9. Evcil hayvan açıklamaları oluşturma

Evcil hayvanlar tablosunu önizlerseniz Yoda, Pixel veya Rocky gibi bazı evcil hayvanların en sevdiği yiyecek ya da oyuncağın eksik olduğunu görürsünüz.

Bu soruların yanıtları, söz konusu evcil hayvanlarla ilgili video ve seslerde yer alabilir. Kontrol etmek için yerleştirilmiş yapay zeka işlevlerini kullanırsınız.

Bunu aşağıdaki ifadeyle test edin:

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'

Rocky'nin videosunu depolama paketinize kaydedebilirsiniz.

Eksik açıklamaları güncellemek için aşağıdaki ifadeyi kullanın:

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

Aşağıdaki ifadeyi kullanarak evcil hayvanların multimedya içeriklerine göre yeni bir sütunda açıklamalarını oluşturun:

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

Birkaç dakika sonra bazı yaratıcı açıklamalar görürsünüz:

fab3b59caa69aec7.png

10. Yerleştirilmiş öğeler oluşturma

Profil resimlerinin yerleştirmelerini ve semantik aramada kullanılacak açıklamaları ve hobileri depolamak için bir tablo oluşturun. Vektör aramaları kullanarak evcil hayvanlar arasındaki benzerlikleri buluruz.

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;

Sonuçlar sekmesindeki yeni tabloya göz atın.

c9e876d75147c343.png

Tüm yerleştirmelerin durumunu kontrol etmek için aşağıdaki ifadeyi kullanın:

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

Hata varsa boş olmayan bir durumda gösterilir. Bu doğru çıkıştır: Hatalı kayıt yoktur**:**

e6754936c31ca5cf.png

Aşağıda, hatalı kayıt örneği verilmiştir. Bunlar beklenmez ancak sonraki adımlara geçmeden önce düzeltilmesi gerekir:

736545fbc7ce4ac8.png

Benzer evcil hayvanları arama

Varsayılan veri kümesinde benzer evcil hayvanlar var. Aşağıda iki örnek verilmiştir: Pixel (Kimlik: 3) ve SQL (Kimlik: 4):

cfebe01afc5f4858.png

Benzer evcil hayvanları hesaplamak için yerleştirmeler arasındaki mesafeyi kullanabilirsiniz:

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;

Birbirine benzeyen resimlerin kimliklerini içeren sonuçlar alırsınız. Resimdeki her şey bu kapsamda yer alır. Bu örnekte Pixel ve SQL benzerdir. En benzer evcil hayvan ise Joel'dir (Kimlik: 14).

99ce203add04a6b1.png

Referans olarak kullanabileceğiniz Joel'in resmi:

f78e0ca0fe235ba2.png

Metin yerleştirmelerinde semantik arama yapmak için VECTOR_SEARCH işlevini kullanabilirsiniz. Bu tablo daha büyük olsaydı yerleştirmeler için bir dizin oluşturmanız gerekirdi.

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

Anlamsal arama terimini (Pets who like to relax) ve parametreyi (fraction_lists_to_search) değiştirmeyi deneyin. Bu işlevler hakkında daha fazla bilgiyi burada bulabilirsiniz.

11. Profil sayfası oluşturmak için sezgisel kodlama

Basit bir demo web uygulamasını hızlıca başlatmak için Cloud Shell'de Gemini KSA'yı kullanacaksınız. Bu web uygulamasının istemi, Petverse'ün nasıl hayata geçirilebileceğini göstermek için basitleştirilmiştir.

Cloud Shell'e dönün. Yalnızca konsolu tam ekranda kullanarak daha iyi bir deneyim elde edebilirsiniz:

b5061fb060f2a958.png

Ortam değişkenlerinin ayarlandığından emin olmak için başlatma komut dosyasını çalıştırın, bu projeyi içerecek bir dizin oluşturun ve Gemini KSA'yı yürütün:

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

Gemini KSA'yı görmeniz gerekir:

910fda2312082974.png

Aşağıdaki istemde paketin adını değiştirin.

İstemi Gemini komut satırına yapıştırın.

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.

Artık maceranız başlıyor. Size bir plan gösterilir ve süreç boyunca onayınız istenir.

Üretilen kodun ve dağıtımın ilk denemede çalışması pek olası değildir. Doğru yanıtı alana kadar Gemini KSA ile iterasyon yapmanız gerekir.

İşlemin döngüde takıldığını görürseniz CTRL/Command + C ile durdurun, sorunu araştırın ve tekrar istem girin.

47d6e394fc4f5b60.png

CLI'nın ne yapacağını anlamak için onayların her birini tek tek dikkatlice okumanızı öneririz:

6a62b9c077d4cd11.png

Birkaç dakika sonra uygulama yürütülmeye hazır hâle gelir. Konsolun takılmış gibi görünmesi mümkündür:

ca51ecf7b1ce08bf.png

Uygulamayı yeni bir Cloud Shell sekmesinde gunicorn ile manuel olarak deneyebilirsiniz. Projenin aşağıdaki şekilde ayarlandığından emin olun:

f0ee1095386f7ec.png

Yeni sitenizi görmeniz gerekir (bu siteden farklı görünebilir). Herhangi bir şey çalışmıyorsa hatayı ve hata ayıklama günlüklerini yerel olarak yürütülen Cloud Shell komut satırında görebilirsiniz.

27bf3e2a8d429169.gif

Herhangi bir sorun yoksa uygulamayı isteğe bağlı olarak Cloud Run'a dağıtabilirsiniz.

Projeniz bir kuruluşa aitse IAP'yi bu talimatları uygulayarak yapılandırdığınızdan emin olun. Projeniz bir kuruluşun parçası değilse uygulamanıza erişimi güvenli hale getirmek için bu talimatları uygulayabilirsiniz. Özellikle üretim ayarları için kimliği doğrulanmamış erişime İZİN VERMEMENİZİ öneririz.

2365a90ac6a7d4e5.png

Dağıtımın çalıştığını varsayarsak Cloud Run uygulamasının Cloud Run konsolunda yürütüldüğünü görmeniz gerekir.

Erişimin yalnızca IAP üzerinden olduğundan emin olun. Kullanıcınızı bağlamaya eklemek için Edit Policy'yi (Politikayı Düzenle) kullanın ve Save'i (Kaydet) tıklayın.

Uygulama içi ürün bağlamalarının yayılması için birkaç dakika bekleyin ve üstteki URL'yi tıklayın. Site görünür.

3943c556ba912466.png

12. Temizleme

Bu adım, bu codelab'de oluşturulan kaynakların silinmesi konusunda size yol gösterecektir.

Cloud Run hizmetini silin (hizmetlerin ve bölgenin adını gerektiği gibi uyarlayın):

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

Tüm BigQuery öğelerini silme:

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