Membangun Asisten Shopping Pintar dengan AlloyDB dan Vertex AI Agent Builder - Bagian 1

1. Ringkasan

Dalam lanskap retail yang serba cepat saat ini, memberikan layanan pelanggan yang luar biasa sekaligus memungkinkan pengalaman belanja yang dipersonalisasi adalah hal yang sangat penting. Kami akan mengajak Anda dalam perjalanan teknis melalui pembuatan aplikasi chat berbasis pengetahuan yang dirancang untuk menjawab pertanyaan pelanggan, memandu penemuan produk, dan menyesuaikan hasil penelusuran. Solusi inovatif ini menggabungkan kemampuan AlloyDB untuk penyimpanan data, mesin analisis internal untuk pemahaman kontekstual, Gemini (Model Bahasa Besar) untuk validasi relevansi, dan Agent Builder Google untuk melakukan bootstrapping cepat pada asisten percakapan yang cerdas.

Tantangan: Pelanggan retail modern mengharapkan jawaban instan dan rekomendasi produk yang sesuai dengan preferensi unik mereka. Metode penelusuran tradisional sering kali tidak dapat memberikan tingkat personalisasi ini.

Solusi: Aplikasi chat berbasis pengetahuan kami mengatasi tantangan ini secara langsung. Fitur ini memanfaatkan pusat informasi lengkap yang berasal dari data retail Anda untuk memahami maksud pelanggan, merespons secara cerdas, dan memberikan hasil yang sangat relevan.

Yang akan Anda build

Sebagai bagian dari lab ini (Bagian 1), Anda akan:

  1. Membuat instance AlloyDB dan memuat Set Data E-commerce
  2. Mengaktifkan ekstensi model AI generatif dan pgvector di AlloyDB
  3. Membuat embedding dari deskripsi produk
  4. Melakukan penelusuran kemiripan Cosine real-time untuk teks penelusuran pengguna
  5. Men-deploy solusi di Cloud Run Functions serverless

Bagian kedua lab ini akan membahas langkah-langkah Agent Builder.

Persyaratan

  • Browser, seperti Chrome atau Firefox
  • Project Google Cloud yang mengaktifkan penagihan.

2. Arsitektur

Alur Data: Mari kita lihat lebih dekat cara data bergerak melalui sistem kami:

Penyerapan:

Langkah pertama kita adalah menyerap data Retail (inventaris, deskripsi produk, interaksi pelanggan) ke AlloyDB.

Mesin Analisis:

Kita akan menggunakan AlloyDB sebagai mesin analisis untuk melakukan hal berikut:

  1. Ekstraksi Konteks: Mesin menganalisis data yang disimpan dalam AlloyDB untuk memahami hubungan antara produk, kategori, perilaku pelanggan, dll. sebagaimana berlaku.
  2. Pembuatan Embedding: Embedding (representasi matematika dari teks) dibuat untuk kueri pengguna dan informasi yang disimpan di AlloyDB.
  3. Penelusuran Vektor: Mesin melakukan penelusuran kemiripan, membandingkan embedding kueri dengan embedding deskripsi produk, ulasan, dan data relevan lainnya. Hal ini mengidentifikasi 25 "tetangga terdekat" yang paling relevan.

Validasi Gemini:

Respons potensial ini dikirim ke Gemini untuk dinilai. Gemini menentukan apakah informasi tersebut benar-benar relevan dan aman untuk dibagikan kepada pengguna.

Pembuatan Respons:

Respons yang divalidasi disusun ke dalam array JSON dan seluruh mesin dikemas ke dalam Fungsi Cloud Run serverless yang dipanggil dari Agent Builder.

Interaksi Percakapan:

Agent Builder menyajikan respons kepada pengguna dalam format bahasa alami, sehingga memfasilitasi dialog dua arah. Bagian ini akan dibahas di lab lanjutan.

3. Sebelum memulai

