Mulai menggunakan Spanner Vector Search

1. Pengantar

Spanner adalah layanan database yang terkelola sepenuhnya secara horizontal dan terdistribusi secara global, yang sangat cocok untuk workload operasional relasional dan non-relasional.

Dengan dirilisnya fungsi K-nearest neighbor yang tepat, Spanner kini juga merupakan database vektor yang sangat skalabel, sehingga Anda dapat melakukan penelusuran kemiripan atau semantik dan menerapkan retrieval-Augmented Generation (RAG) dalam aplikasi GenAI dalam skala besar. Kueri penelusuran vektor Spanner menampilkan data real-time yang baru segera setelah transaksi di-commit, sama seperti kueri lainnya di data operasional.

Di lab ini, Anda akan mempelajari cara menyiapkan fitur dasar yang diperlukan untuk memanfaatkan Spanner guna melakukan penelusuran vektor, serta mengakses embedding dan model LLM dari model garden VertexAI menggunakan SQL.

Arsitekturnya akan terlihat seperti ini:

d179a760add7adc0.png

Yang akan Anda bangun

Sebagai bagian dari lab ini, Anda akan:

  • Membuat instance Spanner
  • Menyiapkan skema database Spanner untuk diintegrasikan dengan model embedding dan LLM di VertexAI
  • Memuat set data retail
  • Terbitkan kueri penelusuran kesamaan terhadap {i>dataset<i}
  • Memberikan konteks ke model LLM untuk menghasilkan rekomendasi khusus produk.

Yang akan Anda pelajari

  • Cara menyiapkan instance Spanner
  • Cara berintegrasi dengan VertexAI
  • Cara menggunakan Spanner untuk melakukan penelusuran vektor guna menemukan item serupa dalam set data retail

Yang akan Anda butuhkan

  • Project Google Cloud yang terhubung ke akun penagihan.
  • Browser web, seperti Chrome atau Firefox.

2. Penyiapan dan persyaratan

Membuat project

Jika belum memiliki Akun Google (Gmail atau Google Apps), Anda harus membuatnya. Login ke konsol Google Cloud Platform ( console.cloud.google.com) dan buat project baru.

Jika Anda sudah memiliki project, klik menu pull-down pilihan project di kiri atas konsol:

6c9406d9b014760.png

dan klik tombol 'PROJECT BARU' dalam dialog yang dihasilkan untuk membuat project baru:

949d83c8a4ee17d9.pngS

Jika belum memiliki project, Anda akan melihat dialog seperti ini untuk membuat project pertama:

870a3cbd6541ee86.png

Dialog pembuatan project berikutnya memungkinkan Anda memasukkan detail project baru:

6a92c57d3250a4b3.png

Ingat project ID yang merupakan nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project_ID selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

Selanjutnya, jika belum melakukannya, Anda harus mengaktifkan penagihan di Developers Console untuk menggunakan resource Google Cloud dan mengaktifkan Spanner API.

15d0ef27a8fbab27.png

Menjalankan melalui codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "pembersihan" di akhir dokumen ini). Harga Google Cloud Spanner didokumentasikan di sini.

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai $300, yang menjadikan codelab ini sepenuhnya gratis.

Penyiapan Google Cloud Shell

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

Mesin virtual berbasis Debian ini memuat semua alat pengembangan yang akan Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Ini berarti bahwa semua yang Anda perlukan untuk codelab ini adalah browser (ya, ini berfungsi di Chromebook).

  1. Untuk mengaktifkan Cloud Shell dari Konsol Cloud, cukup klik Aktifkan Cloud Shell gcLMt5IuEcJJNnMId-Bcz3sxCd0rZn7IzT_r95C8UZeqML68Y1efBG_B0VRp7hc7qiZTLAF-TXD7SsOadxn8uadgHhaLeASnVS3ZHK39eOlKJOgj9SJua_oeGhMxRrbOg3qigddS2A (hanya perlu waktu beberapa saat untuk melakukan penyediaan dan terhubung ke lingkungan).

JjEuRXGg0AYYIY6QZ8d-66gx_Mtc-_jDE9ijmbXLJSAXFvJt-qUpNtsBsYjNpv2W6BQSrDc1D-ARINNQ-1EkwUhz-iUK-FUCZhJ-NtjvIEx9pIkE-246DomWuCfiGHK78DgoeWkHRw

Screen Shot 2017-06-14 at 10.13.43 PM.png

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke PROJECT_ID Anda.

gcloud auth list

Output perintah

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika, untuk beberapa alasan, project belum disetel, cukup jalankan perintah berikut:

gcloud config set project <PROJECT_ID>

