Halaman ini menjelaskan cara berinteraksi dengan Cloud SQL untuk membangun aplikasi yang menggunakan embedding vektor.
Cloud SQL untuk MySQL mendukung penyimpanan embedding vektor. Selanjutnya, Anda dapat membuat indeks penelusuran vektor dan melakukan penelusuran kesamaan pada embedding vektor ini bersama dengan data lainnya yang disimpan di Cloud SQL.
Penyimpanan penyematan vektor
Anda dapat menggunakan Cloud SQL untuk MySQL guna menyimpan embedding vektor dengan membuat kolom penyematan vektor dalam tabel. Kolom penyematan vektor khusus dipetakan ke
jenis data VARBINARY
. Seperti data relasional lainnya dalam tabel, Anda dapat mengakses
sematkan vektor di tabel dengan jaminan transaksional yang ada. Tabel yang memiliki kolom embedding vektor adalah tabel InnoDB biasa, sehingga sesuai dengan properti atomicity, konsistensi, isolasi, dan ketahanan (ACID).
Properti ACID hanya menyimpang untuk pencarian indeks penelusuran vektor.
Anda dapat membuat hingga satu kolom penyematan vektor dalam tabel dan satu indeks penelusuran vektor per tabel. Setiap embedding vektor yang disimpan di kolom yang sama harus memiliki dimensi yang sama persis dengan yang Anda tentukan saat menentukan kolom. Penyematan vektor memiliki batas atas 16.000 dimensi. Jika memiliki penyimpanan dan memori yang cukup, Anda dapat memiliki tabel terpisah dengan kolom penyematan vektor dan indeks penelusuran vektor yang berbeda pada instance yang sama.
Meskipun tidak ada batasan ketat untuk jumlah embedding vektor yang dapat Anda simpan dalam tabel, indeks penelusuran vektor membutuhkan memori. Karena alasan ini, sebaiknya simpan tidak lebih dari 10 juta embedding vektor dalam tabel.
Replikasi berfungsi dengan cara yang sama untuk kolom embedding vektor seperti pada kolom InnoDB MySQL lainnya.
Penelusuran kemiripan
Cloud SQL mendukung penelusuran kesamaan menggunakan kueri penelusuran K-nearestest (KNN) dan terdekat (ANN). Anda dapat menggunakan kedua jenis penelusuran vektor tersebut di instance Cloud SQL. Anda dapat membuat indeks penelusuran vektor untuk penelusuran ANN.
Penelusuran K-nearestest (KNN)
Cloud SQL mendukung kueri menggunakan penelusuran vektor KNN, yang juga disebut sebagai penelusuran tetangga terdekat yang pasti. Melakukan penelusuran vektor KNN memberikan penarikan yang sempurna. Anda dapat melakukan penelusuran KNN tanpa harus membuat indeks penelusuran vektor. Penelusuran KNN didasarkan pada pelaksanaan algoritma pemindaian tabel.
Untuk penelusuran KNN, Cloud SQL juga mendukung fungsi penelusuran jarak vektor berikut:
- Kosinus
- Perkalian titik
- Jarak kuadrat L2
Untuk mengetahui informasi selengkapnya tentang penggunaan fungsi jarak penelusuran vektor, baca Membuat kueri jarak embedding vektor.
Perkiraan penelusuran tetangga terdekat (ANN)
Cloud SQL mendukung pembuatan dan kueri penelusuran ANN melalui pembuatan indeks penelusuran vektor. Indeks penelusuran vektor ANN memungkinkan Anda mengoptimalkan performa yang cepat, bukan perolehan yang sempurna. Untuk penelusuran ANN, Cloud SQL mendukung jenis indeks berikut:
BRUTE_FORCE
: jenis indeks penelusuran vektor default untuk tabel dasar yang memiliki kurang dari 10.000 baris. Jenis ini paling cocok untuk penelusuran dalam {i>subset<i} yang lebih kecil dari {i>dataset<i} asli. Memori yang digunakan oleh indeks sama dengan ukuran set data. Jenis indeks ini tidak disimpan ke disk.TREE_SQ
: jenis indeks penelusuran vektor default untuk tabel dasar yang memiliki 10.000 baris atau lebih. Jenis ini menggunakan jumlah memori paling sedikit atau sekitar 25% ukuran set data. IndeksTREE_SQ
dipertahankan ke disk.TREE_AH
: jenis indeks penelusuran vektor yang menyediakan algoritma jenis penelusuran hashing asimetris. Seperti yang diterapkan di Cloud SQL, jenis indeks ini tidak dioptimalkan untuk jejak memori dan tidak dipertahankan.
Memperbarui indeks penelusuran vektor
Cloud SQL untuk MySQL memperbarui indeks penelusuran vektor secara real time. Setiap transaksi yang menjalankan operasi Bahasa Manipulasi Data (DML) pada tabel dasar juga menyebarkan perubahan pada indeks penelusuran vektor yang terkait. Perubahan dalam
indeks penelusuran vektor akan langsung terlihat oleh semua transaksi lainnya, yang
berarti tingkat isolasi READ_UNCOMMITTED
.
Jika Anda me-roll back transaksi, perubahan rollback yang terkait juga akan terjadi di indeks penelusuran vektor.
Replikasi indeks penelusuran vektor
Cloud SQL untuk MySQL mereplikasi indeks penelusuran vektor ke semua replika baca. Filter replikasi dan replikasi indeks penelusuran vektor ke replika bertingkat tidak didukung.
Mengonfigurasi instance untuk mendukung embedding vektor
Bagian ini menjelaskan cara mengonfigurasi instance Cloud SQL Anda untuk mendukung penyimpanan, pengindeksan, dan pembuatan kueri embedding vektor.
Instance Cloud SQL Enterprise edisi Cloud SQL Enterprise Plus mendukung embedding vektor.
Sebelum memulai
- Instance Anda harus menjalankan Cloud SQL untuk MySQL versi
8.0.36.R20240401.03_00
atau yang lebih baru. - Instance Anda harus memiliki ruang disk dan memori yang cukup untuk mengalokasikan memori untuk jumlah total embedding vektor pada instance.
Mengaktifkan dukungan untuk embedding vektor
Guna mengaktifkan dukungan untuk embedding vektor, Anda harus mengonfigurasi flag database MySQL.
gcloud sql instances patch INSTANCE_NAME \ --database-flags=FLAGS
Ganti INSTANCE_NAME dengan nama instance tempat Anda ingin mengaktifkan dukungan penyematan vektor.
Di FLAGS, konfigurasi flag MySQL berikut di instance Anda:
cloudsql_vector
: menyetel flag ini keon
untuk mengaktifkan penyimpanan penyematan vektor dan dukungan penelusuran. Anda dapat membuat kolom embedding vektor dan indeks penelusuran vektor baru pada instance tersebut.cloudsql_vector_max_mem_size
: optional. Tentukan alokasi memori maksimum dalam byte untuk semua indeks penelusuran vektor pada instance. Jika Anda tidak menentukan flag ini, maka alokasi memori default adalah 1 GB, yang merupakan alokasi memori minimum. Untuk informasi selengkapnya tentang cara menghitung jumlah yang harus ditentukan, lihat Mengonfigurasi alokasi memori untuk indeks penelusuran vektor.Memori khusus ini berasal dari memori yang dialokasikan ke
innodb_buffer_pool_size
. Kumpulan buffer yang tersedia akan dikurangi dengan jumlah yang sama. Nilai maksimum yang diizinkan untuk flag ini adalah 50% dari totalinnodb_buffer_pool_size
Anda.Jika Anda menentukan nilai yang lebih besar dari 50% dari total
innodb_buffer_pool_size
, Cloud SQL akan mengurangi nilai efektif hingga 50% dari ukuran yang tersedia dan mencatat pesan peringatan untuk instance tersebut ke dalam log.
Setelah mengonfigurasi flag, perintah Anda mungkin terlihat seperti berikut:
gcloud sql instances patch my-instance \ --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296
Flag untuk mengonfigurasi dukungan embedding vektor di Cloud SQL untuk MySQL adalah flag statis. Setelah Anda mengupdate instance dengan flag tersebut, instance Anda akan dimulai ulang secara otomatis agar perubahan konfigurasi dapat diterapkan.
Untuk mengetahui informasi selengkapnya mengenai cara mengonfigurasi flag database untuk MySQL, lihat Mengonfigurasi flag database.
Menonaktifkan dukungan untuk embedding vektor
Guna menonaktifkan dukungan untuk embedding vektor, setel flag cloudsql_vector
ke off
.
Contoh:
gcloud sql instances patch INSTANCE_NAME \ --database-flags=cloudsql_vector=off
Ganti INSTANCE_NAME dengan nama instance tempat Anda menonaktifkan dukungan penyematan vektor.
Menyetel cloudsql_vector
ke off
akan mencegah Anda membuat kolom
penyematan vektor dan indeks penelusuran vektor baru. Setelah Anda mengonfigurasi tanda statis ini, instance akan dimulai ulang secara otomatis agar perubahan konfigurasi diterapkan.
Setelah instance dimulai ulang, Cloud SQL untuk MySQL akan melakukan hal berikut:
- Menghapus semua indeks penelusuran vektor
TREE_SQ
yang dipertahankan dari persistent disk. - Menyimpan entri tabel kamus data untuk indeks penelusuran vektor yang telah dibangun. Namun, Cloud SQL untuk MySQL tidak membangun ulang indeks dan kueri penelusuran apa pun ke indeks ini akan menampilkan error.
- Lanjutkan menyimpan embedding vektor di tabel dasar. Embedding vektor tetap dapat diakses.
Jika nanti Anda mengaktifkan kembali flag cloudsql_vector
untuk instance ini, Cloud SQL akan mencoba membangun ulang indeks saat instance dimulai ulang berdasarkan entri dalam tabel kamus data.
Mengonfigurasi alokasi memori untuk indeks penelusuran vektor
Cloud SQL membangun dan mengelola indeks penelusuran vektor di memori. Jenis indeks TREE_SQ
akan tetap ada saat penonaktifan bersih dan akan dimuat ulang setelah instance dimulai ulang.
Selama runtime, semua indeks penelusuran vektor harus berada di memori.
Untuk memastikan bahwa Cloud SQL memiliki cukup memori yang tersedia untuk menyimpan semua indeks penelusuran vektor dalam memori, konfigurasikan instance Cloud SQL dengan flag database cloudsql_vector_max_mem_size
.
cloudsql_vector_max_mem_size
mengatur banyaknya memori yang disediakan instance Cloud SQL
untuk indeks penelusuran vektor. Saat mengonfigurasi nilai untuk tanda ini, perhatikan hal berikut:
- Nilai default dan minimum adalah 1 GB. Batas atas adalah 50% dari ukuran kumpulan buffer.
- Setelah menetapkan tanda ini, instance akan otomatis dimulai ulang agar perubahan konfigurasi diterapkan.
- Jika instance Anda telah menggunakan semua memori yang dikonfigurasi, Anda tidak dapat membuat atau mengubah indeks penelusuran vektor.
Untuk mengupdate memori yang dialokasikan untuk indeks penelusuran vektor pada instance,
ubah nilai flag cloudsql_vector_max_mem_size
.
gcloud sql instances patch INSTANCE_NAME \ --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE
Ganti kode berikut:
- INSTANCE_NAME: nama instance tempat Anda mengubah alokasi memori.
- NEW_MEMORY_VALUE: alokasi memori yang diperbarui, dalam byte, untuk indeks penelusuran vektor Anda
Perubahan ini akan memulai ulang instance Anda secara otomatis agar perubahan dapat diterapkan.
Menghitung memori yang diperlukan
Jumlah memori yang diperlukan indeks bergantung pada jenis indeks, jumlah embedding vektor, dan dimensi embedding. Ada dua persyaratan memori yang perlu dipertimbangkan:
- Build time memory: memori yang diperlukan selama build indeks
- Index memory: memori yang digunakan indeks setelah indeks dibuat
Untuk indeks tertentu, ukuran set datanya adalah memori yang diperlukan untuk membaca semua embedding vektor dalam memori. Mengingat bahwa setiap dimensi direpresentasikan oleh float yang menggunakan memori 4 byte, Anda dapat menentukan dataset_size sebagai berikut:
dataset_size = <num_embeddings> * (4 * <dimensions>)
Misalnya, jika Anda memiliki 1 juta embedding dengan dimensi 768, dataset_size
Anda akan berukuran 3 GB.
Berdasarkan contoh sebelumnya, persyaratan memori untuk berbagai jenis indeks adalah sebagai berikut:
Jenis indeks | Memori waktu build | Mengindeks memori |
---|---|---|
TREE_SQ |
4 GB | 1 GB |
TREE_AH
|
3,5 GB | 3,5 GB |
BRUTE_FORCE
|
3 GB | 3 GB |
Jika menggunakan indeks penelusuran vektor TREE_SQ
, Anda juga harus memperhitungkan memori yang diperlukan untuk persistensi saat runtime. Untuk jumlah total memori dalam konfigurasi Anda, tambahkan jumlah memori indeks yang digunakan oleh indeks penelusuran vektor TREE_SQ
aktif terbesar.
Setiap kali tabel dasar tempat embedding vektor disimpan mengalami operasi DML, indeks penelusuran vektor akan diperbarui secara real time. Update ini
mengubah jejak memori indeks, yang dapat menyusut atau diperluas bergantung
pada operasi DML. Anda dapat memantau jejak memori sebuah indeks dengan membuat kueri tabel information_schema.innodb_vector_indexes
. Untuk mengetahui informasi tentang cara memantau ukuran indeks penelusuran vektor, lihat Memantau indeks penelusuran vektor.
Konfigurasi replika baca
Jika instance memenuhi kriteria versi pemeliharaan dan pengaktifan flag, Cloud SQL sepenuhnya mendukung embedding vektor pada replika baca.
Jika Anda membuat replika dari instance utama yang mengaktifkan dukungan penyematan vektor, replika baca akan mewarisi setelan dukungan penyematan vektor dari instance utama. Anda harus mengaktifkan dukungan penyematan vektor satu per satu pada instance replika baca yang sudah ada.
Terkait dampak terhadap keterlambatan replikasi, pembuatan dan pemeliharaan indeks penelusuran vektor beroperasi dengan cara yang sama seperti indeks MySQL reguler.
Indeks penelusuran vektor tidak didukung pada replika beruntun.
Contoh: Indeks dan kueri penelusuran vektor ANN sederhana
Contoh panduan berikut memberikan langkah-langkah untuk membuat kueri dan indeks penelusuran vektor berbasis ANN di Cloud SQL.
Membuat embedding vektor. Anda dapat membuat embedding vektor secara manual atau menggunakan API penyematan teks pilihan Anda. Untuk contoh yang menggunakan Vertex AI, lihat Membuat embedding vektor berdasarkan data baris.
Buat tabel di Cloud SQL untuk MySQL yang berisi kolom embedding vektor dengan tiga dimensi.
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY );
Masukkan embedding vektor ke dalam kolom.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Commit perubahan.
commit;
Membuat indeks penelusuran vektor. Jika Anda membuat indeks
TREE_SQ
atauTREE_AH
, tabel Anda harus memiliki minimal 1.000 baris.CALL mysql.create_vector_index('vectorIndex', 'dbname.books', 'embedding', 'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED' );
Cari tetangga terdekat.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Menghasilkan embedding vektor berdasarkan data baris
Anda dapat membuat embedding vektor untuk data baris tertentu menggunakan API penyematan teks seperti Vertex AI atau OpenAI. Anda dapat menggunakan API embedding teks apa pun dengan embedding vektor Cloud SQL. Namun, Anda harus menggunakan API embedding teks yang sama untuk pembuatan vektor string kueri. Anda tidak dapat menggabungkan API yang berbeda untuk data sumber dan vektorisasi kueri.
Misalnya, Anda dapat membuat embedding vektor dari Vertex AI:
from vertexai.language_models import TextEmbeddingModel
def text_embedding() -> list:
"""Text embedding with a Large Language Model."""
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@001")
embeddings = model.get_embeddings(["What is life?"])
for embedding in embeddings:
vector = embedding.values
print(f"Length of Embedding Vector: {len(vector)}")
return vector
if __name__ == "__main__":
text_embedding()
Menyimpan embedding vektor
Bagian ini memberikan contoh pernyataan untuk menyimpan embedding vektor di Cloud SQL.
Membuat tabel baru dengan kolom penyematan vektor
CREATE TABLE books (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(60),
embedding VECTOR(3) USING VARBINARY
);
Menambahkan kolom penyematan vektor ke tabel yang ada
ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;
Menyisipkan embedding vektor
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')
);
Menyisipkan beberapa embedding vektor
INSERT INTO books (
title,
embedding
) VALUES (
'book title',
string_to_vector('[1,2,3]')),
('book title', string_to_vector('[4,5,6]')
);
Memperbarui embedding vektor
INSERT INTO books (
id,
title,
embedding
) VALUES (
1,
'book title',
string_to_vector('[1,2,3]')
)
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');
Memperbarui embedding vektor
UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;
Menghapus embedding vektor
DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');
Menggunakan indeks penelusuran vektor
Secara default, Anda dapat melakukan penelusuran tetangga terdekat, yang memberikan perolehan yang sempurna. Anda juga dapat menambahkan indeks untuk menggunakan penelusuran ANN, yang menukar beberapa perolehan dengan kecepatan. Tidak seperti indeks biasa, setelah menambahkan indeks perkiraan, Anda akan melihat hasil yang berbeda untuk kueri.
Rekomendasi
Bagian ini memberikan praktik terbaik untuk menggunakan indeks penelusuran vektor. Setiap beban kerja berbeda-beda, dan Anda mungkin perlu menyesuaikannya.
- Sebelum membuat indeks penelusuran vektor, Anda harus memuat data ke dalam tabel.
Tabel dasar Anda harus memiliki minimal 1.000 baris.
Persyaratan ini hanya berlaku untuk jenis indeks penelusuran
TREE_SQ
danTREE_AH
. Jika Anda memiliki lebih banyak {i>data point<i}, maka Anda akan memiliki partisi dan pelatihan indeks yang lebih baik. - Memantau penggunaan memori indeks. Jika instance kehabisan memori, Anda tidak dapat membuat atau membangun indeks apa pun. Untuk indeks yang ada, setelah mencapai nilai minimum, Cloud SQL akan menulis peringatan ke log error MySQL secara berkala. Anda dapat melihat penggunaan memori dalam
tabel
information_schema.innodb_vector_indexes
. - Jika tabel dasar yang mendasarinya telah mengalami perubahan DML besar, bangun ulang indeks penelusuran vektor. Untuk mendapatkan ukuran awal indeks pada waktu build dan ukuran indeks saat ini, buat kueri tabel
information_schema.innodb_vector_indexes
. - Secara umum, Anda dapat membiarkan jumlah partisi yang akan dihitung secara internal. Jika memiliki kasus penggunaan yang ingin Anda tentukan jumlah partisi, Anda harus memiliki setidaknya 100 titik data per partisi.
Tabel dasar hanya baca selama operasi indeks penelusuran vektor
Selama ketiga operasi indeks penelusuran vektor—buat, ubah, dan lepas—tabel dasar dialihkan ke mode hanya baca. Selama operasi ini, tidak ada DML yang diizinkan di tabel dasar.
Persistensi, penonaktifan, dan dampak terhadap pemeliharaan
Hanya indeks penelusuran vektor yang menggunakan jenis TREE_SQ
yang akan dipertahankan di disk saat penonaktifan instance secara bersih.
Indeks penelusuran vektor yang menggunakan jenis TREE_AH
dan BRUTE_FORCE
hanya ada dalam memori.
Setelah instance selesai dimatikan, Cloud SQL akan memuat ulang indeks penelusuran vektor saat instance dimulai ulang. Namun, setelah terjadi error atau penonaktifan yang tidak rapi, Cloud SQL harus membangun ulang indeks penelusuran vektor. Misalnya, setiap kali instance Anda mengalami error dan pemulihan dari pencadangan dan pemulihan, pemulihan point-in-time (PITR), atau failover ketersediaan tinggi (HA), Cloud SQL akan membangun ulang indeks penelusuran vektor Anda. Untuk peristiwa ini, hal berikut akan terjadi:
- Build ulang terjadi di latar belakang secara otomatis.
- Selama rebuild, tabel dasar berada dalam mode hanya baca.
- Jika build ulang otomatis tidak dapat memperoleh kunci pada tabel dalam periode waktu tunggu tertentu, build ulang akan gagal. Anda mungkin perlu membangun ulang indeks secara manual.
Waktu yang diperlukan untuk mem-build ulang indeks dapat menambah waktu yang diperlukan untuk penonaktifan, yang juga dapat menambah waktu pemeliharaan dan update yang diperlukan untuk instance.
Membuat indeks penelusuran vektor
Pernyataan untuk membuat indeks penelusuran vektor menggunakan sintaks berikut:
CALL mysql.create_vector_index('INDEX_NAME', 'DB_NAME.TABLE_NAME', 'COLUMN_NAME', 'PARAMETERS' );
Contoh:
CALL mysql.create_vector_index('vectorIndex',
'db.books',
'embedding',
'index_type=TREE_SQ, distance_measure=l2_squared'
);
Nama indeks yang Anda tentukan harus unik di dalam database.
Parameter indeks penelusuran vektor
Fungsi buat indeks penelusuran (dan ubah indeks penelusuran) mendukung beberapa parameter yang dapat Anda tentukan dengan key-value pair yang dipisahkan koma. Semua parameter fungsi create indeks penelusuran bersifat opsional. Jika Anda menetapkan string kosong atau NULL, nilai parameter default akan dikonfigurasi untuk indeks.
- distance_measure: nilai yang didukung adalah:
L2_SQUARED
,COSINE
, danDOT_PRODUCT
.L2_SQUARED
adalah default. - num_neighbors: jumlah tetangga yang akan ditampilkan secara default selama kueri
ANN. Anda juga dapat mengganti parameter ini saat melakukan kueri penelusuran. Defaultnya adalah
10
. index_type: menentukan jenis indeks yang akan dibuat. Nilai yang valid adalah:
BRUTE_FORCE
,TREE_SQ
, danTREE_AH
.BRUTE_FORCE
adalah setelan default untuk tabel yang memiliki kurang dari 10.000 barisTREE_SQ
adalah setelan default untuk tabel yang memiliki 10.000 baris atau lebih
Untuk menentukan jenis indeks
TREE_AH
atauTREE_SQ
, ukuran tabel dasar Anda harus lebih dari 1.000 baris.num_parititions: menentukan jumlah cluster K-means yang akan dibuat. Parameter ini hanya diizinkan jika Anda telah mengonfigurasi
index_type
. Opsi ini tidak berlaku untukBRUTE_FORCE
. Jika Anda menentukan jenis indeksTREE_SQ
atauTREE_AH
, ukuran tabel dasar Anda harus lebih besar atau sama dengan num_partitions * 100.
Mengubah indeks penelusuran vektor
CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');
Fungsi alter_vector_index
digunakan secara eksplisit untuk mem-build ulang indeks penelusuran vektor. Untuk menggunakan fungsi ini, indeks harus sudah ada. Anda mungkin ingin
membuat ulang indeks untuk kasus penggunaan berikut:
- Anda ingin membangun kembali indeks dengan opsi yang berbeda. Misalnya, Anda mungkin ingin menggunakan jenis indeks atau ukuran jarak yang berbeda.
- Anda ingin membangun ulang indeks karena tabel dasar telah mengalami perubahan DML utama. Misalnya, Anda perlu melatih ulang indeks penelusuran vektor berdasarkan data saat ini dalam tabel dasar.
Semua parameter untuk mem-build ulang indeks identik dengan parameter yang tersedia untuk membuat indeks dan juga bersifat opsional. Jika Anda menetapkan string kosong atau NULL saat membuat ulang indeks, indeks akan dibuat ulang berdasarkan parameter yang ditentukan pada waktu pembuatan indeks. Jika tidak ada parameter yang disediakan pada waktu pembuatan indeks, parameter value default akan digunakan.
Indeks penelusuran vektor yang ada tersedia selama operasi ubah. Anda masih dapat menjalankan kueri penelusuran terhadap indeks tersebut.
Menempatkan indeks penelusuran vektor
Anda tidak dapat melakukan operasi DDL pada tabel yang memiliki indeks penelusuran vektor. Sebelum menjalankan operasi DDL pada tabel, Anda harus menghapus indeks penelusuran vektor.
CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');
Embedding vektor kueri
Bagian ini memberikan contoh berbagai cara untuk membuat kueri embedding vektor.
Melihat embedding vektor
SELECT vector_to_string(embedding) FROM books;
Mendapatkan penelusuran tetangga yang tepat ke embedding vektor
SELECT id,cosine_distance(embedding,
string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;
Mendapatkan penelusuran perkiraan tetangga ke embedding vektor
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');
Melakukan penelusuran ANN mendukung dua parameter. Keduanya bersifat opsional.
- num_partitions: menentukan jumlah partisi yang akan diperiksa untuk penelusuran vektor ANN. Jika Anda tidak menentukan jumlah partisi, penelusuran akan menggunakan nilai yang dihasilkan berdasarkan ukuran tabel, jumlah partisi dalam indeks penelusuran vektor, dan faktor lainnya.
- num_neighbors: menentukan jumlah tetangga yang akan dikembalikan. Nilai ini menggantikan nilai yang ditetapkan pada waktu create vector search index.
Filter embedding vektor
Gunakan kolom tambahan sebagai predikat untuk meningkatkan kualitas pemfilteran hasil kueri penyematan vektor. Misalnya, jika menambahkan kolom printyear
, Anda dapat menambahkan nilai tahun tertentu sebagai filter ke kueri.
SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;
Mengkueri jarak embedding vektor
Bagian ini memberikan contoh fungsi jarak vektor yang tersedia untuk penelusuran KNN.
Mendapatkan jarak Cosine
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Mendapatkan jarak Dot Product
SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Mendapatkan jarak L2 kuadrat
SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;
Mendapatkan baris dalam jarak tertentu
SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;
Anda dapat menggabungkan dengan ORDER BY
dan LIMIT
SELECT id, vector_to_string(embedding),
l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;
Memantau indeks penelusuran vektor
Untuk mendapatkan informasi real-time tentang semua indeks penelusuran vektor dalam instance, gunakan tabel information_schema.innodb_vector_indexes
.
Untuk melihat tabel, jalankan perintah berikut:
SELECT * FROM information_schema.innodb_vector_indexes;
Contoh output mungkin terlihat seperti berikut:
*************************** 1. row *************************** INDEX_NAME: test.t4_index TABLE_NAME: test.t4_bf INDEX_TYPE: BRUTE_FORCE DIST_MEASURE: SquaredL2Distance STATUS: Ready STATE: INDEX_READY_TO_USE PARTITIONS: 0 SEARCH_PARTITIONS: 0 INITIAL_SIZE: 40000 CURRENT_SIZE: 40000 QUERIES: 0 MUTATIONS: 0 INDEX_MEMORY: 160000 DATASET_MEMORY: 0
Dalam tabel information_schema.innodb_vector_indexes
, Anda dapat melihat
hal berikut:
- Opsi yang berpotensi dibuat. Dengan kata lain,
num_partitions
atau jumlah partisi yang akan diperiksa kueri. - Kolom
STATE
danSTATUS
menunjukkan status indeks saat ini. Selama fase build, kolom status memberikan informasi tentang seberapa jauh indeks penelusuran vektor dalam fase build. - Kolom
INITIAL_SIZE
menyediakan ukuran tabel selama pembuatan indeks. Anda dapat membandingkan ukuran ini denganCURRENT_SIZE
untuk mendapatkan gambaran tentang seberapa besar perubahan indeks sejak pembuatannya karena DML pada tabel dasar. - Kolom
QUERIES
danMUTATIONS
memberikan insight real-time tentang seberapa sibuk indeks. Kolom
INDEX_MEMORY
danDATASET_MEMORY
memberikan informasi tentang konsumsi memori indeks.INDEX_MEMORY
menunjukkan jumlah memori yang dipakai oleh indeks dan
DATASET_MEMORY
menunjukkan jumlah memori tambahan yang terpakai selama waktu build.
Untuk mendapatkan daftar indeks vektor penelusuran yang dibuat pada instance, Anda dapat melihat tabel kamus data mysql.vector_indexes
.
Untuk melihat tabel, jalankan perintah berikut:
SELECT * FROM mysql.vector_indexes;
Contoh output:
*************************** 1. row *************************** index_name: test.index1 table_name: test.t1 column_name: j index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED status: ACTIVE create_time: 2024-04-08 22:46:21 update_time: 2024-04-08 22:46:21 1 row in set (0.00 sec)
Batasan
- Hanya boleh ada satu kolom penyematan vektor per tabel.
- Hanya boleh ada satu indeks penelusuran vektor per tabel.
- Penyematan vektor dapat memiliki hingga 16.000 dimensi.
- Partisi tingkat tabel InnoDB pada tabel dengan kolom penyematan vektor tidak didukung.
- Jika instance dimulai ulang dari penonaktifan yang tidak bersih, Cloud SQL akan otomatis membangun ulang indeks penelusuran vektor.
- Saat membangun kembali indeks penelusuran vektor, tabel dasar akan bersifat hanya baca.
- Jika Cloud SQL tidak dapat memperoleh kunci pada tabel dalam waktu yang ditentukan, pembuatan ulang otomatis indeks mungkin akan gagal.
- Jika pembuatan ulang indeks secara otomatis gagal, Anda harus membangun ulang indeks secara manual.
- Untuk menambahkan kolom embedding vektor, tabel harus memiliki kunci utama. Cloud SQL tidak mendukung kunci utama dari jenis data
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
, atau spasial. Kunci utama gabungan tidak dapat menyertakan jenis ini. - Jika indeks penelusuran vektor ada di tabel, operasi DDL tidak diizinkan. Indeks penelusuran vektor harus dihapus sebelum menjalankan operasi DDL pada tabel dasar.
- Embedding vektor tidak didukung pada tabel non-InnoDB atau pada tabel sementara.
- Kolom penyematan vektor tidak boleh berupa kolom yang dihasilkan.
- Predikat
NEAREST..TO
dapat digabungkan dengan predikat "skalar" lainnya menggunakanAND
atauOR
. Predikat skalar pada tabel dievaluasi setelah predikat vektor diterapkan. - Predikat
NEAREST..TO
hanya didukung dalam pernyataanSELECT
. Pernyataan DML lainnya tidak mendukungNEAREST..TO
. - Subquery tidak didukung dengan
NEAREST..TO
. Batasan tidak dapat ditambahkan ke kunci utama tabel dasar jika terdapat indeks penelusuran vektor. Pra-pemfilteran hanya dapat dilakukan melalui fungsi jarak dan dengan menggunakan
ORDER BY
denganLIMIT
.Misalnya, jika Anda membuat tabel berikut:
CREATE TABLE books ( bookid INT PRIMARY KEY, title VARCHAR(1000), author VARCHAR(100), printyear int, country VARCHAR(100), bvector VECTOR(1536) USING VARBINARY //bvector is embedding vector of book's plot,genre,reviews etc );
Kemudian Anda dapat menggunakan kueri berikut untuk melakukan pra-pemfilteran.
//select query to obtain books by specific author and having similar plot-genre-reviews SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist FROM books where author='cloudsql' ORDER BY dist LIMIT 10
Pemfilteran pasca-pemfilteran didukung dengan
NEAREST..TO
dan fungsi jarak.
Memecahkan masalah
Jika terjadi error, indeks akan otomatis dibuat ulang. Saat build ulang sedang berlangsung, ada dua batasan:
- Selama pembuatan indeks, tabel dasar berada dalam mode hanya baca.
- Saat indeks dibuat ulang, kueri ANN terhadap indeks yang ada akan gagal.