Membuat project

  1. Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
  2. Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project .
  3. Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud yang telah dilengkapi dengan bq. Klik Activate Cloud Shell di bagian atas konsol Google Cloud.

Gambar tombol Activate Cloud Shell

  1. Setelah terhubung ke Cloud Shell, Anda dapat memeriksa bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda menggunakan perintah berikut:
gcloud auth list
  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa perintah gcloud mengetahui project Anda.
gcloud config list project
  1. Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>
  1. Mengaktifkan API yang diperlukan.
gcloud services enable alloydb.googleapis.com \
                       compute.googleapis.com \
                       cloudresourcemanager.googleapis.com \
                       servicenetworking.googleapis.com \
                       run.googleapis.com \
                       cloudbuild.googleapis.com \
                       cloudfunctions.googleapis.com \
                       aiplatform.googleapis.com

Alternatif untuk perintah gcloud adalah melalui konsol dengan menelusuri setiap produk atau menggunakan link ini.

Jika ada API yang terlewat, Anda dapat mengaktifkannya kapan saja selama proses penerapan.

Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya.

4. Penyiapan database

Di lab ini, kita akan menggunakan AlloyDB sebagai database untuk menyimpan data retail. Cloud SQL menggunakan cluster untuk menyimpan semua resource, seperti database dan log. Setiap cluster memiliki instance utama yang menyediakan titik akses ke data. Tabel akan menyimpan data sebenarnya.

Mari kita buat cluster, instance, dan tabel AlloyDB tempat set data e-commerce akan dimuat.

Membuat cluster dan instance

  1. Buka halaman AlloyDB di Konsol Cloud. Cara mudah untuk menemukan sebagian besar halaman di Konsol Cloud adalah dengan menelusurinya menggunakan kotak penelusuran konsol.
  2. Pilih CREATE CLUSTER dari halaman tersebut:

f76ff480c8c889aa.png

  1. Anda akan melihat layar seperti di bawah. Buat cluster dan instance dengan nilai berikut:
  • cluster id: "shopping-cluster"
  • sandi: "alloydb"
  • Kompatibel dengan PostgreSQL 15
  • Wilayah: "us-central1"
  • Jaringan: "default"

538dba58908162fb.png

  1. Saat Anda memilih jaringan default, Anda akan melihat layar seperti di bawah. Pilih SIAPKAN KONEKSI.
    7939bbb6802a91bf.png
  2. Dari sana, pilih "Gunakan rentang IP yang dialokasikan secara otomatis", lalu Lanjutkan. Setelah meninjau informasi, pilih BUAT KONEKSI. 768ff5210e79676f.png
  3. Setelah jaringan disiapkan, Anda dapat melanjutkan pembuatan cluster. Klik CREATE CLUSTER untuk menyelesaikan penyiapan cluster seperti yang ditunjukkan di bawah:

e06623e55195e16e.png

Pastikan untuk mengubah ID instance menjadi "shopping-instance".

Perhatikan bahwa pembuatan Cluster akan memerlukan waktu sekitar 10 menit. Setelah berhasil, Anda akan melihat layar yang mirip dengan yang berikut ini:

24eec29fa5cfdb3e.png

5. Penyerapan data

Sekarang saatnya menambahkan tabel dengan data tentang toko. Buka AlloyDB, pilih cluster utama, lalu AlloyDB Studio:

847e35f1bf8a8bd8.png

Anda mungkin perlu menunggu hingga instance selesai dibuat. Setelah selesai, login ke AlloyDB menggunakan kredensial yang Anda buat saat membuat cluster. Gunakan data berikut untuk melakukan autentikasi ke PostgreSQL:

  • Nama pengguna : "postgres"
  • Database : "postgres"
  • Sandi : "alloydb"

Setelah Anda berhasil diautentikasi ke AlloyDB Studio, perintah SQL dimasukkan di Editor. Anda dapat menambahkan beberapa jendela Editor menggunakan tanda plus di sebelah kanan jendela terakhir.