Mencari PROJECT_ID Anda? Periksa ID yang Anda gunakan di langkah-langkah penyiapan atau cari di dasbor Cloud Console:

158fNPfwSxsFqz9YbtJVZes8viTS3d1bV4CVhij3XPxuzVFOtTObnwsphlm6lYGmgdMFwBJtc-FaLrZU7XHAg_ZYoCrgombMRR3h-eolLPcvO351c5iBv506B3ZwghZoiRg6cz23Qw

Cloud Shell juga menetapkan beberapa variabel lingkungan secara default, yang mungkin berguna saat Anda menjalankan perintah di masa mendatang.

echo $GOOGLE_CLOUD_PROJECT

Output perintah

<PROJECT_ID>

Mengaktifkan Spanner API

gcloud services enable spanner.googleapis.com

Ringkasan

Pada langkah ini, Anda telah menyiapkan project jika belum memilikinya, mengaktifkan cloud shell, dan mengaktifkan API yang diperlukan.

Berikutnya

Selanjutnya, Anda akan menyiapkan instance dan database Spanner.

3. Membuat instance dan database Spanner

Membuat instance Spanner

Pada langkah ini, kita akan menyiapkan Instance Spanner untuk codelab. Untuk melakukannya, buka Cloud Shell dan jalankan perintah ini:

export SPANNER_INSTANCE_ID=retail-demo
gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1

Output perintah:

$ gcloud spanner instances create $SPANNER_INSTANCE_ID \
--config=regional-us-central1 \
--description="spanner AI retail demo" \
--nodes=1
Creating instance...done.  

Membuat database

Setelah instance berjalan, Anda dapat membuat database. Spanner memungkinkan beberapa database pada satu instance.

{i>Database<i} adalah tempat Anda menentukan skema. Anda juga dapat mengontrol siapa saja yang memiliki akses ke database, menyiapkan enkripsi kustom, mengonfigurasi pengoptimal, dan menetapkan periode retensi.

Untuk membuat database, gunakan kembali alat command line gcloud:

export SPANNER_DATABASE=cymbal-bikes
gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID

Output perintah:

$ gcloud spanner databases create $SPANNER_DATABASE \
 --instance=$SPANNER_INSTANCE_ID
Creating database...done.

Ringkasan

Pada langkah ini, Anda telah membuat instance dan database Spanner.

Berikutnya

Selanjutnya, Anda akan menyiapkan skema dan data Spanner.

4. Memuat data dan skema Cymbal

Membuat skema Cymbal

Untuk menyiapkan skema, buka Spanner Studio:

3e1a0fed928b33cf.pngS

Ada dua bagian untuk skema ini. Pertama, Anda ingin menambahkan tabel products. Salin dan tempel pernyataan ini di tab kosong.

Untuk skemanya, salin dan tempel DDL ini ke dalam kotak:

CREATE TABLE products (
categoryId INT64 NOT NULL,
productId INT64 NOT NULL,
productName STRING(MAX) NOT NULL,
productDescription STRING(MAX) NOT NULL,
productDescriptionEmbedding ARRAY<FLOAT64>,
createTime TIMESTAMP NOT NULL OPTIONS (
allow_commit_timestamp = true
),
inventoryCount INT64 NOT NULL,
priceInCents INT64,
) PRIMARY KEY(categoryId, productId);

Kemudian, klik tombol run dan tunggu beberapa detik hingga skema Anda selesai dibuat.

Selanjutnya, Anda akan membuat kedua model tersebut dan mengonfigurasinya ke endpoint model VertexAI.

Model pertama adalah model Embedding yang digunakan untuk menghasilkan embedding dari teks, dan yang kedua adalah model LLM yang digunakan untuk menghasilkan respons berdasarkan data di Spanner.

Tempel skema berikut ke tab baru di Spanner Studio:

CREATE MODEL EmbeddingsModel INPUT(
content STRING(MAX),
) OUTPUT(
embeddings STRUCT<statistics STRUCT<truncated BOOL, token_count FLOAT64>, values ARRAY<FLOAT64>>,
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/textembedding-gecko@003'
);

CREATE MODEL LLMModel INPUT(
prompt STRING(MAX),
) OUTPUT(
content STRING(MAX),
) REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/<PROJECT_ID>/locations/us-central1/publishers/google/models/text-bison@001',
default_batch_size = 1
);

Kemudian, klik tombol run dan tunggu beberapa detik hingga model Anda dibuat.

Di panel kiri Spanner Studio, Anda akan melihat tabel dan model berikut:

62455aa4b0e839d9.pngS

Memuat data

Sekarang, Anda akan memasukkan beberapa produk ke dalam database. Buka tab baru di Spanner Studio, lalu salin dan tempel pernyataan penyisipan berikut:

