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 data.
GoogleSQL
CREATE TABLE Products (
product_id INT64 NOT NULL,
name STRING(MAX),
description STRING(MAX)
) PRIMARY KEY(product_id);
PostgreSQL
CREATE TABLE Products (
product_id INT8 NOT NULL,
name TEXT,
description TEXT,
PRIMARY KEY(product_id)
);
Sasaran Anda adalah membuat penyematan vektor untuk kolom description
dalam tabel ini untuk menemukan item serupa yang akan direkomendasikan kepada pelanggan guna meningkatkan pengalaman belanja mereka menggunakan penelusuran vektor.
Mendaftarkan model penyematan
GoogleSQL
Daftarkan model penyematan dengan endpoint textembedding-gecko
Vertex AI di database Spanner Anda:
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 penyematanPROJECT
: project yang menghosting endpoint Vertex AILOCATION
: lokasi endpoint Vertex AIMODEL_VERSION
: versi model penyematantextembedding-gecko
PostgreSQL
Dalam dialek PostgreSQL, Anda tidak perlu mendaftarkan model.
Anda meneruskan nama endpoint langsung ke panggilan fungsi spanner.ML_PREDICT_ROW
.
Untuk praktik terbaik, pertimbangkan hal berikut:
- Untuk mempertahankan isolasi kuota, gunakan endpoint di project lain untuk membuat dan mengisi ulang penyematan, bukan endpoint produksi. Reservasi 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 region, lihat Mendapatkan embedding teks untuk cuplikan teks. - Tentukan endpoint dengan versi model tertentu (misalnya
@003
), bukan@latest
. Hal ini karena vektor penyematan yang dihasilkan untuk bagian teks yang sama mungkin berbeda bergantung pada versi model yang Anda gunakan; itulah sebabnya Anda ingin menghindari penggunaan versi model yang berbeda untuk membuat penyematan dalam set data yang sama. Selain itu, memperbarui versi model dalam pernyataan definisi model tidak akan memperbarui penyematan yang sudah dihasilkan dengan model ini. Salah satu cara untuk mengelola versi model untuk penyematan adalah dengan membuat kolom tambahan di tabel yang menyimpan versi model. - Model
textembedding-gecko
yang disesuaikan secara kustom tidak didukung dengan fungsiML.PREDICT
GoogleSQL danspanner.ML_PREDICT_ROW
PostgreSQL.
Menguji integrasi menyeluruh model penyematan
Anda dapat menjalankan kueri untuk menguji apakah model penyematan berhasil dikonfigurasi, dan penyematan 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 penyematan
PostgreSQL
SELECT spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description))))
FROM Products
LIMIT 10;
Ganti kode berikut:
PROJECT
: project yang menghosting endpoint Vertex AILOCATION
: lokasi endpoint Vertex AIMODEL_VERSION
: versi model penyematantextembedding-gecko
Perbarui tabel sumber untuk menyertakan kolom tambahan guna menyimpan penyematan
Selanjutnya, perbarui skema tabel sumber untuk menyertakan kolom tambahan dari jenis data ARRAY<FLOAT32>
untuk menyimpan penyematan 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 penyematan yang dihasilkan
PostgreSQL
ALTER TABLE TABLE_NAME
ADD COLUMN EMBEDDING_COLUMN_NAME real[];
Ganti kode berikut:
TABLE_NAME
: nama tabel sumberEMBEDDING_COLUMN_NAME
: nama kolom tempat Anda ingin menambahkan penyematan yang dihasilkan
Misalnya, menggunakan contoh tabel products
, jalankan:
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed ARRAY<FLOAT32>;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed real[];
Anda dapat menambahkan kolom lain untuk mengelola versi model penyematan.
GoogleSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT64;
PostgreSQL
ALTER TABLE Products
ADD COLUMN desc_embed_model_version INT8;
Meningkatkan kuota untuk Vertex AI
Anda mungkin perlu meningkatkan kuota Vertex AI API untuk
textembedding-gecko
di region yang menggunakan model. Untuk
meminta penambahan, 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 berpartisi untuk membuat penyematan bagi kolom data tekstual dan menyimpan penyematan di database Anda. Anda dapat menyimpan versi model beserta penyematan. 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 penyematan yang dihasilkanDATA_COLUMN_NAME
: nama kolom dengan data tekstualMODEL_NAME
: nama model penyematanMAX_ROWS
: jumlah maksimum baris per RPCEMBEDDING_VERSION_COLUMN
: kolom yang mengelola versi model penyematantextembedding-gecko
yang digunakan untuk mengisi ulang penyematan AndaMODEL_VERSION
: versi model penyematantextembedding-gecko
FILTER_CONDITION
: kondisi filter yang dapat dipartisi yang ingin Anda terapkan
Penggunaan SAFE.ML.PREDICT
akan menampilkan NULL
untuk permintaan yang gagal. Anda juga dapat menggunakan
SAFE.ML.PREDICT
bersama dengan filter
WHERE embedding_column IS NULL
untuk menjalankan ulang kueri tanpa menghitung penyematan untuk kolom
yang sudah dihitung.
PostgreSQL
UPDATE TABLE_NAME
SET
EMBEDDING_COLUMN_NAME = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko$MODEL_VERSION',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', DATA_COLUMN_NAME)))
) /*@ remote_udf_max_rows_per_rpc=MAX_ROWS */ ->'predictions'->0->'embeddings'->'values'),
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 penyematan yang dihasilkanDATA_COLUMN_NAME
: nama kolom dengan data tekstualPROJECT
: project yang menghosting endpoint Vertex AILOCATION
: lokasi endpoint Vertex AIMODEL_VERSION
: versi model penyematantextembedding-gecko
MAX_ROWS
: jumlah maksimum baris per RPCEMBEDDING_VERSION_COLUMN
: kolom yang mengelola versi model penyematantextembedding-gecko
yang digunakan untuk mengisi ulang penyematan AndaFILTER_CONDITION
: kondisi filter yang dapat dipartisi yang ingin Anda terapkan
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.description AS content)
) @{remote_udf_max_rows_per_rpc=200}
),
products.desc_embed_model_version = 3
WHERE products.desc_embed IS NULL;
PostgreSQL
UPDATE products
SET
desc_embed = spanner.FLOAT32_ARRAY(spanner.ML_PREDICT_ROW(
'projects/PROJECT/locations/LOCATION/publishers/google/models/textembedding-gecko@003',
JSONB_BUILD_OBJECT('instances', JSONB_BUILD_ARRAY(JSONB_BUILD_OBJECT('content', description)))
) /*@ remote_udf_max_rows_per_rpc=200 */ ->'predictions'->0->'embeddings'->'values'),
desc_embed_model_version = 3
WHERE desc_embed IS NULL;
Untuk praktik terbaik, pertimbangkan hal berikut:
- Waktu tunggu gRPC default untuk Spanner API adalah satu jam.
Bergantung pada jumlah penyematan yang Anda isi ulang, Anda mungkin perlu
meningkatkan waktu tunggu ini untuk memastikan bahwa DML berpartisi
UPDATE
memiliki waktu yang cukup untuk diselesaikan. Untuk informasi selengkapnya, lihat Mengonfigurasi waktu tunggu dan percobaan ulang kustom.
Performa dan pertimbangan lainnya
Pertimbangkan hal berikut untuk mengoptimalkan performa saat mengisi ulang data penyematan.
Jumlah node
DML yang dipartisi menjalankan pernyataan DML yang diberikan pada partisi yang berbeda secara paralel. Untuk instance dengan jumlah node yang tinggi, Anda mungkin mengamati error kuota selama eksekusi DML berpartisi. Jika permintaan Vertex AI
API dibatasi karena batas kuota Vertex AI API,
Spanner akan mencoba ulang kegagalan ini dalam
mode transaksi DML yang dipartisi
maksimal 20 kali. Jika Anda mengamati tingginya tingkat error kuota di
Vertex AI, tingkatkan kuota untuk Vertex AI.
Anda juga dapat menyesuaikan paralelisme menggunakan petunjuk tingkat pernyataan
@{pdml_max_parallelism=DESIRED_NUMBER}
saat menggunakan GoogleSql. Contoh
berikut menetapkan paralelisme ke '5':
GoogleSQL
@{pdml_max_parallelism=5} 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;
Ukuran teks di kolom data
Model penyematan Vertex AI memiliki batas jumlah maksimum
token 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 batas 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 batch untuk menghindari error. Untuk melakukannya, Anda dapat mengonfigurasi default_batch_size
atau menggunakan petunjuk kueri @{remote_udf_max_outstanding_rpcs}
saat mendaftarkan model.
Jumlah permintaan API yang dikirim ke Vertex AI
Anda dapat menggunakan petunjuk kueri @{remote_udf_max_outstanding_rpcs}
untuk meningkatkan atau
menurunkan jumlah permintaan yang dikirim ke Vertex AI dari
Spanner. Perhatikan bahwa meningkatkan batas ini dapat meningkatkan penggunaan CPU dan memori instance Spanner. Untuk database GoogleSQL, penggunaan petunjuk kueri ini akan mengganti 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 kesamaan dengan menemukan tetangga terdekat.
- Pelajari machine learning dan penyematan lebih lanjut di kursus singkat tentang penyematan.