1. Pengantar
Kemajuan terbaru dalam deep learning telah memungkinkan untuk merepresentasikan teks dan data lainnya sedemikian rupa sehingga menangkap makna semantik. Hal ini telah memunculkan pendekatan baru untuk penelusuran, yang disebut penelusuran vektor, yang menggunakan representasi vektor teks (dikenal sebagai embedding) untuk menemukan dokumen yang paling relevan dengan kueri pengguna. Penelusuran vektor lebih disukai daripada penelusuran tradisional untuk aplikasi seperti penelusuran pakaian, di mana pengguna sering kali menelusuri item berdasarkan deskripsi, gaya, atau konteksnya, bukan berdasarkan nama produk atau merek yang tepat. Kita dapat mengintegrasikan database Cloud Spanner dengan Vector Search untuk melakukan pencocokan kemiripan vektor. Dengan menggunakan Spanner dan Vector Search secara bersamaan, pelanggan dapat membuat integrasi yang canggih yang menggabungkan ketersediaan, keandalan, dan skala Spanner serta kemampuan penelusuran kemiripan lanjutan Vertex AI Vector Search. Penelusuran ini dilakukan dengan membandingkan embedding item dalam indeks Vector Search dan menampilkan kecocokan yang paling mirip.
Kasus Penggunaan
Bayangkan Anda adalah seorang data scientist di retailer fashion yang mencoba mengikuti tren, penelusuran produk, dan rekomendasi yang berubah dengan cepat. Tantangannya adalah Anda memiliki sumber daya dan silo data yang terbatas. Postingan blog ini menunjukkan cara menerapkan kasus penggunaan rekomendasi pakaian menggunakan pendekatan penelusuran kesamaan pada data pakaian.Langkah-langkah berikut akan dibahas:
- Data yang diperoleh dari Spanner
- Vektor yang dihasilkan untuk data pakaian menggunakan ML.PREDICT dan disimpan di Spanner
- Data vektor Spanner yang terintegrasi dengan Vector Search menggunakan tugas alur kerja dan Dataflow
- Vector Search dilakukan untuk menemukan kecocokan kesamaan untuk input yang dimasukkan pengguna
Kita akan membuat aplikasi web demo untuk melakukan penelusuran pakaian berdasarkan teks input pengguna. Aplikasi ini memungkinkan pengguna menelusuri pakaian dengan memasukkan deskripsi teks.
Indeks Spanner ke Vector Search:
Data untuk penelusuran pakaian disimpan di Spanner. Kita akan memanggil Vertex AI Embeddings API dalam konstruksi ML.PREDICT langsung dari data Spanner. Kemudian, kita akan memanfaatkan tugas Dataflow dan Workflow yang mengupload data ini (inventaris dan embedding) secara massal ke Vector Search Vertex AI dan memperbarui indeks.
Menjalankan Kueri Pengguna pada indeks:
Saat pengguna memasukkan deskripsi pakaian, aplikasi akan membuat embedding secara real time menggunakan Text Embeddings API. Deskripsi ini kemudian dikirim sebagai input ke Vector Search API untuk menemukan 10 deskripsi produk yang relevan dari indeks dan menampilkan gambar yang sesuai.
Ringkasan Arsitektur
Arsitektur aplikasi Spanner-Vector Search ditampilkan dalam diagram 2 bagian berikut:
Spanner ke Indeks Vector Search: 
Aplikasi klien untuk menjalankan kueri pengguna pada indeks:
Yang akan Anda bangun
Spanner ke Indeks Vektor:
- Database Spanner untuk menyimpan dan mengelola data sumber serta sematan yang sesuai
- Tugas Alur Kerja yang mengupload data (ID dan embedding) secara massal ke database Vertex AI Vector Search.
- Vector Search API yang digunakan untuk menemukan deskripsi produk yang relevan dari indeks.
Menjalankan Kueri Pengguna pada indeks:
- Aplikasi web yang memungkinkan pengguna memasukkan deskripsi teks pakaian, melakukan penelusuran kesamaan menggunakan endpoint indeks yang di-deploy, dan menampilkan pakaian terdekat dengan input.
Cara Kerja
Saat pengguna memasukkan deskripsi teks pakaian, aplikasi web akan mengirimkan deskripsi tersebut ke Vector Search API. Kemudian, Vector Search API menggunakan embedding deskripsi pakaian untuk menemukan deskripsi produk yang paling relevan dari indeks. Deskripsi produk dan gambar yang sesuai kemudian ditampilkan kepada pengguna. Alur kerja umumnya adalah sebagai berikut:
- Buat embedding untuk data yang disimpan di Spanner.
- Mengekspor dan mengupload embedding ke dalam indeks Vector Search.
- Buat kueri indeks Vector Search untuk item serupa dengan melakukan penelusuran tetangga terdekat.
2. Persyaratan
Sebelum memulai
- Di Konsol Google Cloud, di halaman pemilih project, pilih atau buat project Google Cloud.
- Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan telah diaktifkan pada suatu project.
- Pastikan semua API yang diperlukan (Cloud Spanner, Vertex AI, Google Cloud Storage) telah diaktifkan
- Anda akan menggunakan Cloud Shell, lingkungan command line yang berjalan di Google Cloud yang telah dilengkapi dengan gcloud. Baca dokumentasi untuk mempelajari perintah gcloud dan penggunaannya. Jika project Anda belum ditetapkan, gunakan perintah berikut untuk menetapkannya:
gcloud config set project <YOUR_PROJECT_ID>
- Buka halaman Cloud Spanner dengan project Google Cloud yang aktif untuk memulai
3. Backend: Buat sumber data dan penyematan Spanner Anda
Dalam kasus penggunaan ini, database Spanner menyimpan inventaris pakaian dengan gambar dan deskripsi yang sesuai. Pastikan Anda membuat embedding untuk deskripsi teks dan menyimpannya di database Spanner sebagai ARRAY<float64>.
- Membuat data Spanner
Buat instance bernama "spanner-vertex" dan database bernama "spanner-vertex-embeddings". Buat tabel menggunakan DDL:
CREATE TABLE
apparels ( id NUMERIC,
category STRING(100),
sub_category STRING(50),
uri STRING(200),
content STRING(2000),
embedding ARRAY<FLOAT64>
)
PRIMARY KEY
(id);
- Masukkan data ke dalam tabel menggunakan SQL INSERT
Skrip penyisipan untuk data sampel tersedia di sini.
- Model Create Text Embeddings
Hal ini diperlukan agar kami dapat membuat embedding untuk konten dalam input. Berikut adalah DDL untuk hal yang sama:
CREATE MODEL text_embeddings INPUT(content STRING(MAX))
OUTPUT(
embeddings
STRUCT<
statistics STRUCT<truncated BOOL, token_count FLOAT64>,
values ARRAY<FLOAT64>>
)
REMOTE OPTIONS (
endpoint = '//aiplatform.googleapis.com/projects/abis-345004/locations/us-central1/publishers/google/models/textembedding-gecko');
- Membuat embedding teks untuk data sumber
Buat tabel untuk menyimpan embedding dan masukkan embedding yang dihasilkan. Dalam aplikasi database dunia nyata, pemuatan data ke Spanner hingga langkah 2 akan bersifat transaksional. Untuk menjaga praktik terbaik desain tetap utuh, saya lebih memilih untuk menjaga tabel transaksional tetap dinormalisasi, sehingga membuat tabel terpisah untuk penyematan.
CREATE TABLE apparels_embeddings (id string(100), embedding ARRAY<FLOAT64>)
PRIMARY KEY (id);
INSERT INTO apparels_embeddings(id, embeddings)
SELECT CAST(id as string), embeddings.values
FROM ML.PREDICT(
MODEL text_embeddings,
(SELECT id, content from apparels)
) ;
Setelah konten dan embedding massal siap, mari kita buat Indeks dan Endpoint Vector Search untuk menyimpan embedding yang akan membantu melakukan Vector Search.
4. Tugas Alur Kerja: Ekspor data Spanner ke Vector Search
- Membuat Bucket Cloud Storage
Hal ini diperlukan untuk menyimpan embedding dari Spanner di bucket GCS dalam format json yang diharapkan Vector Search sebagai input. Buat bucket di region yang sama dengan data Anda di Spanner. Buat folder di dalamnya jika diperlukan, tetapi terutama buat file kosong bernama empty.json di dalamnya.
- Menyiapkan Cloud Workflow
Untuk menyiapkan ekspor batch dari Spanner ke indeks Vertex AI Vector Search:
Buat indeks kosong:
Pastikan Indeks Penelusuran Vektor berada di region yang sama dengan Bucket Cloud Storage dan data Anda. Ikuti 11 langkah petunjuk di tab konsol pada bagian Buat indeks untuk update batch di halaman kelola indeks. Di folder yang diteruskan ke contentsDeltaUri, buat file kosong bernama empty.json karena Anda tidak akan dapat membuat indeks tanpa file ini. Tindakan ini akan membuat indeks kosong.
Jika sudah memiliki indeks, Anda dapat melewati langkah ini. Alur kerja akan menimpa indeks Anda.
Catatan: Anda tidak dapat men-deploy indeks kosong ke endpoint. Jadi, kita menunda langkah men-deploy-nya ke endpoint ke langkah selanjutnya, setelah mengekspor data vektor ke Cloud Storage.
Clone repositori git ini: Ada beberapa cara untuk meng-clone repositori git, salah satunya adalah dengan menjalankan perintah berikut menggunakan GitHub CLI. Jalankan 2 perintah di bawah dari Terminal Cloud Shell:
gh repo clone cloudspannerecosystem/spanner-ai
cd spanner-ai/vertex-vector-search/workflows
Folder ini berisi dua file
batch-export.yaml: Ini adalah definisi alur kerja.sample-batch-input.json: Ini adalah contoh parameter input alur kerja.
Siapkan input.json dari file contoh: Pertama, salin json contoh.
cp sample-batch-input.json input.json
Kemudian, edit input.json dengan detail untuk project Anda. Dalam hal ini, json Anda akan terlihat seperti ini:
{
"project_id": "<<YOUR_PROJECT>>",
"location": "<<us-central1>>",
"dataflow": {
"temp_location": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_temp"
},
"gcs": {
"output_folder": "gs://<<YOUR_BUCKET>>/<<FOLDER_IF_ANY>>/workflow_output"
},
"spanner": {
"instance_id": "spanner-vertex",
"database_id": "spanner-vertex-embeddings",
"table_name": "apparels_embeddings",
"columns_to_export": "embedding,id"
},
"vertex": {
"vector_search_index_id": "<<YOUR_INDEX_ID>>"
}
}
Menyiapkan Izin
Untuk lingkungan produksi, sebaiknya buat akun layanan baru dan berikan satu atau beberapa peran IAM yang berisi izin minimum yang diperlukan untuk mengelola layanan. Peran berikut diperlukan untuk menyiapkan alur kerja guna mengekspor data dari Spanner (embedding) ke indeks Vector Search:
Secara default, akun ini menggunakan akun layanan default Compute Engine.
Jika menggunakan akun layanan yang dikonfigurasi secara manual, Anda harus menyertakan peran berikut:
Untuk memicu tugas Dataflow: Admin Dataflow, Pekerja Dataflow.
Untuk meniru identitas akun layanan worker Dataflow: Pengguna Akun Layanan.
Untuk menulis Log: Logs Writer.
Untuk memicu pembangunan ulang Vertex AI Vector Search: Pengguna Vertex AI.
Jika menggunakan akun layanan yang dikonfigurasi secara manual, Anda harus menyertakan peran berikut:
Untuk mengelola Dataflow: Dataflow Admin, Dataflow Worker. Untuk membaca data dari Spanner: Cloud Spanner Database Reader. Akses tulis ke GCS Container Registry yang dipilih: Pemilik Bucket Penyimpanan GCS.
- Deploy Cloud Workflow
Deploy file yaml alur kerja ke project Google Cloud Anda. Anda dapat mengonfigurasi region atau lokasi tempat alur kerja akan dijalankan saat dieksekusi.
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1" [--service account=<service_account>]
or
gcloud workflows deploy vector-export-workflow --source=batch-export.yaml --location="us-central1"
Alur kerja kini akan terlihat di halaman Workflows di konsol Google Cloud.
Catatan: Anda juga dapat membuat dan men-deploy alur kerja dari Konsol Google Cloud. Ikuti perintah di Konsol Cloud. Untuk definisi alur kerja, salin dan tempelkan konten batch-export.yaml.
Setelah selesai, jalankan alur kerja agar ekspor data dimulai.
- Jalankan Cloud Workflow
Jalankan perintah berikut untuk mengeksekusi alur kerja:
gcloud workflows execute vector-export-workflow --data="$(cat input.json)"
Eksekusi akan muncul di tab Eksekusi di Alur Kerja. Tindakan ini akan memuat data Anda ke dalam database Penelusuran Vektor dan mengindeksnya.
Catatan: Anda juga dapat menjalankan dari konsol menggunakan tombol Jalankan. Ikuti perintah dan untuk input, salin dan tempel konten input.json yang disesuaikan.
5. Men-deploy Indeks Vector Search
Men-deploy indeks ke endpoint
Anda dapat mengikuti langkah-langkah di bawah untuk men-deploy indeks:
- Di halaman Indeks Penelusuran Vektor, Anda akan melihat tombol DEPLOY di samping indeks yang baru saja Anda buat di langkah 2 bagian sebelumnya. Atau, Anda dapat membuka halaman info indeks dan mengklik tombol DEPLOY TO ENDPOINT.
- Berikan informasi yang diperlukan dan deploy indeks ke endpoint.
Atau, Anda dapat melihat notebook ini untuk men-deploy-nya ke endpoint (lewati bagian deployment notebook). Setelah di-deploy, catat ID indeks yang di-deploy dan URL endpoint.
6. Frontend: Data pengguna ke Vector Search
Mari kita buat aplikasi Python sederhana dengan UX yang didukung gradio untuk menguji penerapan kita dengan cepat: Anda dapat melihat penerapan di sini untuk menerapkan aplikasi demo ini di notebook colab Anda sendiri.
- Kita akan menggunakan aiplatform python sdk untuk memanggil Embeddings API dan juga untuk memanggil endpoint indeks Vector Search.
# [START aiplatform_sdk_embedding]
!pip install google-cloud-aiplatform==1.35.0 --upgrade --quiet --user
import vertexai
vertexai.init(project=PROJECT_ID, location="us-central1")
from vertexai.language_models import TextEmbeddingModel
import sys
if "google.colab" in sys.modules:
# Define project information
PROJECT_ID = " " # Your project id
LOCATION = " " # Your location
# Authenticate user to Google Cloud
from google.colab import auth
auth.authenticate_user()
- Kita akan menggunakan gradio untuk mendemokan aplikasi AI yang kita bangun dengan cepat dan mudah menggunakan antarmuka pengguna. Mulai ulang runtime sebelum Anda menerapkan langkah ini.
!pip install gradio
import gradio as gr
- Dari aplikasi web setelah input pengguna, panggil Embeddings API, kita akan menggunakan model embedding teks: textembedding-gecko@latest
Metode di bawah memanggil Model Embedding Teks dan menampilkan embedding vektor untuk teks yang dimasukkan oleh pengguna:
def text_embedding(content) -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@latest")
embeddings = model.get_embeddings(content)
for embedding in embeddings:
vector = embedding.values
#print(f"Length of Embedding Vector: {len(vector)}")
return vector
Melakukan pengujian
text_embedding("red shorts for girls")
Anda akan melihat output yang mirip dengan di bawah ini (perhatikan bahwa gambar dipangkas tingginya sehingga Anda tidak dapat melihat seluruh respons vektor):

