1. Pengantar
Kemajuan terbaru dalam deep learning memungkinkan metode untuk merepresentasikan teks dan data lainnya dengan cara yang mampu menangkap makna semantik. Hal ini telah menyebabkan pendekatan baru untuk penelusuran, yang disebut penelusuran vektor, yang menggunakan representasi vektor dari teks (dikenal sebagai embeddings) 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 daripada berdasarkan nama produk atau merek yang tepat. Kita dapat mengintegrasikan database Cloud Spanner dengan Vector Search untuk melakukan pencocokan kesamaan vektor. Dengan menggunakan Spanner dan Vector Search secara bersamaan, pelanggan dapat membuat integrasi canggih yang menggabungkan ketersediaan, keandalan, dan skala Spanner serta kemampuan penelusuran kesamaan tingkat lanjut dari Vertex AI Vector Search. Penelusuran ini dilakukan dengan membandingkan embeddings item dalam indeks Vector Search dan menampilkan kecocokan yang paling mirip.
Kasus Penggunaan
Bayangkan Anda adalah data scientist di retailer mode yang mencoba mengikuti tren, penelusuran produk, dan rekomendasi yang berubah dengan cepat. Tantangannya adalah Anda memiliki sumber daya dan data silo yang terbatas. Postingan blog ini menunjukkan cara menerapkan kasus penggunaan rekomendasi pakaian menggunakan pendekatan penelusuran kesamaan pada data pakaian.Langkah-langkah berikut tercakup:
- Data bersumber 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
- Penelusuran Vektor dilakukan untuk menemukan kecocokan kesamaan untuk input yang dimasukkan pengguna
Kita akan membangun aplikasi web demo untuk melakukan penelusuran pakaian berdasarkan teks input pengguna. Aplikasi ini memungkinkan pengguna menelusuri pakaian dengan memasukkan deskripsi teks.
Spanner ke Indeks Penelusuran Vektor:
Data untuk penelusuran pakaian disimpan di Spanner. Kami 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 secara massal (inventaris dan penyematan) ke dalam Vector Search Vertex AI dan memuat ulang indeks.
Menjalankan Kueri Pengguna pada indeks:
Saat pengguna memasukkan deskripsi pakaian, aplikasi membuat embeddings secara real time menggunakan api Embedding Teks. Selanjutnya, data ini 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 Penelusuran Vektor:
Aplikasi klien untuk menjalankan kueri pengguna pada indeks:
Yang akan Anda buat
Spanner ke Indeks Vektor:
- Database Spanner untuk menyimpan dan mengelola data sumber dan embedding yang sesuai
- Tugas Alur Kerja yang mengupload data secara massal (ID dan embedding) ke dalam 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 kemiripan menggunakan endpoint indeks yang di-deploy, dan menampilkan pakaian terdekat ke input.
Cara Kerja
Saat pengguna memasukkan deskripsi teks pakaian, aplikasi web akan mengirimkan deskripsi tersebut ke Vector Search API. Vector Search API kemudian 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.
- Ekspor dan upload embedding ke indeks Penelusuran Vektor.
- Mengkueri indeks Vector Search untuk item serupa dengan melakukan penelusuran tetangga terdekat.
2. Persyaratan
Sebelum memulai
- Di Konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud
- Pastikan penagihan diaktifkan untuk project Cloud Anda. Pelajari cara memeriksa apakah penagihan diaktifkan pada sebuah project
- Pastikan semua API yang diperlukan (Cloud Spanner, Vertex AI, Google Cloud Storage) diaktifkan
- Anda akan menggunakan Cloud Shell, yakni lingkungan command line yang berjalan di Google Cloud dan telah dilengkapi dengan gcloud. Lihat dokumentasi untuk mengetahui perintah dan penggunaan gcloud. 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 Anda yang aktif untuk memulai
3. Backend: Membuat sumber data Spanner dan embedding
Dalam kasus penggunaan ini, database Spanner menyimpan inventaris pakaian dengan gambar dan deskripsi yang sesuai. Pastikan Anda membuat embeddings 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);
- Menyisipkan data ke dalam tabel menggunakan INSERT SQL
Skrip penyisipan untuk contoh data tersedia di sini.
- Membuat model Embedding Teks
Ini diperlukan agar kita dapat menghasilkan embeddings untuk konten dalam input. Di bawah ini 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
Membuat tabel untuk menyimpan embeddings dan menyisipkan embeddings yang dihasilkan. Dalam aplikasi database di dunia nyata, beban data pada Spanner hingga langkah 2 akan bersifat transaksional. Agar praktik terbaik desain tetap utuh, saya lebih memilih tabel transaksional tetap dinormalisasi, jadi buat 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 massal dan embedding sudah siap, mari kita buat Indeks Penelusuran Vektor dan Endpoint untuk menyimpan embeddings yang akan membantu melakukan Penelusuran Vektor.
4. Tugas Alur Kerja: Ekspor data Spanner ke Vector Search
- Membuat Bucket Cloud Storage
Langkah ini diperlukan untuk menyimpan embedding dari Spanner di bucket GCS dalam format json yang diharapkan oleh Vector Search sebagai input. Buat bucket di region yang sama dengan data Anda di Spanner. Buat folder di dalam 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 dalam region yang sama dengan Bucket Cloud Storage dan datanya. Ikuti 11 langkah petunjuk di tab konsol pada bagian Create an index for batch update di halaman kelola indeks. Dalam folder yang diteruskan ke contentsDeltaUri, buat file kosong bernama empty.json karena Anda tidak akan dapat membuat indeks tanpa file ini. Langkah ini menghasilkan 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 deployment ke endpoint ke langkah berikutnya, setelah mengekspor data vektor ke Cloud Storage.
Clone repositori git ini: Ada beberapa cara untuk meng-clone repositori git. Salah satu caranya 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 contoh json.
cp sample-batch-input.json input.json
Lalu edit input.json
dengan detail project Anda. Dalam hal ini, json Anda akan 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>>"
}
}
Izin Penyiapan
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 (sematan) ke indeks Vector Search:
Secara default, Compute Engine 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 pekerja dataflow: Service Account User.
Untuk menulis Log: Penulis Log.
Untuk memicu pembuatan ulang Vertex AI Vector Search: Vertex AI User.
Akun Layanan Pekerja Dataflow:
Jika menggunakan akun layanan yang dikonfigurasi secara manual, Anda harus menyertakan peran berikut:
Untuk mengelola dataflow: Admin Dataflow, Pekerja Dataflow. Untuk membaca data dari Spanner: Pembaca Database Cloud Spanner. Akses tulis pada GCS Container Registry yang dipilih: Pemilik Bucket Penyimpanan GCS.
- Men-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 dijalankan.
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 dapat dilihat di halaman Workflows di Konsol Google Cloud.
Catatan: Anda juga dapat membuat dan men-deploy alur kerja dari Konsol Google Cloud. Ikuti petunjuk di Konsol Cloud. Untuk definisi alur kerja, salin dan tempel konten batch-export.yaml.
Setelah selesai, jalankan alur kerja tersebut sehingga ekspor data dimulai.
- Menjalankan Alur Kerja Cloud
Jalankan perintah berikut untuk menjalankan alur kerja:
gcloud workflows execute vector-export-workflow --data="$(cat input.json)"
Eksekusi akan muncul di tab Executions di Workflows. Langkah ini akan memuat data Anda ke dalam database Vector Search dan mengindeksnya.
Catatan: Anda juga dapat mengeksekusi dari konsol menggunakan tombol Execute. Ikuti perintah dan untuk inputnya, salin dan tempel konten input.json kustom Anda.
5. Men-deploy Indeks Penelusuran Vektor
Men-deploy indeks ke endpoint
Anda dapat mengikuti langkah-langkah di bawah ini untuk men-deploy indeks:
- Pada halaman Vector Search index, Anda akan melihat tombol DEPLOY di sebelah indeks yang baru saja Anda buat pada langkah 2 di 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 ke bagian deployment notebook). Setelah di-deploy, catat ID indeks dan URL endpoint yang di-deploy.
6. Frontend: Data pengguna ke Vector Search
Mari kita bangun aplikasi Python sederhana dengan UX yang didukung gradio untuk menguji implementasi kita dengan cepat: Anda dapat melihat implementasinya 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 mendemonstrasikan aplikasi AI yang kami 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 pengguna memasukkan input, panggil Embeddings API. Kita akan menggunakan model penyematan teks: textembedding-gecko@latest
Metode di bawah ini 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):
- Mendeklarasikan 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')
- Menentukan metode Vector Search untuk memanggil endpoint indeks dan menampilkan hasilnya dengan 10 kecocokan terdekat untuk respons penyematan yang sesuai dengan teks input pengguna.
Dalam definisi metode untuk Vector Search di bawah ini, 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 pemanggilan metode spanner_read_data. Mari kita lihat di langkah berikutnya.
- Tentukan implementasi metode data baca Spanner yang memanggil metodeexecute_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)
Tindakan ini akan menampilkan URL gambar yang sesuai dengan vektor yang dipilih.
- Akhirnya mari kita satukan potongan-potongan itu di 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 hasilnya seperti yang ditunjukkan di bawah ini:
Gambar: Link
Lihat 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 resource.
- Dalam daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- 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 dibuat untuk project ini, lalu klik tombol DELETE INSTANCE di sudut 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 implementasi Spanner - Vertex Vector Search dengan
- Membuat sumber data Spanner dan embedding 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 implementasi Vertex AI SDK dengan teknologi Python.
Jangan ragu untuk memperluas implementasi pada kasus penggunaan Anda sendiri atau mengimprovisasi kasus penggunaan saat ini dengan fitur-fitur baru. Pelajari lebih lanjut kemampuan machine learning Spanner di sini.