Embedding Multimodal di AlloyDB

1. Pengantar

bb67830f66d83d3f.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 AlloyDB Studio
  • Cara menggunakan penelusuran vektor multimodal
  • Cara mengaktifkan operator AlloyDB AI
  • 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 Project

  1. Login ke Konsol Google Cloud. Jika belum memiliki akun Gmail atau Google Workspace, Anda harus membuatnya.

Gunakan akun pribadi, bukan akun kantor atau sekolah.

  1. Buat project baru atau gunakan kembali project yang sudah ada. Untuk membuat project baru di konsol Google Cloud, di header, klik tombol Pilih project yang akan membuka jendela pop-up.

295004821bab6a87.png

Di jendela Select a project, tekan tombol New Project yang akan membuka kotak dialog untuk project baru.

37d264871000675d.png

Di kotak dialog, masukkan Nama project yang Anda inginkan dan pilih lokasi.

96d86d3d5655cdbe.png

  • Project name adalah nama tampilan untuk peserta project ini. Nama project tidak digunakan oleh Google API, dan dapat diubah kapan saja.
  • Project ID bersifat unik di semua project Google Cloud dan tidak dapat diubah (tidak dapat diubah setelah ditetapkan). Konsol Google Cloud otomatis membuat ID unik, tetapi Anda dapat menyesuaikannya. Jika tidak menyukai ID yang dibuat, Anda dapat membuat ID acak lain atau memberikan ID Anda sendiri untuk memeriksa ketersediaannya. Di sebagian besar codelab, Anda harus merujuk project ID Anda, yang biasanya diidentifikasi dengan placeholder PROJECT_ID.
  • Sebagai informasi, ada nilai ketiga, Project Number, yang digunakan oleh beberapa API. Pelajari lebih lanjut ketiga nilai ini di dokumentasi.

Aktifkan Penagihan

Untuk mengaktifkan penagihan, Anda memiliki dua opsi. Anda dapat menggunakan akun penagihan pribadi atau menukarkan kredit dengan langkah-langkah berikut.

Tukarkan kredit Google Cloud senilai $5 (opsional)

Untuk menjalankan workshop ini, Anda memerlukan Akun Penagihan dengan sejumlah kredit. Jika Anda berencana menggunakan penagihan sendiri, Anda dapat melewati langkah ini.

  1. Klik link ini dan login dengan Akun Google pribadi.
  2. Anda akan melihat sesuatu seperti ini:

f54628965f465486.png

  1. Klik tombol KLIK DI SINI UNTUK MENGAKSES KREDIT ANDA. Anda akan diarahkan ke halaman untuk menyiapkan profil penagihan. Jika Anda melihat layar pendaftaran uji coba gratis, klik batal dan lanjutkan untuk menautkan penagihan.

20e88842cf2a732e.png

  1. Klik Confirm. Anda kini terhubung ke Akun Penagihan Uji Coba Google Cloud Platform.

cdc87f1c57777951.png

Menyiapkan akun penagihan pribadi

Jika menyiapkan penagihan menggunakan kredit Google Cloud, Anda dapat melewati langkah ini.

Untuk menyiapkan akun penagihan pribadi, buka di sini untuk mengaktifkan penagihan di Cloud Console.

Beberapa Catatan:

  • Menyelesaikan lab ini akan dikenai biaya kurang dari $3 USD untuk resource Cloud.
  • Anda dapat mengikuti langkah-langkah di akhir lab ini untuk menghapus resource agar tidak dikenai biaya lebih lanjut.
  • Pengguna baru memenuhi syarat untuk mengikuti 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:

Mengaktifkan Cloud Shell

Atau, Anda dapat menekan G, lalu S. Urutan ini akan mengaktifkan Cloud Shell jika Anda berada dalam Konsol Google Cloud atau menggunakan link ini.

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

Screenshot terminal Google Cloud Shell yang menunjukkan bahwa lingkungan telah terhubung

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