INSERT INTO products (categoryId, productId, productName, productDescription, createTime, inventoryCount, priceInCents)
VALUES (1, 1, "Cymbal Helios Helmet", "Safety meets style with the Cymbal children's bike helmet. Its lightweight design, superior ventilation, and adjustable fit ensure comfort and protection on every ride. Stay bright and keep your child safe under the sun with Cymbal Helios!", PENDING_COMMIT_TIMESTAMP(), 100, 10999),
(1, 2, "Cymbal Sprout", "Let their cycling journey begin with the Cymbal Sprout, the ideal balance bike for beginning riders ages 2-4 years. Its lightweight frame, low seat height, and puncture-proof tires promote stability and confidence as little ones learn to balance and steer. Watch them sprout into cycling enthusiasts with Cymbal Sprout!", PENDING_COMMIT_TIMESTAMP(), 10, 13999),
(1, 3, "Cymbal Spark Jr.", "Light, vibrant, and ready for adventure, the Spark Jr. is the perfect first bike for young riders (ages 5-8). Its sturdy frame, easy-to-use brakes, and puncture-resistant tires inspire confidence and endless playtime. Let the spark of cycling ignite with Cymbal!", PENDING_COMMIT_TIMESTAMP(), 34, 13900),
(1, 4, "Cymbal Summit", "Conquering trails is a breeze with the Summit mountain bike. Its lightweight aluminum frame, responsive suspension, and powerful disc brakes provide exceptional control and comfort for experienced bikers navigating rocky climbs or shredding downhill. Reach new heights with Cymbal Summit!", PENDING_COMMIT_TIMESTAMP(), 0, 79999),
(1, 5, "Cymbal Breeze", "Cruise in style and embrace effortless pedaling with the Breeze electric bike. Its whisper-quiet motor and long-lasting battery let you conquer hills and distances with ease. Enjoy scenic rides, commutes, or errands with a boost of confidence from Cymbal Breeze!", PENDING_COMMIT_TIMESTAMP(), 72, 129999),
(1, 6, "Cymbal Trailblazer Backpack", "Carry all your essentials in style with the Trailblazer backpack. Its water-resistant material, multiple compartments, and comfortable straps keep your gear organized and accessible, allowing you to focus on the adventure. Blaze new trails with Cymbal Trailblazer!", PENDING_COMMIT_TIMESTAMP(), 24, 7999),
(1, 7, "Cymbal Phoenix Lights", "See and be seen with the Phoenix bike lights. Powerful LEDs and multiple light modes ensure superior visibility, enhancing your safety and enjoyment during day or night rides. Light up your journey with Cymbal Phoenix!", PENDING_COMMIT_TIMESTAMP(), 87, 3999),
(1, 8, "Cymbal Windstar Pump", "Flat tires are no match for the Windstar pump. Its compact design, lightweight construction, and high-pressure capacity make inflating tires quick and effortless. Get back on the road in no time with Cymbal Windstar!", PENDING_COMMIT_TIMESTAMP(), 36, 24999),
(1, 9,"Cymbal Odyssey Multi-Tool","Be prepared for anything with the Odyssey multi-tool. This handy gadget features essential tools like screwdrivers, hex wrenches, and tire levers, keeping you ready for minor repairs and adjustments on the go. Conquer your journey with Cymbal Odyssey!", PENDING_COMMIT_TIMESTAMP(), 52, 999),
(1, 10,"Cymbal Nomad Water Bottle","Stay hydrated on every ride with the Nomad water bottle. Its sleek design, BPA-free construction, and secure lock lid make it the perfect companion for staying refreshed and motivated throughout your adventures. Hydrate and explore with Cymbal Nomad!", PENDING_COMMIT_TIMESTAMP(), 42, 1299);

Klik tombol run untuk menyisipkan data.

Ringkasan

Pada langkah ini, Anda akan membuat skema dan memuat beberapa data dasar ke dalam database cymbal-bikes.

Berikutnya

Selanjutnya, Anda akan mengintegrasikan model Embedding untuk menghasilkan embeddings untuk deskripsi produk, serta mengubah permintaan penelusuran tekstual menjadi embedding untuk menelusuri produk yang relevan.

5. Bekerja dengan embedding

Membuat embedding vektor untuk deskripsi produk

Agar penelusuran kesamaan berfungsi pada produk, Anda perlu membuat embeddings untuk deskripsi produk.

Dengan EmbeddingsModel yang dibuat dalam skema, ini adalah pernyataan DML UPDATE sederhana.

UPDATE products p1
SET productDescriptionEmbedding =
(SELECT embeddings.values from ML.PREDICT(MODEL EmbeddingsModel,
(SELECT productDescription as content FROM products p2 where p2.productId=p1.productId)))
WHERE categoryId=1;