- Deklarasikan ID indeks yang di-deploy dan ID endpoint
from google.cloud import aiplatform
DEPLOYED_INDEX_ID = "spanner_vector1_1702366982123"
#Vector Search Endpoint
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
- Tentukan metode Penelusuran Vektor untuk memanggil endpoint indeks dan menampilkan hasil dengan 10 kecocokan terdekat untuk respons embedding yang sesuai dengan teks input pengguna.
Dalam definisi metode di bawah untuk Vector Search, perhatikan bahwa metode find_neighbors dipanggil untuk mengidentifikasi 10 vektor terdekat.
def vector_search(content) -> list:
result = text_embedding(content)
#call_vector_search_api(content)
index_endpoint = aiplatform.MatchingEngineIndexEndpoint('projects/273845608377/locations/us-central1/indexEndpoints/2021628049526620160')
# run query
response = index_endpoint.find_neighbors(
deployed_index_id = DEPLOYED_INDEX_ID,
queries = [result],
num_neighbors = 10
)
out = []
# show the results
for idx, neighbor in enumerate(response[0]):
print(f"{neighbor.distance:.2f} {spanner_read_data(neighbor.id)}")
out.append(f"{spanner_read_data(neighbor.id)}")
return out
Anda juga akan melihat panggilan ke metode spanner_read_data. Mari kita lihat di langkah berikutnya.
- Tentukan penerapan metode baca data Spanner yang memanggil metode execute_sql untuk mengekstrak gambar yang sesuai dengan ID vektor tetangga terdekat yang ditampilkan dari langkah terakhir.
!pip install google-cloud-spanner==3.36.0
from google.cloud import spanner
instance_id = "spanner-vertex"
database_id = "spanner-vertex-embeddings"
projectId = PROJECT_ID
client = spanner.Client()
client.project = projectId
instance = client.instance(instance_id)
database = instance.database(database_id)
def spanner_read_data(id):
query = "SELECT uri FROM apparels where id = " + id
outputs = []
with database.snapshot() as snapshot:
results = snapshot.execute_sql(query)
for row in results:
#print(row)
#output = "ID: {}, CONTENT: {}, URI: {}".format(*row)
output = "{}".format(*row)
outputs.append(output)
return "\n".join(outputs)
URL gambar yang sesuai dengan vektor yang dipilih akan ditampilkan.
- Terakhir, mari kita gabungkan bagian-bagian tersebut dalam antarmuka pengguna dan memicu proses Penelusuran Vektor
from PIL import Image
def call_search(query):
response = vector_search(query)
return response
input_text = gr.Textbox(label="Enter your query. Examples: Girls Tops White Casual, Green t-shirt girls, jeans shorts, denim skirt etc.")
output_texts = [gr.Image(label="") for i in range(10)]
demo = gr.Interface(fn=call_search, inputs=input_text, outputs=output_texts, live=True)
resp = demo.launch(share = True)
Anda akan melihat hasil seperti yang ditunjukkan di bawah ini:

Gambar: Link
Tonton video hasilnya: di sini.
7. Pembersihan
Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam posting ini, ikuti langkah-langkah berikut:
- Di konsol Google Cloud, buka halaman Manage resources.
- Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Hapus.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
- Jika Anda tidak ingin menghapus project, hapus instance Spanner dengan membuka instance yang baru saja Anda buat untuk project ini, lalu klik tombol DELETE INSTANCE di pojok kanan atas halaman ringkasan instance.
- Anda juga dapat membuka indeks Vector Search, membatalkan deployment endpoint dan indeks, serta menghapus indeks.
8. Kesimpulan
Selamat! Anda telah berhasil menyelesaikan penerapan Spanner - Vertex Vector Search dengan
- Membuat sumber data dan penyematan Spanner untuk aplikasi yang bersumber dari database Spanner.
- Membuat indeks database Vector Search.
- Mengintegrasikan data vektor dari Spanner ke Vector Search menggunakan tugas Dataflow dan Workflow.
- Men-deploy indeks ke endpoint.
- Terakhir, memanggil Vector Search pada input pengguna dalam penerapan Vertex AI SDK yang didukung Python.
Jangan ragu untuk memperluas penerapan ke kasus penggunaan Anda sendiri atau mengimprovisasi kasus penggunaan saat ini dengan fitur baru. Pelajari lebih lanjut kemampuan machine learning Spanner di sini.