Untuk menggunakan AlloyDB, Compute Engine, Layanan jaringan, dan Vertex AI, Anda harus mengaktifkan API masing-masing di project Google Cloud Anda.

Di dalam Cloud Shell di terminal, 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.

Memperkenalkan API

  • AlloyDB API (alloydb.googleapis.com) memungkinkan Anda membuat, mengelola, dan menskalakan cluster AlloyDB untuk PostgreSQL. Layanan ini menyediakan layanan database yang kompatibel dengan PostgreSQL dan terkelola sepenuhnya, yang dirancang untuk workload transaksional dan analitis perusahaan yang berat.
  • Compute Engine API (compute.googleapis.com) memungkinkan Anda membuat dan mengelola mesin virtual (VM), persistent disk, dan setelan jaringan. Layanan ini menyediakan fondasi Infrastructure-as-a-Service (IaaS) inti yang diperlukan untuk menjalankan beban kerja Anda dan menghosting infrastruktur yang mendasarinya untuk banyak layanan terkelola.
  • Cloud Resource Manager API (cloudresourcemanager.googleapis.com) memungkinkan Anda mengelola metadata dan konfigurasi project Google Cloud secara terprogram. Dengan demikian, Anda dapat mengatur resource, menangani kebijakan Identity and Access Management (IAM), dan memvalidasi izin di seluruh hierarki project.
  • Service Networking API (servicenetworking.googleapis.com) memungkinkan Anda mengotomatiskan penyiapan konektivitas pribadi antara jaringan Virtual Private Cloud (VPC) dan layanan terkelola Google. Hal ini secara khusus diperlukan untuk membuat akses IP pribadi bagi layanan seperti AlloyDB agar dapat berkomunikasi dengan aman dengan resource Anda yang lain.
  • Vertex AI API (aiplatform.googleapis.com) memungkinkan aplikasi Anda membangun, men-deploy, dan menskalakan model machine learning. Vertex AI menyediakan antarmuka terpadu untuk semua layanan AI Google Cloud, termasuk akses ke model AI Generatif (seperti Gemini) dan pelatihan model kustom.

4. Men-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 mengonfigurasi 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 di suatu tempat agar dapat digunakan nanti.

Output konsol yang diharapkan:

student@cloudshell:~ (test-project-402417)$ echo $PGPASSWORD
bbefbfde7601985b0dee5723 (Note: Yours will be different!)

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. Jika Anda telah membuat cluster uji coba gratis di langkah sebelumnya, lewati langkah ini.

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.

abc505ac4d41f24e.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 di AlloyDB Studio.

Di tab baru, buka halaman Clusters di AlloyDB untuk Postgres.

Buka antarmuka konsol web untuk cluster AlloyDB Anda dengan mengklik instance utama.

1d7298e7096e7313.png

Kemudian, klik AlloyDB Studio di sebelah kiri:

a33131c72ad29478.png

Pilih database postgres, pengguna postgres, dan berikan sandi yang dicatat saat kita membuat cluster. Kemudian, klik tombol "Autentikasi". Jika Anda lupa mencatat sandi atau sandi tidak berfungsi - Anda dapat mengubah sandi. Lihat dokumentasi tentang cara melakukannya.

2fcb84f70448118c.png

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

a127047c343731ff.png

Tindakan ini akan membuka antarmuka tempat Anda dapat menjalankan perintah SQL

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

5ac657387f7b6ec3.png

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

309e09003db414c3.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;

Set 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:

c6b0663eb31c3347.png

Kemudian, verifikasi jumlah baris di salah satu tabel.

select count(*) from ecomm.products;

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

Di AlloyDB Studio yang terhubung ke quickstart_db, coba telusuri 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. 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 lebih atau kurang persis dan relevansi respons.

Sekarang kita dapat melakukan penelusuran serupa menggunakan embedding. Kami telah menghitung embedding produk kami sebelumnya 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 menempatkan hasil yang paling relevan di bagian atas.