91a86d9469d499c4.png

Anda akan memasukkan perintah untuk AlloyDB di jendela editor, menggunakan opsi Jalankan, Format, dan Hapus sesuai kebutuhan.

Mengaktifkan Ekstensi

Untuk membangun aplikasi ini, kita akan menggunakan ekstensi pgvector dan google_ml_integration. Ekstensi pgvector memungkinkan Anda menyimpan dan menelusuri embedding vektor. Ekstensi google_ml_integration menyediakan fungsi yang Anda gunakan untuk mengakses endpoint prediksi Vertex AI guna mendapatkan prediksi di SQL. Aktifkan ekstensi ini dengan menjalankan DDL berikut:

CREATE EXTENSION IF NOT EXISTS google_ml_integration CASCADE;
CREATE EXTENSION IF NOT EXISTS vector;

Jika Anda ingin memeriksa ekstensi yang telah diaktifkan di database Anda, jalankan perintah SQL ini:

select extname, extversion from pg_extension;

Membuat tabel

Buat tabel menggunakan pernyataan DDL di bawah:

CREATE TABLE
 apparels ( id BIGINT,
   category VARCHAR(100),
   sub_category VARCHAR(50),
   uri VARCHAR(200),
   image VARCHAR(100),
   content VARCHAR(2000),
   pdt_desc VARCHAR(5000),
   embedding vector(768) );

Setelah berhasil menjalankan perintah di atas, Anda akan dapat melihat tabel di database. Contoh screenshot ditampilkan di bawah:

908e33bbff58a6d.png

Menyerap data

Untuk lab ini, kita memiliki data pengujian sekitar 200 rekaman dalam file SQL ini. Berisi id, category, sub_category, uri, image, dan content. Kolom lainnya akan diisi nanti di lab.

Salin 20 baris/pernyataan penyisipan dari sana, lalu tempelkan baris tersebut di tab editor kosong dan pilih RUN.

Untuk melihat isi tabel, luaskan bagian Explorer hingga Anda dapat melihat tabel bernama apparels. Pilih tiga titik (⋮) untuk melihat opsi Kueri tabel. Pernyataan SELECT akan terbuka di tab Editor baru.

b31ece70e670ab89.png

Berikan Izin

Jalankan pernyataan di bawah untuk memberikan hak eksekusi pada fungsi embedding kepada pengguna postgres:

GRANT EXECUTE ON FUNCTION embedding TO postgres;

Memberikan PERAN Vertex AI User ke akun layanan AlloyDB

Buka terminal Cloud Shell dan berikan perintah berikut:

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"

6. Konteks

Kembali ke halaman Instance AlloyDB.

Untuk membuat sematan, kita perlu memiliki context, yaitu semua informasi yang ingin kita sertakan dalam satu kolom. Kami akan melakukannya dengan membuat deskripsi produk (yang akan kami sebut pdt_desc). Dalam kasus ini, kami akan menggunakan semua informasi tentang setiap produk, tetapi saat Anda melakukannya dengan data Anda sendiri, Anda dapat merekayasa data dengan cara apa pun yang menurut Anda bermakna bagi bisnis Anda.

Jalankan pernyataan berikut dari AlloyDB Studio di instance yang baru dibuat. Tindakan ini akan memperbarui kolom pdt_desc dengan data konteks:

UPDATE
 apparels
SET
 pdt_desc = CONCAT('This product category is: ', category, ' and sub_category is: ', sub_category, '. The description of the product is as follows: ', content, '. The product image is stored at: ', uri)
WHERE
 id IS NOT NULL;

DML ini membuat ringkasan konteks sederhana menggunakan informasi dari semua kolom yang tersedia dalam tabel dan dependensi lainnya (jika ada dalam kasus penggunaan Anda). Untuk pengelompokan informasi dan pembuatan konteks yang lebih tepat, Anda dapat merekayasa data dengan cara apa pun yang Anda anggap bermakna bagi bisnis Anda.

