Embedding Multimodal di AlloyDB

1. Pengantar

a7e7c1d2afe05e68.png

Codelab ini memberikan panduan untuk men-deploy AlloyDB dan memanfaatkan integrasi AI untuk penelusuran semantik menggunakan embedding multi-modal. Lab ini adalah bagian dari koleksi lab yang dikhususkan untuk fitur AI AlloyDB. Anda dapat membaca selengkapnya di halaman AI AlloyDB dalam dokumentasi.

Prasyarat

  • Pemahaman dasar tentang Google Cloud, konsol
  • Keterampilan dasar dalam antarmuka command line dan Cloud Shell

Yang akan Anda pelajari

  • Cara men-deploy AlloyDB untuk Postgres
  • Cara menggunakan penelusuran vektor multimodal
  • Cara mengaktifkan operator AI AlloyDB
  • Cara menggunakan berbagai operator AlloyDB AI untuk penelusuran multimodal
  • Cara menggunakan AlloyDB AI untuk menggabungkan hasil penelusuran teks dan gambar

Yang Anda butuhkan

  • Akun Google Cloud dan Project Google Cloud
  • Browser web seperti Chrome yang mendukung Konsol Google Cloud dan Cloud Shell

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Google Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • Project name adalah nama tampilan untuk peserta project ini. String ini adalah string karakter yang tidak digunakan oleh Google API. Anda dapat memperbaruinya kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Cloud Console otomatis membuat string unik; biasanya Anda tidak mementingkan kata-katanya. Di sebagian besar codelab, Anda harus merujuk Project ID-nya (umumnya diidentifikasi sebagai PROJECT_ID). Jika tidak suka dengan ID yang dibuat, Anda dapat membuat ID acak lainnya. Atau, Anda dapat mencobanya sendiri, dan lihat apakah ID tersebut tersedia. ID tidak dapat diubah setelah langkah ini dan tersedia selama durasi project.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.
  1. Selanjutnya, Anda harus mengaktifkan penagihan di Konsol Cloud untuk menggunakan resource/API Cloud. Menjalankan operasi dalam codelab ini tidak akan memakan banyak biaya, bahkan mungkin tidak sama sekali. Guna mematikan resource agar tidak menimbulkan penagihan di luar tutorial ini, Anda dapat menghapus resource yang dibuat atau menghapus project-nya. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.

3. Sebelum memulai

Aktifkan API

Di dalam Cloud Shell, pastikan project ID Anda sudah disiapkan:

gcloud config set project [YOUR-PROJECT-ID]

Tetapkan variabel lingkungan PROJECT_ID:

PROJECT_ID=$(gcloud config get-value project)

Aktifkan semua layanan yang diperlukan:

gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com \
                       discoveryengine.googleapis.com \
                       secretmanager.googleapis.com

Output yang diharapkan

student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417
Updated property [core/project].
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$ 
student@cloudshell:~ (test-project-001-402417)$ gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       aiplatform.googleapis.com
Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.

4. Deploy AlloyDB

Buat cluster dan instance utama AlloyDB. Prosedur berikut menjelaskan cara membuat cluster dan instance AlloyDB menggunakan Google Cloud SDK. Jika lebih memilih pendekatan konsol, Anda dapat mengikuti dokumentasi di sini.

Sebelum membuat cluster AlloyDB, kita memerlukan rentang IP pribadi yang tersedia di VPC untuk digunakan oleh instance AlloyDB mendatang. Jika belum ada, kita perlu membuatnya, menetapkannya untuk digunakan oleh layanan Google internal, dan setelah itu kita dapat membuat cluster dan instance.

Buat rentang IP pribadi

Kita perlu menyetel konfigurasi Akses Layanan Pribadi di VPC untuk AlloyDB. Asumsinya di sini adalah kita memiliki jaringan VPC "default" dalam project dan jaringan tersebut akan digunakan untuk semua tindakan.

Buat rentang IP pribadi:

gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default

Buat koneksi pribadi menggunakan rentang IP yang dialokasikan:

gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ gcloud compute addresses create psa-range \
    --global \
    --purpose=VPC_PEERING \
    --prefix-length=24 \
    --description="VPC private service access" \
    --network=default