Kueri dengan embedding menampilkan hasil dalam 90-150 md, dengan sebagian waktu digunakan untuk mendapatkan data dari model embedding 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 data menggunakan indeks ScaNN AlloyDB membutuhkan waktu kurang dari 7 md.

Berikut adalah output rencana eksekusi:

Batas (biaya=2709,20..2718,82 baris=10 lebar=490) (waktu sebenarnya=6,966..7,049 baris=10 loop=1)

-> Pemindaian Indeks menggunakan embedding_scann pada produk (biaya=2709.20..30736.40 baris=29120 lebar=490) (waktu sebenarnya=6.964..7.046 baris=10 loop=1)

     Order By: (product_embedding &lt;=&gt; '[-0.0020264734,-0.016582033,0.027258193

...

-0.0051468653,-0.012440448]'::vector)

     Limit: 10

Waktu Perencanaan: 136.579 md

Waktu Eksekusi: 6.791 md

(6 baris)

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 hanya deskripsi tekstual. Misalnya - "cari mantel seperti yang ada di gambar".

Mari kita kembali ke contoh jaket. Jika saya memiliki gambar jaket yang mirip dengan yang ingin saya temukan, saya dapat meneruskannya ke model embedding multimodal Google dan membandingkannya dengan embedding untuk gambar produk saya. Dalam tabel ini, kita sudah menghitung embedding 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.5.2, jalankan prosedur berikut.

CALL google_ml.upgrade_to_preview_version();

Kemudian, periksa kembali versi ekstensi. Versinya harus 1.5.3.

SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';

Kita juga perlu mengaktifkan fitur mesin kueri AI di database kita. Hal ini dapat dilakukan dengan memperbarui flag menurut instance untuk semua database di instance atau dengan mengaktifkannya hanya untuk database kita. Jalankan perintah berikut di AlloyDB Studio untuk mengaktifkannya bagi database quickstart_db.

ALTER DATABASE quickstart_db SET google_ml_integration.enable_ai_query_engine = 'on';

Sekarang kita dapat menelusuri berdasarkan gambar. 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.

664bf0bc3fc4e72d.jpeg

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. Untuk melihat gambar, Anda dapat mendownloadnya menggunakan Cloud SDK (gcloud storage cp) dengan memberikan kolom public_url, lalu membukanya menggunakan alat apa pun yang berfungsi dengan gambar.

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 kueri tersebut bekerja dengan indeks ScaNN AlloyDB kita.

Berikut adalah output untuk rencana eksekusi:

Batas (biaya=971,70..975,55 baris=4 lebar=490) (waktu sebenarnya=2,453..2,477 baris=4 loop=1)

-> Index Scan menggunakan product_image_embedding_scann pada produk (cost=971.70..28998.90 rows=29120 width=490) (actual time=2.451..2.475 rows=4 loops=1)

     Order By: (product_image_embedding &lt;=&gt; '[0.02119865,0.034206174,0.030682731,

...

,-0.010307034,-0.010053742]'::vector)

     Limit: 4

Waktu Perencanaan: 913.322 md

Waktu Eksekusi: 2.517 md

(6 baris)

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 kita coba 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 set 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 kita:

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 hasilnya 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 lain 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

Jika Anda telah menggunakan versi uji coba AlloyDB. Jangan hapus cluster uji coba jika Anda berencana menguji lab dan resource lain menggunakan cluster uji coba. Anda tidak akan dapat membuat cluster uji coba lain dalam project yang sama.

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.

Jalur Pembelajaran Google Cloud

Lab ini merupakan bagian dari Alur Pembelajaran AI Siap Produksi dengan Google Cloud.

  • Jelajahi kurikulum lengkap untuk menjembatani kesenjangan dari prototipe hingga produksi.
  • Bagikan progres Anda dengan hashtag #ProductionReadyAI.

Yang telah kita bahas

  • Cara men-deploy AlloyDB untuk Postgres
  • Cara menggunakan AlloyDB Studio
  • Cara menggunakan penelusuran vektor multimodal
  • Cara mengaktifkan operator AlloyDB AI
  • 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