Klik tombol run untuk memperbarui deskripsi produk.

Dalam contoh ini, Anda akan memberikan permintaan penelusuran bahasa alami melalui kueri SQL. Kueri ini akan mengubah permintaan penelusuran menjadi penyematan, lalu menelusuri hasil yang serupa berdasarkan penyematan deskripsi produk yang disimpan pada langkah sebelumnya.

-- Use Spanner's vector search, and integration with embedding and LLM models to
-- return items that are semantically relevant and available in inventory based on
-- real-time data.


SELECT productName, productDescription, inventoryCount, COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
(SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) as distance
FROM products
WHERE inventoryCount > 0
ORDER BY distance
LIMIT 5;

Klik tombol run untuk menemukan produk serupa. Hasilnya akan terlihat seperti ini:

672e111753077fcf.png

Perhatikan bahwa filter tambahan digunakan pada kueri, misalnya hanya tertarik pada produk yang tersedia (inventoryCount > 0).

Ringkasan

Pada langkah ini, Anda membuat penyematan deskripsi produk dan penyematan permintaan penelusuran menggunakan SQL, yang memanfaatkan integrasi Spanner dengan model di VertexAI. Anda juga melakukan penelusuran vektor untuk menemukan produk serupa yang cocok dengan permintaan penelusuran.

Langkah Berikutnya

Selanjutnya, mari kita gunakan hasil penelusuran untuk memasukkan LLM guna membuat respons kustom untuk setiap produk.

6. Bekerja sama dengan LLM

Spanner memudahkan integrasi dengan model LLM yang disalurkan dari VertexAI. Hal ini memungkinkan developer menggunakan SQL untuk berinteraksi langsung dengan LLM, daripada mengharuskan aplikasi untuk menjalankan logika.

Misalnya, kita memiliki hasil dari kueri SQL sebelumnya dari pengguna "I'd like to buy a starter bike for my 3 year old child".

Developer ingin memberikan respons untuk setiap hasil terkait apakah produk tersebut cocok untuk pengguna atau tidak, dengan menggunakan perintah berikut:

"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me? I'd like to buy a starter bike for my 3 year old child"

Berikut adalah kueri yang dapat Anda gunakan:

-- Use an LLM to analyze this list and provide a recommendation on whether each
-- product is a good fit for the user. We use the vector search and real time
-- inventory data to first filter the products to reduce the size of the prompt to
-- the LLM.
SELECT productName, productDescription, inventoryCount, content AS LLMResponse
FROM ML.PREDICT(
MODEL LLMModel,
(   SELECT
inventoryCount,
productName,
productDescription,
CONCAT(
"Answer with ‘Yes' or ‘No' and explain why: Is this a good fit for me?",
"I'd like to buy a starter bike for my 3 year old child \n",
"Product Name: ", productName, "\n",
"Product Description:", productDescription) AS prompt,
FROM products
WHERE inventoryCount > 0
ORDER by COSINE_DISTANCE(
productDescriptionEmbedding,
(   SELECT embeddings.values
FROM ML.PREDICT(
MODEL EmbeddingsModel,
( SELECT "I'd like to buy a starter bike for my 3 year old child" as content)
)
)
) LIMIT 5
),
STRUCT(256 AS maxOutputTokens)
);

Klik tombol run untuk mengeluarkan kueri. Hasilnya akan terlihat seperti ini:

35878cd0f88f1470.pngS

Produk pertama cocok untuk anak usia 3 tahun karena rentang usia di deskripsi produk (anak 2-4 tahun). Produk lainnya tidak terlalu sesuai.

Ringkasan

Langkah Berikutnya

Selanjutnya, saatnya melakukan pembersihan!

7. Membersihkan (opsional)

Untuk membersihkannya, cukup buka bagian Cloud Spanner di Konsol Cloud dan hapus instance 'retail-demo' yang kita buat di codelab.

41cbc1a84b3588d5.pngS

8. Selamat!

Selamat, Anda berhasil melakukan penelusuran kemiripan menggunakan penelusuran vektor bawaan dari Spanner. Selain itu, Anda melihat betapa mudahnya bekerja dengan model embedding dan LLM untuk menyediakan fungsionalitas AI generatif secara langsung menggunakan SQL.

Apa selanjutnya?

Pelajari lebih lanjut fitur tetangga terdekat persis Spanner (penelusuran vektor KNN) di sini: https://cloud.google.com/spanner/docs/find-k-nearest-neighbors

Anda juga dapat membaca lebih lanjut cara melakukan prediksi online dengan SQL menggunakan integrasi VertexAI Spanner di sini: https://cloud.google.com/spanner/docs/ml