7. Membuat embedding untuk konteks

Komputer jauh lebih mudah memproses angka daripada memproses teks. Sistem penyematan mengonversi teks menjadi serangkaian angka floating point yang harus merepresentasikan teks, terlepas dari bagaimana teks tersebut disusun, bahasa yang digunakan, dll.

Pertimbangkan untuk mendeskripsikan lokasi di tepi laut. Mungkin disebut "di atas air", "di tepi pantai", "berjalan dari kamar Anda ke laut", "sur la mer", "на берегу океана", dll. Semua istilah ini terlihat berbeda, tetapi makna semantiknya atau dalam terminologi machine learning, embeddingnya harus sangat berdekatan satu sama lain.

Setelah data dan konteks siap, kita akan menjalankan SQL untuk menambahkan embedding deskripsi produk ke tabel di kolom embedding. Ada berbagai model penyematan yang dapat Anda gunakan. Kita menggunakan text-embedding-004 dari Vertex AI. Pastikan untuk menggunakan model sematan yang sama di seluruh project.

Catatan: Jika Anda menggunakan Project Google Cloud yang sudah ada dan dibuat beberapa waktu lalu, Anda mungkin perlu terus menggunakan model penyematan teks versi lama seperti textembedding-gecko.

UPDATE
 apparels
SET
 embedding = embedding( 'text-embedding-004',
   pdt_desc)
WHERE
 TRUE;

Lihat tabel apparels lagi untuk melihat beberapa penyematan. Pastikan untuk menjalankan ulang pernyataan SELECT untuk melihat perubahan.

SELECT
 id,
 category,
 sub_category,
 content,
 embedding
FROM
 apparels;

Tindakan ini akan menampilkan vektor embedding, yang terlihat seperti array float, untuk contoh teks dalam kueri seperti yang ditunjukkan di bawah ini:

c69c08d085389f74.png

Catatan: Project Google Cloud yang baru dibuat dalam paket gratis mungkin mengalami masalah kuota terkait jumlah permintaan penyematan yang diizinkan per detik ke model Penyematan. Sebaiknya gunakan kueri filter untuk ID, lalu pilih 1-5 rekaman secara selektif dan seterusnya, saat membuat penyematan.

8. Melakukan penelusuran Vektor

Setelah tabel, data, dan embedding siap, mari lakukan penelusuran vektor real time untuk teks penelusuran pengguna.

Misalkan pengguna bertanya:

"Saya ingin atasan wanita, kasual warna pink dari katun murni."

Anda dapat menemukan kecocokan untuk hal ini dengan menjalankan kueri di bawah:

SELECT
id,
category,
sub_category,
content,
pdt_desc AS description
FROM
apparels
ORDER BY
embedding <=> embedding('text-embedding-004',
  'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
5;

Mari kita lihat kueri ini secara mendetail:

Dalam kueri ini,

  1. Teks penelusuran pengguna adalah: "Saya ingin atasan wanita, kasual warna pink hanya katun murni."
  2. Kita akan mengonversinya menjadi embedding dalam metode embedding() menggunakan model: text-embedding-004. Langkah ini akan terlihat familiar setelah langkah terakhir, tempat kita menerapkan fungsi penyematan ke semua item dalam tabel.
  3. "<=>" menunjukkan penggunaan metode jarak COSINE SIMILARITY. Anda dapat menemukan semua ukuran kemiripan yang tersedia di dokumentasi pgvector.
  4. Kita mengonversi hasil metode embedding ke jenis vektor agar kompatibel dengan vektor yang disimpan dalam database.
  5. LIMIT 5 menunjukkan bahwa kita ingin mengekstrak 5 tetangga terdekat untuk teks penelusuran.

Hasilnya akan terlihat seperti ini:

4193a68737400535.png

Seperti yang dapat Anda amati di hasil Anda, kecocokannya cukup dekat dengan teks penelusuran. Coba ubah warna untuk melihat perubahan hasilnya.

Catatan Penting:

Sekarang, misalkan kita ingin meningkatkan performa (waktu kueri), efisiensi, dan perolehan hasil Penelusuran Vektor ini menggunakan indeks ScaNN. Baca langkah-langkah dalam blog ini untuk membandingkan perbedaan hasil dengan dan tanpa indeks. Langkah-langkah pembuatan indeks dicantumkan di sini untuk memudahkan:

  1. Karena kita sudah membuat cluster, instance, konteks, dan embedding, kita hanya perlu menginstal ekstensi ScaNN menggunakan pernyataan berikut:

CREATE EXTENSION IF NOT EXISTS alloydb_scann;

  1. Selanjutnya, kita akan membuat indeks (ScaNN):

CREATE INDEX apparel_index ON apparels

USING scann (embedding cosine)

WITH (num_leaves=54);

Dalam DDL di atas, apparel_index adalah nama indeks

"apparels" adalah tabel saya

"scann" adalah metode indeks

"embedding" adalah kolom dalam tabel yang ingin saya indeks

"cosine" adalah metode jarak yang ingin saya gunakan dengan indeks

"54" adalah jumlah partisi yang akan diterapkan ke indeks ini. Tetapkan ke nilai apa pun antara 1 hingga 1048576. Untuk mengetahui informasi selengkapnya tentang cara menentukan nilai ini, lihat Menyesuaikan indeks ScaNN.

Saya menggunakan AKAR KUADRAT dari jumlah titik data seperti yang direkomendasikan di repo ScaNN (Saat membuat partisi, num_leaves harus kira-kira akar kuadrat dari jumlah titik data.).

  1. Periksa apakah indeks dibuat menggunakan kueri:

SELECT * FROM pg_stat_ann_indexes;

  1. Lakukan Vector Search menggunakan kueri yang sama dengan yang kita gunakan tanpa indeks:

select * from apparels

ORDER BY embedding <=> CAST(embedding('textembedding-gecko', 'white tops for girls without any print') as vector(768))

LIMIT 20

Kueri di atas sama dengan kueri yang kita gunakan di lab pada langkah 8. Namun, sekarang kita telah mengindeks kolom tersebut.

  1. Uji dengan kueri penelusuran sederhana dengan dan tanpa indeks (dengan menghapus indeks):

white tops for girls without any print

Teks penelusuran di atas dalam kueri Vector Search pada data embedding yang DIINDEX menghasilkan hasil penelusuran yang berkualitas dan efisien. Efisiensi sangat meningkat (dalam hal waktu eksekusi: 10,37 md tanpa ScaNN dan 0,87 md dengan ScaNN) dengan indeks. Untuk mengetahui informasi selengkapnya tentang topik ini, lihat blog ini.

9. Validasi Kecocokan dengan LLM

Sebelum melanjutkan dan membuat layanan untuk menampilkan kecocokan terbaik ke aplikasi, mari kita gunakan model AI generatif untuk memvalidasi apakah potensi respons ini benar-benar relevan dan aman untuk dibagikan kepada pengguna.

Memastikan instance disiapkan untuk Gemini

Pertama, periksa apakah Integrasi ML Google sudah diaktifkan untuk Cluster dan Instance Anda. Di AlloyDB Studio, berikan perintah berikut:

show google_ml_integration.enable_model_support;

Jika nilai ditampilkan sebagai "aktif", Anda dapat melewati 2 langkah berikutnya dan langsung melanjutkan ke penyiapan integrasi Model AlloyDB dan Vertex AI.

  1. Buka instance utama cluster AlloyDB Anda, lalu klik EDIT PRIMARY INSTANCE

456ffdf292d3c0e0.png

  1. Buka bagian Flags di Advanced Configuration Options. dan pastikan google_ml_integration.enable_model_support flag disetel ke "on" seperti yang ditunjukkan di bawah:

6a59351fcd2a9d35.png

Jika tidak disetel ke "on", setel ke "on", lalu klik tombol UPDATE INSTANCE. Langkah ini akan memakan waktu beberapa menit.

Integrasi Model AlloyDB dan Vertex AI

Sekarang Anda dapat terhubung ke AlloyDB Studio dan menjalankan pernyataan DML berikut untuk menyiapkan akses model Gemini dari AlloyDB, menggunakan project ID Anda di tempat yang ditunjukkan. Anda mungkin diperingatkan tentang error sintaksis sebelum menjalankan perintah, tetapi perintah tersebut akan berjalan dengan baik.

Pertama, kita membuat koneksi model Gemini 1.5 seperti yang ditunjukkan di bawah. Jangan lupa untuk mengganti $PROJECT_ID dalam perintah di bawah dengan ID Project Google Cloud Anda.

CALL
 google_ml.create_model( model_id => 'gemini-1.5',
   model_request_url => 'https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-1.5-pro:streamGenerateContent',
   model_provider => 'google',
   model_auth_type => 'alloydb_service_agent_iam');

Anda dapat memeriksa model yang dikonfigurasi untuk akses melalui perintah berikut di AlloyDB Studio:

select model_id,model_type from google_ml.model_info_view;        

Terakhir, kita perlu memberikan izin kepada pengguna database untuk menjalankan fungsi ml_predict_row guna menjalankan prediksi melalui model Google Vertex AI. Jalankan perintah berikut:

GRANT EXECUTE ON FUNCTION ml_predict_row to postgres;

Catatan: Jika Anda menggunakan Project Google Cloud yang sudah ada dan cluster/instance AlloyDB yang sudah ada yang dibuat beberapa waktu lalu, Anda mungkin perlu menghapus referensi lama ke model gemini-1.5 dan membuatnya lagi dengan pernyataan CALL di atas serta menjalankan grant execute pada fungsi ml_predict_row lagi jika Anda mengalami masalah dalam pemanggilan gemini-1.5 mendatang.

Mengevaluasi respons

Meskipun kita akan menggunakan satu kueri besar di bagian berikutnya untuk memastikan respons dari kueri tersebut wajar, kueri tersebut mungkin sulit dipahami. Kita akan melihat bagian-bagiannya sekarang dan melihat cara menyatukannya dalam beberapa menit.

  1. Pertama, kita akan mengirim permintaan ke database untuk mendapatkan 5 kecocokan terdekat dengan kueri pengguna. Kita akan meng-hardcode kueri agar tetap sederhana, tetapi jangan khawatir, kita akan menginterpolasinya ke dalam kueri nanti. Kami menyertakan deskripsi produk dari tabel apparels dan menambahkan dua kolom baru–satu yang menggabungkan deskripsi dengan indeks dan satu lagi dengan permintaan asli. Semua ini disimpan dalam tabel bernama xyz (hanya nama tabel sementara).
CREATE TABLE
 xyz AS
SELECT
 id || ' - ' || pdt_desc AS literature,
 pdt_desc AS content,
 'I want womens tops, pink casual only pure cotton.' AS  user_text
FROM
 apparels
ORDER BY
 embedding <=> embedding('text-embedding-004',
   'I want womens tops, pink casual only pure cotton.')::vector
LIMIT
 5;

Output kueri ini akan berupa 5 baris paling serupa yang berkaitan dengan kueri pengguna. Tabel xyz baru akan berisi 5 baris dengan setiap baris memiliki kolom berikut:

  • literature
  • content
  • user_text
  1. Untuk menentukan seberapa valid respons, kita akan menggunakan kueri rumit yang menjelaskan cara mengevaluasi respons. Kueri ini menggunakan user_text dan content dalam tabel xyz sebagai bagian dari kueri.
"Read this user search text: ', user_text, 
' Compare it against the product inventory data set: ', content, 
' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
  1. Dengan menggunakan kueri tersebut, kita akan meninjau "kualitas" respons dalam tabel xyz.
CREATE TABLE
  x AS
SELECT
  json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
      request_body => CONCAT('{
 "contents": [ 
        { "role": "user", 
          "parts": 
             [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match." 
             } ]
         } 
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
FROM
    xyz;
  1. predict_row menampilkan hasilnya dalam format JSON. Kode "-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'" digunakan untuk mengekstrak teks sebenarnya dari JSON tersebut. Untuk melihat JSON sebenarnya yang ditampilkan, Anda dapat menghapus kode ini.
  2. Terakhir, untuk mendapatkan kolom LLM, Anda hanya perlu mengekstraknya dari tabel x:
SELECT 
LLM_RESPONSE 
FROM 
        x;
  1. Hal ini dapat digabungkan menjadi satu kueri berikutnya sebagai berikut.

Anda harus menghapus tabel xyz dan x dari database AlloyDB sebelum menjalankan kueri ini, jika Anda telah menjalankan kueri di atas untuk memeriksa hasil sementara.

SELECT
 LLM_RESPONSE
FROM (
 SELECT
 json_array_elements( google_ml.predict_row( model_id => 'gemini-1.5',
     request_body => CONCAT('{
     "contents": [
       { "role": "user",
         "parts":
            [ { "text": "Read this user search text: ', user_text, ' Compare it against the product inventory data set: ', content, ' Return a response with 3 values: 1) MATCH: if the 2 contexts are at least 85% matching or not: YES or NO 2) PERCENTAGE: percentage of match, make sure that this percentage is accurate 3) DIFFERENCE: A clear short easy description of the difference between the 2 products. Remember if the user search text says that some attribute should not be there, and the record has it, it should be a NO match."
            } ]
        }
] }'
)::json))-> 'candidates' -> 0 -> 'content' -> 'parts' -> 0 -> 'text'
AS LLM_RESPONSE
   FROM (
         SELECT
           id || ' - ' || pdt_desc AS literature,
           pdt_desc AS content,
         'I want womens tops, pink casual only pure cotton.' user_text
         FROM
           apparels
         ORDER BY
             embedding <=> embedding('text-embedding-004',
             'I want womens tops, pink casual only pure cotton.')::vector
         LIMIT
           5 ) AS xyz ) AS X;

Meskipun masih terlihat sulit, semoga Anda bisa lebih memahaminya. Hasilnya menunjukkan apakah ada kecocokan atau tidak, berapa persentase kecocokannya, dan beberapa penjelasan tentang rating.

Perhatikan bahwa model Gemini mengaktifkan streaming secara default, sehingga respons sebenarnya tersebar di beberapa baris: 14e74d71293b7b9.png

10. Membawa aplikasi ke web

Siap membawa aplikasi ini ke web? Ikuti langkah-langkah di bawah untuk membuat Knowledge Engine Serverless dengan Cloud Run Functions:

  1. Buka Cloud Run Functions di Konsol Google Cloud untuk MEMBUAT Cloud Run Function baru atau gunakan link: https://console.cloud.google.com/functions/add.
  2. Pilih Lingkungan sebagai "Cloud Run function". Berikan Nama Fungsi "retail-engine" dan pilih Region sebagai "us-central1". Tetapkan Autentikasi ke "Izinkan pemanggilan yang tidak diautentikasi", lalu klik BERIKUTNYA. Pilih Java 17 sebagai runtime dan Inline Editor untuk kode sumber.
  3. Secara default, Entry Point akan ditetapkan ke "gcfv2.HelloHttpFunction". Ganti kode placeholder di HelloHttpFunction.java dan pom.xml Cloud Run Function Anda dengan kode dari file Java dan XML.
  4. Jangan lupa untuk mengubah placeholder $PROJECT_ID dan kredensial koneksi AlloyDB dengan nilai Anda dalam file Java. Kredensial AlloyDB adalah kredensial yang kita gunakan di awal codelab ini. Jika Anda telah menggunakan nilai yang berbeda, ubah nilai yang sama dalam file Java.
  5. Klik Deploy.

Setelah di-deploy, untuk mengizinkan Cloud Function mengakses instance database AlloyDB, kita akan membuat konektor VPC.

LANGKAH PENTING:

Setelah menyiapkan deployment, Anda akan dapat melihat fungsi di konsol Cloud Run Functions Google. Cari fungsi yang baru dibuat (retail-engine), klik fungsi tersebut, lalu klik EDIT dan ubah hal berikut:

  1. Buka Setelan runtime, build, koneksi, dan keamanan
  2. Tingkatkan waktu tunggu menjadi 180 detik
  3. Buka tab KONEKSI:

4e83ec8a339cda08.png

  1. Di bagian setelan Ingress, pastikan "Izinkan semua traffic" dipilih.
  2. Di bagian setelan Egress, Klik dropdown Network, pilih opsi "Add New VPC Connector", lalu ikuti petunjuk yang Anda lihat di kotak dialog yang muncul:

8126ec78c343f199.png

  1. Berikan nama untuk VPC Connector dan pastikan regionnya sama dengan instance Anda. Biarkan nilai Jaringan sebagai default dan tetapkan Subnet sebagai Rentang IP Kustom dengan rentang IP 10.8.0.0 atau yang serupa yang tersedia.
  2. Perluas SHOW SCALING SETTINGS dan pastikan Anda telah menyetel konfigurasi persis seperti berikut:

7baf980463a86a5c.png

  1. Klik CREATE dan konektor ini akan tercantum di setelan egress sekarang.
  2. Pilih konektor yang baru dibuat
  3. Pilih agar semua traffic dirutekan melalui konektor VPC ini.
  4. Klik NEXT, lalu DEPLOY.

11. Menguji aplikasi

Setelah Cloud Function yang diperbarui di-deploy, Anda akan melihat endpoint dalam format berikut:

https://us-central1-YOUR_PROJECT_ID.cloudfunctions.net/retail-engine

Anda dapat mengujinya dari Terminal Cloud Shell dengan menjalankan perintah berikut:

gcloud functions call retail-engine --region=us-central1 --gen2 --data '{"search": "I want some kids clothes themed on Disney"}'

Atau, Anda dapat menguji Cloud Run Function sebagai berikut:

PROJECT_ID=$(gcloud config get-value project)

curl -X POST https://us-central1-$PROJECT_ID.cloudfunctions.net/retail-engine \
  -H 'Content-Type: application/json' \
  -d '{"search":"I want some kids clothes themed on Disney"}' \
  | jq .

Dan hasilnya:

88bc1ddfb5644a28.png

Selesai! Semudah itu melakukan Penelusuran Vektor Kemiripan menggunakan model Embedding pada data AlloyDB.

Membangun Agen Percakapan!

Agen dibangun di bagian 2 lab ini.

12. Pembersihan

Jika Anda berencana menyelesaikan Bagian 2 lab ini, lewati langkah ini karena akan menghapus project saat ini.

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam posting ini, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman Manage resources.
  2. Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

13. Selamat

Selamat! Anda telah berhasil melakukan penelusuran kemiripan menggunakan AlloyDB, pgvector, dan Penelusuran vektor. Dengan menggabungkan kemampuan AlloyDB, Vertex AI, dan Vector Search, kami telah membuat lompatan besar dalam menjadikan penelusuran kontekstual dan vektor dapat diakses, efisien, dan benar-benar didorong oleh makna. Bagian berikutnya dalam lab ini membahas langkah-langkah pembuatan agen.