Created [https://www.googleapis.com/compute/v1/projects/test-project-402417/global/addresses/psa-range].

student@cloudshell:~ (test-project-402417)$ gcloud services vpc-peerings connect \
    --service=servicenetworking.googleapis.com \
    --ranges=psa-range \
    --network=default
Operation "operations/pssn.p24-4470404856-595e209f-19b7-4669-8a71-cbd45de8ba66" finished successfully.

student@cloudshell:~ (test-project-402417)$

Buat Cluster AlloyDB

Di bagian ini, kita akan membuat cluster AlloyDB di region us-central1.

Tentukan sandi untuk pengguna postgres. Anda dapat menentukan sandi Anda sendiri atau menggunakan fungsi acak untuk membuatnya

export PGPASSWORD=`openssl rand -hex 12`

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ export PGPASSWORD=`openssl rand -hex 12`

Catat sandi PostgreSQL untuk penggunaan berikutnya.

echo $PGPASSWORD

Anda akan memerlukan sandi tersebut pada masa mendatang untuk terhubung ke instance sebagai pengguna postgres. Sebaiknya tulis atau salin kode tersebut ke suatu tempat agar dapat digunakan nanti.

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723

Membuat Cluster Uji Coba Gratis

Jika belum pernah menggunakan AlloyDB, Anda dapat membuat cluster uji coba gratis:

Tentukan region dan nama cluster AlloyDB. Kita akan menggunakan region us-central1 dan alloydb-aip-01 sebagai nama cluster:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Jalankan perintah untuk membuat cluster:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL

Output konsol yang diharapkan:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION \
    --subscription-type=TRIAL
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Buat instance utama AlloyDB untuk cluster di sesi cloud shell yang sama. Jika koneksi terputus, Anda harus menentukan variabel lingkungan nama cluster dan region lagi.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=8 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

Buat Cluster Standar AlloyDB

Jika ini bukan cluster AlloyDB pertama Anda dalam project, lanjutkan pembuatan cluster standar.

Tentukan region dan nama cluster AlloyDB. Kita akan menggunakan region us-central1 dan alloydb-aip-01 sebagai nama cluster:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01

Jalankan perintah untuk membuat cluster:

gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION

Output konsol yang diharapkan:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters create $ADBCLUSTER \
    --password=$PGPASSWORD \
    --network=default \
    --region=$REGION 
Operation ID: operation-1697655441138-6080235852277-9e7f04f5-2012fce4
Creating cluster...done.                                                                                                                                                                                                                                                           

Buat instance utama AlloyDB untuk cluster di sesi cloud shell yang sama. Jika koneksi terputus, Anda harus menentukan variabel lingkungan nama cluster dan region lagi.

gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --cluster=$ADBCLUSTER

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ gcloud alloydb instances create $ADBCLUSTER-pr \
    --instance-type=PRIMARY \
    --cpu-count=2 \
    --region=$REGION \
    --availability-type ZONAL \
    --cluster=$ADBCLUSTER
Operation ID: operation-1697659203545-6080315c6e8ee-391805db-25852721
Creating instance...done.                                                                                                                                                                                                                                                     

5. Menyiapkan Database

Kita perlu membuat database, mengaktifkan integrasi Vertex AI, membuat objek database, dan mengimpor data.

Memberikan Izin yang Diperlukan ke AlloyDB

Tambahkan izin Vertex AI ke agen layanan AlloyDB.

Buka tab Cloud Shell lain menggunakan tanda "+" di bagian atas.

4ca978f5142bb6ce.png

Di tab Cloud Shell baru, jalankan:

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"

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
Your active configuration is: [cloudshell-11039]
student@cloudshell:~ (test-project-001-402417)$ 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"
Updated IAM policy for project [test-project-001-402417].
bindings:
- members:
  - serviceAccount:service-4470404856@gcp-sa-alloydb.iam.gserviceaccount.com
  role: roles/aiplatform.user
- members:
...
etag: BwYIEbe_Z3U=
version: 1
 

Tutup tab dengan menjalankan perintah "exit" di tab:

exit

Menghubungkan ke AlloyDB Studio

Di bab-bab berikutnya, semua perintah SQL yang memerlukan koneksi ke database dapat dijalankan secara alternatif di AlloyDB Studio. Untuk menjalankan perintah, Anda harus membuka antarmuka konsol web untuk cluster AlloyDB dengan mengklik instance utama.

ef4bfbcf0ed2ef3a.png

Kemudian, klik AlloyDB Studio di sebelah kiri:

5c155cbcd7d43a1.png

Pilih database postgres, pengguna postgres, dan berikan sandi yang dicatat saat kita membuat cluster. Kemudian, klik tombol "Autentikasi".

1c9dab73c6836798.png

Tindakan ini akan membuka antarmuka AlloyDB Studio. Untuk menjalankan perintah di database, klik tab "Editor 1" di sebelah kanan.

b36c28f8165119ca.png

Tindakan ini akan membuka antarmuka tempat Anda dapat menjalankan perintah SQL

cf43aa20f292797e.png

Buat Database

Mulai cepat pembuatan database.

Di Editor AlloyDB Studio, jalankan perintah berikut.

Buat database:

CREATE DATABASE quickstart_db

Output yang diharapkan:

Statement executed successfully

Hubungkan ke quickstart_db

Hubungkan kembali ke studio menggunakan tombol untuk mengganti pengguna/database.

e826ad973eb23a74.png

Pilih database quickstart_db baru dari daftar dropdown dan gunakan pengguna dan sandi yang sama seperti sebelumnya.

1ca70c59b5aea8c1.png

Tindakan ini akan membuka koneksi baru tempat Anda dapat menggunakan objek dari database quickstart_db.

6. Data Sampel

Sekarang kita perlu membuat objek di database dan memuat data. Kita akan menggunakan toko fiktif "Cymbal" dengan data fiktif.

Sebelum mengimpor data, kita perlu mengaktifkan ekstensi yang mendukung jenis data dan indeks. Kita memerlukan dua ekstensi, dengan satu ekstensi mendukung jenis data vektor dan ekstensi lainnya mendukung indeks ScaNN AlloyDB.

Di AlloyDB Studio yang terhubung ke quickstart_db, jalankan.

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS alloydb_scann;

Kumpulan data disiapkan dan ditempatkan sebagai file SQL yang dapat dimuat ke database menggunakan antarmuka impor. Di Cloud Shell, jalankan perintah berikut:

export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
gcloud alloydb clusters import $ADBCLUSTER --region=$REGION --database=quickstart_db --gcs-uri='gs://sample-data-and-media/ecomm-retail/ecom_generic_vectors.sql' --user=postgres --sql

Perintah ini menggunakan AlloyDB SDK dan membuat pengguna dengan nama agentspace_user, lalu mengimpor data contoh langsung dari bucket GCS ke database dengan membuat semua objek yang diperlukan dan memasukkan data.

Setelah impor, kita dapat memeriksa tabel di AlloyDB Studio. Tabel berada dalam skema ecomm:

9ee57986d4cdf20f.png

Lalu, verifikasi jumlah baris di salah satu tabel.

51c3c55881157da3.png

Kita telah berhasil mengimpor data sampel dan dapat melanjutkan ke langkah berikutnya.

7. Penelusuran Semantik Menggunakan Embedding Teks

Dalam bab ini, kita akan mencoba menggunakan penelusuran semantik menggunakan embedding teks dan membandingkannya dengan penelusuran teks dan teks lengkap Postgres tradisional.

Mari kita coba terlebih dahulu penelusuran klasik menggunakan SQL PostgreSQL standar dengan operator LIKE.

Jika kita mencoba menelusuri jaket hujan menggunakan kueri berikut:

SET session.my_search_var='%wet%conditions%jacket%';
SELECT
  name,
  product_description,
  retail_price,   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE current_setting('session.my_search_var')
  OR product_description ILIKE current_setting('session.my_search_var')
LIMIT
  10;

Kueri tidak menampilkan baris apa pun karena memerlukan kata-kata yang tepat seperti kondisi basah dan jaket agar ada di nama atau deskripsi produk. Selain itu, 'jaket kondisi basah' tidak sama dengan 'jaket kondisi hujan'.

Kita dapat mencoba menyertakan semua kemungkinan variasi pada penelusuran. Coba sertakan hanya dua kata. Contoh:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
FROM
  ecomm.products
WHERE
  name ILIKE '%wet%jacket%'
  OR name ILIKE '%jacket%wet%'
  OR name ILIKE '%jacket%'
  OR name ILIKE '%%wet%'
  OR product_description ILIKE '%wet%jacket%'
  OR product_description ILIKE '%jacket%wet%'
  OR product_description ILIKE '%jacket%'
  OR product_description ILIKE '%wet%'
LIMIT
  10;

Hal itu akan menampilkan beberapa baris, tetapi tidak semuanya cocok dengan permintaan jaket kami dan sulit untuk mengurutkan berdasarkan relevansi. Selain itu, misalnya, jika kita menambahkan lebih banyak kondisi seperti "untuk pria" dan lainnya, kompleksitas kueri akan meningkat secara signifikan. Atau, kita dapat mencoba penelusuran teks lengkap, tetapi di sana pun kita akan menghadapi batasan terkait kata-kata yang kurang lebih persis dan relevansi respons.

Sekarang kita dapat melakukan penelusuran serupa menggunakan embedding. Kami telah menghitung embedding untuk produk kami menggunakan model yang berbeda. Kita akan menggunakan model gemini-embedding-001 terbaru dari Google. Kita telah menyimpannya di kolom "product_embedding" pada tabel ecomm.products. Jika kita menjalankan kueri untuk kondisi penelusuran "jaket hujan untuk pria" menggunakan kueri berikut:

SELECT
  name,
  product_description,
  retail_price,
   replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_embedding <=> embedding ('gemini-embedding-001','wet conditions jacket for men')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  10;

Hasilnya tidak hanya menampilkan jaket untuk kondisi basah, tetapi juga semua hasil diurutkan dengan hasil yang paling relevan di bagian atas.

Kueri dengan penyematan menampilkan hasil dalam 90-150 md, dengan sebagian waktu digunakan untuk mendapatkan data dari model penyematan cloud. Jika kita melihat rencana eksekusi, permintaan ke model disertakan dalam waktu perencanaan. Bagian kueri yang melakukan penelusuran itu sendiri cukup pendek. Penelusuran dalam 29 ribu kumpulan data menggunakan indeks ScaNN AlloyDB memerlukan waktu kurang dari 7 md.

Limit  (cost=2709.20..2718.82 rows=10 width=490) (actual time=6.966..7.049 rows=10 loops=1)
   ->  Index Scan using embedding_scann on products  (cost=2709.20..30736.40 rows=29120 width=490) (actual time=6.964..7.046 rows=10 loops=1)
         Order By: (product_embedding <=> '[-0.0020264734,-0.016582033,0.027258193
...
-0.0051468653,-0.012440448]'::vector)
         Limit: 10
 Planning Time: 136.579 ms
 Execution Time: 6.791 ms
(6 rows)

Itulah penelusuran embedding teks menggunakan model embedding khusus teks. Namun, kami juga memiliki gambar untuk produk kami dan kami dapat menggunakannya dengan penelusuran. Di bab berikutnya, kita akan menunjukkan cara model multimodal menggunakan gambar untuk penelusuran.

8. Menggunakan Penelusuran Multimodal

Meskipun penelusuran semantik berbasis teks berguna, mendeskripsikan detail yang rumit bisa menjadi tantangan. Penelusuran multimodal AlloyDB menawarkan keunggulan dengan memungkinkan penemuan produk melalui input gambar. Hal ini sangat membantu saat representasi visual memperjelas maksud penelusuran secara lebih efektif daripada deskripsi tekstual saja. Misalnya - "cari mantel seperti yang ada di gambar ini".

Mari kembali ke contoh jaket kita. Jika saya memiliki gambar jaket yang mirip dengan yang ingin saya temukan, saya dapat meneruskannya ke model penyematan multimodal Google dan membandingkannya dengan penyematan untuk gambar produk saya. Dalam tabel ini, kita sudah menghitung penyematan untuk gambar produk di kolom product_image_embedding dan Anda dapat melihat model yang digunakan di kolom product_image_embedding_model.

Untuk penelusuran, kita dapat menggunakan fungsi image_embedding untuk mendapatkan embedding gambar dan membandingkannya dengan embedding yang telah dihitung sebelumnya. Untuk mengaktifkan fungsi ini, kita harus memastikan bahwa kita menggunakan versi ekstensi google_ml_integration yang tepat.

Mari kita verifikasi versi ekstensi saat ini. Di AlloyDB Studio, jalankan.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
  

Jika versinya lebih rendah dari 1.4.4, jalankan prosedur berikut.

CALL google_ml.upgrade_to_preview_version();

Kemudian, periksa kembali versi ekstensi. Versinya harus 1.4.4.

Berikut adalah contoh gambar saya untuk penelusuran, tetapi Anda dapat menggunakan gambar kustom apa pun. Anda hanya perlu menguploadnya ke penyimpanan Google atau resource lain yang tersedia secara publik dan memasukkan URI ke kueri.

9f33ca0c73ea2b19.png

Dan diupload ke gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png

Penelusuran Gambar dengan Gambar

Pertama, kita mencoba menelusuri hanya dengan gambar:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Dan kami dapat menemukan beberapa jaket hangat dalam inventaris.

Penelusuran gambar menampilkan item yang menyerupai gambar yang kami berikan untuk perbandingan. Seperti yang telah saya sebutkan, Anda dapat mencoba mengupload gambar Anda sendiri ke bucket publik dan melihat apakah gambar tersebut dapat menemukan berbagai jenis pakaian.

Kami telah menggunakan model ‘multimodalembedding@001' Google untuk penelusuran gambar kami. Fungsi image_embedding mengirimkan gambar ke Vertex AI, mengonversinya menjadi vektor, dan menampilkannya kembali untuk dibandingkan dengan vektor yang disimpan untuk gambar dalam database kita.

Kita juga dapat memeriksa menggunakan "EXPLAIN ANALYZE" seberapa cepat kinerjanya dengan indeks ScaNN AlloyDB kita.

Limit  (cost=971.70..975.55 rows=4 width=490) (actual time=2.453..2.477 rows=4 loops=1)
   ->  Index Scan using product_image_embedding_scann on products  (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)
         Order By: (product_image_embedding <=> '[0.02119865,0.034206174,0.030682731,
...
,-0.010307034,-0.010053742]'::vector)
         Limit: 4
 Planning Time: 913.322 ms
 Execution Time: 2.517 ms
(6 rows)

Sekali lagi, seperti pada contoh sebelumnya, kita dapat melihat bahwa sebagian besar waktu dihabiskan untuk mengonversi gambar kita menjadi embedding menggunakan endpoint cloud dan penelusuran vektor itu sendiri hanya membutuhkan waktu 2,5 md.

Penelusuran Gambar dengan Teks

Dengan multimodal, kita juga dapat meneruskan deskripsi teks jaket yang ingin kita telusuri ke model menggunakan google_ml.text_embedding untuk model yang sama dan membandingkannya dengan embedding gambar untuk melihat gambar yang ditampilkan.

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_image_embedding <=> google_ml.text_embedding (model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour')::vector AS distance
FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Kami mendapatkan serangkaian jaket tebal dengan warna abu-abu atau gelap.

Kami mendapatkan serangkaian jaket yang sedikit berbeda, tetapi model ini dengan benar memilih jaket berdasarkan deskripsi kami dan menelusuri melalui sematan gambar.

Mari kita coba cara lain untuk menelusuri deskripsi menggunakan penyematan untuk gambar penelusuran.

Penelusuran Teks dengan Gambar

Kami mencoba menelusuri gambar dengan meneruskan embedding untuk gambar kami dan membandingkannya dengan embedding gambar yang telah dihitung sebelumnya untuk produk kami. Kami juga mencoba menelusuri gambar dengan meneruskan embedding untuk permintaan teks kami dan menelusuri di antara embedding yang sama untuk gambar produk. Sekarang, mari kita coba menggunakan embedding untuk gambar kita dan membandingkannya dengan embedding teks untuk deskripsi produk. Embedding disimpan di kolom product_description_embedding dan menggunakan model multimodalembedding@001 yang sama.

Berikut kueri kami:

SELECT
  name,
  product_description,
  retail_price,
  replace(product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url,
  product_description_embedding <=> google_ml.image_embedding (model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector AS distance

FROM
  ecomm.products
ORDER BY distance
LIMIT
  4;

Di sini kita mendapatkan set jaket yang sedikit berbeda dengan warna abu-abu atau gelap, yang beberapa di antaranya sama atau sangat mirip dengan yang dipilih dengan cara penelusuran yang berbeda.

Dan menampilkan jaket yang sama seperti di atas dalam urutan yang sedikit berbeda. Berdasarkan embedding untuk gambar, model ini dapat membandingkan dengan embedding yang dihitung untuk deskripsi teks dan menampilkan kumpulan produk yang benar.

Anda juga dapat bereksperimen menggabungkan embedding teks dan gambar menggunakan, misalnya, penggabungan peringkat timbal balik. Berikut adalah contoh kueri tersebut yang menggabungkan dua penelusuran dengan menetapkan skor ke setiap peringkat dan mengurutkan hasil berdasarkan skor gabungan.

WITH image_search AS (
            SELECT id,
                RANK () OVER (ORDER BY  product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector) AS rank
                FROM ecomm.products
                ORDER BY product_image_embedding <=>google_ml.image_embedding(model_id => 'multimodalembedding@001',image => 'gs://pr-public-demo-data/alloydb-retail-demo/user_photos/4.png', mimetype => 'image/png')::vector LIMIT 5
        ),
      text_search AS (
            SELECT id,
                RANK () OVER (ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector) AS rank
            FROM ecomm.products
            ORDER BY product_description_embedding <=>google_ml.text_embedding(model_id => 'multimodalembedding@001',content => 'puffy jacket for men, grey or dark colour'
    )::vector LIMIT 5
        ),
      rrf_score AS (
        SELECT
            COALESCE(image_search.id, text_search.id) AS id,
            COALESCE(1.0 / (60 + image_search.rank), 0.0) + COALESCE(1.0 / (60 + text_search.rank), 0.0) AS rrf_score
        FROM image_search FULL OUTER JOIN text_search ON image_search.id = text_search.id
        ORDER BY rrf_score DESC
      )
      SELECT 
        ep.name,
        ep.product_description,
        ep.retail_price,
        replace(ep.product_image_uri,'gs://','https://storage.googleapis.com/') AS public_url
      FROM ecomm.products ep, rrf_score 
      WHERE 
        ep.id=rrf_score.id 
      ORDER by rrf_score DESC
      LIMIT 4;

Anda dapat mencoba bermain-main dengan berbagai parameter dalam kueri dan melihat apakah hal itu dapat meningkatkan hasil penelusuran Anda.

Tindakan ini akan mengakhiri lab dan untuk mencegah biaya yang tidak terduga, sebaiknya hapus resource yang tidak digunakan.

Selain itu, Anda dapat menggunakan operator AI lainnya untuk memberi peringkat pada hasil seperti yang dijelaskan dalam dokumentasi.

9. Membersihkan lingkungan

Hancurkan instance dan cluster AlloyDB setelah Anda selesai mengerjakan lab

Hapus cluster AlloyDB dan semua instance

Cluster tersebut dihancurkan dengan opsi paksa yang juga akan menghapus semua instance milik cluster tersebut.

Di Cloud Shell, tentukan variabel project dan lingkungan jika koneksi Anda terputus dan semua setelan sebelumnya hilang:

gcloud config set project <your project id>
export REGION=us-central1
export ADBCLUSTER=alloydb-aip-01
export PROJECT_ID=$(gcloud config get-value project)

Hapus cluster:

gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-001-402417)$ gcloud alloydb clusters delete $ADBCLUSTER --region=$REGION --force
All of the cluster data will be lost when the cluster is deleted.

Do you want to continue (Y/n)?  Y

Operation ID: operation-1697820178429-6082890a0b570-4a72f7e4-4c5df36f
Deleting cluster...done.   

Hapus Cadangan AlloyDB

Hapus semua cadangan AlloyDB untuk cluster:

for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-001-402417)$ for i in $(gcloud alloydb backups list --filter="CLUSTER_NAME: projects/$PROJECT_ID/locations/$REGION/clusters/$ADBCLUSTER" --format="value(name)" --sort-by=~createTime) ; do gcloud alloydb backups delete $(basename $i) --region $REGION --quiet; done
Operation ID: operation-1697826266108-60829fb7b5258-7f99dc0b-99f3c35f
Deleting backup...done.                                                                                                                                                                                                                                                            

10. Selamat

Selamat, Anda telah menyelesaikan codelab. Anda telah mempelajari cara menggunakan penelusuran multimodal di AlloyDB menggunakan fungsi embedding untuk teks dan gambar. Anda dapat mencoba menguji penelusuran multimodal dan meningkatkannya dengan fungsi google_ml.rank menggunakan codelab untuk operator AI AlloyDB.

Yang telah kita bahas

  • Cara men-deploy AlloyDB untuk Postgres
  • Cara menggunakan penelusuran vektor multimodal
  • Cara mengaktifkan operator AI AlloyDB
  • Cara menggunakan berbagai operator AlloyDB AI untuk penelusuran multimodal
  • Cara menggunakan AlloyDB AI untuk menggabungkan hasil penelusuran teks dan gambar

11. Survei

Output:

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membaca dan menyelesaikan latihannya