1. Pengantar
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
- 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.
- 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.
- 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:
Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:
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.
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.
Kemudian, klik AlloyDB Studio di sebelah kiri:
Pilih database postgres, pengguna postgres, dan berikan sandi yang dicatat saat kita membuat cluster. Kemudian, klik tombol "Autentikasi".
Tindakan ini akan membuka antarmuka AlloyDB Studio. Untuk menjalankan perintah di database, klik tab "Editor 1" di sebelah kanan.
Tindakan ini akan membuka antarmuka tempat Anda dapat menjalankan perintah SQL
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.
Pilih database quickstart_db baru dari daftar dropdown dan gunakan pengguna dan sandi yang sama seperti sebelumnya.
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:
Lalu, verifikasi jumlah baris di salah satu tabel.
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.
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.
Penelusuran campuran teks dan gambar
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: