Dokumen ini menjelaskan cara membuat dan mengisi ulang embedding vektor secara massal
untuk data tekstual (STRING
atau JSON
) yang disimpan di
Spanner menggunakan SQL dan model textembedding-gecko
Vertex AI.
Prasyarat
Anda harus memiliki tabel di database Spanner yang berisi
data tekstual (STRING
atau JSON
). Untuk informasi selengkapnya tentang cara mengimpor data,
lihat Ringkasan impor dan ekspor Spanner.
Contoh kasus penggunaan
Misalkan Anda memiliki tabel di Spanner dengan skema berikut. Tabel ini berisi jutaan catatan.
GoogleSQL
CREATE TABLE Products (
product_id INT64,
name STRING(MAX),
description STRING(MAX)
) PRIMARY KEY(product_id);
Sasaran Anda adalah membuat embedding vektor untuk kolom description
dalam tabel ini
guna menemukan item serupa untuk direkomendasikan kepada pelanggan guna meningkatkan pengalaman
berbelanja mereka menggunakan penelusuran vektor.
Mendaftarkan model embedding
Pertama, Anda perlu mendaftarkan model embedding dengan endpoint textembedding-gecko
Vertex AI di database Spanner Anda:
GoogleSQL
CREATE MODEL MODEL_NAME
INPUT(
content STRING(MAX)
)
OUTPUT(
embeddings STRUCT<values ARRAY<FLOAT32>>
)
REMOTE OPTIONS(
endpoint = '//aiplatform.googleapis.com/projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
default_batch_size = 5
)
Ganti kode berikut:
MODEL_NAME
: nama model embeddingPROJECT
: project yang menghosting endpoint Vertex AILOCATION
: lokasi endpoint Vertex AIMODEL_VERSION
: versi model embeddingtextembedding-gecko
Untuk praktik terbaik, pertimbangkan hal berikut:
- Untuk mempertahankan isolasi kuota, gunakan endpoint di project yang berbeda untuk membuat dan mengisi ulang embeddings dari endpoint produksi. Cadangkan endpoint produksi untuk menyalurkan traffic produksi.
- Pastikan endpoint model mendukung nilai
default_batch_size
. Anda dapat menggantidefault_batch_size
dengan petunjuk kueri@{remote_udf_max_rows_per_rpc=NEW_NUMBER}
. Untuk mengetahui informasi tentang batasdefault_batch_size
untuk setiap wilayah, baca Mendapatkan embedding teks untuk cuplikan teks. - Tentukan endpoint dengan versi model tertentu (misalnya,
@003
), bukan@latest
. Hal ini karena vektor embedding yang dihasilkan untuk potongan teks yang sama mungkin berbeda, bergantung pada versi model yang Anda gunakan. Itulah sebabnya Anda sebaiknya menghindari penggunaan versi model yang berbeda untuk menghasilkan embeddings dalam set data yang sama. Selain itu, memperbarui versi model dalam pernyataan definisi model tidak akan memperbarui embedding yang sudah dihasilkan dengan model ini. Salah satu cara untuk mengelola versi model untuk embedding adalah dengan membuat kolom tambahan dalam tabel yang menyimpan versi model. - Model
textembedding-gecko
yang disesuaikan secara kustom tidak didukung dengan fungsiML.PREDICT
GoogleSQL.
Menguji integrasi end-to-end dari model embedding
Setelah mendaftarkan model embedding, Anda dapat mengeksekusi kueri menggunakan model textembedding-gecko
yang ditentukan dengan ML.PREDICT
untuk menguji apakah model embedding berhasil dikonfigurasi, dan embedding diambil. Misalnya, jalankan
kueri berikut:
GoogleSQL
SELECT embeddings.values
FROM SAFE.ML.PREDICT(
MODEL MODEL_NAME, (
SELECT description AS CONTENT FROM products LIMIT 10)
);
Ganti kode berikut:
MODEL_NAME
: nama model embedding
Memperbarui tabel sumber untuk menyertakan kolom tambahan guna menyimpan embeddings
Selanjutnya, perbarui skema tabel sumber untuk menyertakan kolom tambahan dari
jenis data ARRAY<FLOAT32>
untuk menyimpan embedding yang dihasilkan:
GoogleSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME ARRAY<FLOAT32>;
Ganti kode berikut:
TABLE_NAME
: nama tabel sumberEMBEDDING_COLUMN_NAME
: nama kolom tempat Anda ingin menambahkan embedding yang dihasilkan
Misalnya, dengan menggunakan contoh tabel products
, jalankan:
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;
Anda dapat menambahkan kolom lain untuk mengelola versi model embedding.
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;
Meningkatkan kuota untuk Vertex AI
Anda mungkin perlu meningkatkan kuota Vertex AI API untuk
textembedding-gecko
di region yang menggunakan model tersebut. Untuk
meminta peningkatan, lihat Penambahan kuota Vertex AI.
Untuk mengetahui informasi selengkapnya, lihat kuota dan batas Vertex AI.
Embedding pengisian ulang
Terakhir, jalankan pernyataan UPDATE
berikut menggunakan DML yang dipartisi untuk menghasilkan embeddings untuk kolom data tekstual dan menyimpan embedding tersebut di database Anda. Anda bisa menyimpan versi model beserta embeddings. Sebaiknya jalankan kueri ini selama periode traffic rendah di database Anda.
GoogleSQL
UPDATE TABLE_NAME
SET TABLE_NAME.EMBEDDING_COLUMN_NAME =(
SELECT embeddings.values
FROM SAFE.ML.PREDICT(MODEL MODEL_NAME, (
SELECT TABLE_NAME.DATA_COLUMN_NAME AS CONTENT)
)
@{remote_udf_max_rows_per_rpc=MAX_ROWS}
),
TABLE_NAME.EMBEDDING_VERSION_COLUMN = MODEL_VERSION
WHERE FILTER_CONDITION;
Ganti kode berikut:
TABLE_NAME
: nama tabel dengan data tekstualEMBEDDING_COLUMN_NAME
: nama kolom tempat Anda ingin menambahkan embedding yang dihasilkanDATA_COLUMN_NAME
: nama kolom dengan data tekstualMODEL_NAME
: nama model embeddingMAX_ROWS
: jumlah baris maksimum per RPCEMBEDDING_VERSION_COLUMN
: kolom yang mengelola versi model penyematantextembedding-gecko
yang digunakan untuk mengisi ulang embedding AndaMODEL_VERSION
: versi model embeddingtextembedding-gecko
FILTER_CONDITION
: kondisi filter yang dapat dipartisi yang ingin Anda terapkan
Menggunakan SAFE.ML.PREDICT
akan menampilkan NULL
untuk permintaan yang gagal. Anda juga dapat menggunakan SAFE.ML.PREDICT
yang dikombinasikan dengan filter WHERE embedding_column IS NULL
untuk menjalankan kembali kueri tanpa menghitung embedding untuk kolom yang sudah dihitung.
Contoh kueri pengisian ulang untuk tabel products
:
GoogleSQL
UPDATE products
SET products.desc_embed =(
SELECT embeddings.values
FROM SAFE.ML.PREDICT(MODEL gecko_model, (
SELECT products.value AS CONTENT
)
)
@{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 003
WHERE products.desc_embed IS NULL;
Untuk praktik terbaik, pertimbangkan hal berikut:
- Waktu tunggu gRPC default untuk Spanner API adalah satu jam.
Bergantung pada jumlah embedding yang diisi ulang, Anda mungkin perlu meningkatkan waktu tunggu ini untuk memastikan DML yang dipartisi
UPDATE
memiliki waktu yang cukup untuk diselesaikan. Untuk informasi selengkapnya, lihat Mengonfigurasi waktu tunggu kustom dan percobaan ulang. - Anda hanya dapat menggunakan DML yang dipartisi untuk menyimpan embedding yang dihasilkan dalam tabel yang sama dengan tabel data sumber.
Pertimbangan performa dan lainnya
Pertimbangkan hal berikut untuk mengoptimalkan performa saat mengisi ulang data sematan.
Jumlah node
DML yang dipartisi akan menjalankan pernyataan DML tertentu pada partisi yang berbeda secara paralel. Untuk instance dengan jumlah node yang tinggi, Anda mungkin mengamati error kuota selama eksekusi DML terpartisi. Jika permintaan Vertex AI API tertahan karena batas kuota Vertex AI API, Spanner akan mencoba kembali kegagalan ini dalam mode transaksi DML yang dipartisi sebanyak maksimum 20 kali. Jika Anda melihat tingkat error kuota yang tinggi di Vertex AI, tingkatkan kuota untuk Vertex AI.
Ukuran teks di kolom data
Model embedding Vertex AI memiliki batas jumlah token maksimum untuk setiap input teks. Versi model yang berbeda memiliki batas token yang berbeda. Setiap permintaan Vertex AI dapat memiliki beberapa kolom teks input, tetapi ada batasan jumlah maksimum token yang ada
dalam satu permintaan. Untuk database GoogleSQL, jika Anda mengalami error INVALID_ARGUMENT
dengan pesan "Permintaan terlalu besar", coba kurangi ukuran tumpukan untuk menghindari error. Untuk melakukannya, Anda dapat mengonfigurasi default_batch_size
atau menggunakan petunjuk kueri remote_udf_max_rows_per_rpc
saat mendaftarkan model.
Jumlah permintaan API yang dikirim ke Vertex AI
Anda dapat menggunakan petunjuk kueri @{remote_udf_max_outstanding_rpcs}
untuk menambah atau
mengurangi jumlah permintaan yang dikirim ke Vertex AI dari
Spanner. Perlu diketahui bahwa meningkatkan batas ini dapat meningkatkan
penggunaan CPU dan memori instance Spanner. Untuk database GoogleSQL, penggunaan petunjuk kueri ini akan menggantikan default_batch_size
yang dikonfigurasi untuk model Anda.
Memantau progres pengisian ulang
Anda dapat memantau jumlah permintaan, latensi, dan byte jaringan yang dikirim ke Vertex AI dari Spanner menggunakan dasbor insight sistem.
Langkah selanjutnya
- Pelajari cara melakukan penelusuran vektor kemiripan dengan menemukan tetangga terdekat.
- Pelajari lebih lanjut machine learning dan embedding di kursus singkat tentang embedding.