Halaman ini menjelaskan cara berinteraksi dengan Cloud SQL untuk mem-build aplikasi yang menggunakan penyematan vektor.
Cloud SQL untuk MySQL mendukung penyimpanan penyematan vektor. Kemudian, Anda dapat membuat indeks penelusuran vektor dan melakukan penelusuran kemiripan pada penyematan vektor ini bersama dengan data lainnya yang Anda simpan di Cloud SQL.
Penyimpanan embedding vektor
Anda dapat menggunakan Cloud SQL untuk MySQL untuk menyimpan penyematan 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
penyematan vektor dalam tabel dengan jaminan transaksional yang ada. Tabel
yang memiliki kolom penyematan vektor adalah tabel InnoDB reguler sehingga
mematuhi 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 penyematan 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 Anda memiliki penyimpanan dan memori yang memadai, Anda dapat memiliki tabel terpisah dengan kolom penyematan vektor dan indeks penelusuran vektor yang berbeda pada instance yang sama.
Meskipun tidak ada batas mutlak untuk jumlah penyematan vektor yang dapat Anda simpan dalam tabel, indeks penelusuran vektor memerlukan memori. Oleh karena itu, sebaiknya Anda tidak menyimpan lebih dari 10 juta penyematan vektor dalam tabel.
Replikasi berfungsi dengan cara yang sama untuk kolom penyematan vektor seperti halnya untuk kolom InnoDB MySQL lainnya.
Penelusuran kemiripan
Cloud SQL mendukung penelusuran kesamaan menggunakan kueri penelusuran tetangga terdekat (KNN) dan perkiraan tetangga terdekat (ANN). Anda dapat menggunakan kedua jenis penelusuran vektor di instance Cloud SQL. Anda dapat membuat indeks penelusuran vektor untuk penelusuran ANN.
Penelusuran K-nearest neighbors (KNN)
Cloud SQL mendukung kueri menggunakan penelusuran vektor KNN, yang juga disebut sebagai penelusuran tetangga terdekat yang tepat. Melakukan penelusuran vektor KNN memberikan recall yang sempurna. Anda dapat melakukan penelusuran KNN tanpa harus membuat indeks penelusuran vektor. Penelusuran KNN didasarkan pada 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 cara menggunakan fungsi jarak penelusuran vektor, lihat Mengkueri jarak embedding vektor.
Penelusuran perkiraan 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 recall 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 subset yang lebih kecil dari set data asli. Memori yang digunakan oleh indeks sama dengan ukuran set data. Jenis indeks ini tidak dipertahankan 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% dari ukuran set data. IndeksTREE_SQ
dipertahankan ke disk.TREE_AH
: jenis indeks penelusuran vektor yang menyediakan algoritma jenis penelusuran hashing assimetris. 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 melakukan operasi Data Manipulation Language (DML) pada tabel dasar juga
akan menyebarkan perubahan ke indeks penelusuran vektor terkait. Perubahan dalam
indeks penelusuran vektor akan langsung terlihat oleh semua transaksi lainnya, yang
berarti tingkat isolasi READ_UNCOMMITTED
.
Jika Anda melakukan rollback transaksi, perubahan rollback yang sesuai 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 cascading tidak didukung.
Mengonfigurasi instance untuk mendukung penyematan vektor
Bagian ini menjelaskan cara mengonfigurasi instance Cloud SQL untuk mendukung penyimpanan, pengindeksan, dan kueri penyematan vektor.
Instance edisi Cloud SQL Enterprise dan edisi Cloud SQL Enterprise Plus mendukung penyematan vektor.
Sebelum memulai
- Instance Anda harus menjalankan Cloud SQL untuk MySQL MySQL versi
8.0.36.R20240401.03_00
atau yang lebih baru. - Instance Anda harus memiliki ruang disk dan memori yang memadai untuk mengalokasikan memori untuk jumlah total penyematan vektor pada instance.
Mengaktifkan dukungan untuk penyematan vektor
Untuk mengaktifkan dukungan penyematan 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, konfigurasikan flag MySQL berikut di instance Anda:
cloudsql_vector
: tetapkan tanda ini keon
untuk mengaktifkan dukungan penelusuran dan penyimpanan penyematan vektor. Anda dapat membuat kolom embedding vektor baru dan indeks penelusuran vektor di instance.cloudsql_vector_max_mem_size
: optional. Tentukan alokasi memori maksimum dalam byte untuk semua indeks penelusuran vektor di instance. Jika Anda tidak menentukan flag ini, alokasi memori default adalah 1 GB, yang adalah alokasi memori minimum. Untuk informasi selengkapnya tentang cara menghitung jumlah yang akan ditentukan, lihat Mengonfigurasi alokasi memori untuk indeks penelusuran vektor.Memori khusus ini berasal dari memori yang dialokasikan untuk
innodb_buffer_pool_size
Anda. Buffer pool 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 menjadi 50% dari ukuran yang tersedia dan mencatat pesan peringatan untuk instance.
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 penyematan vektor di Cloud SQL untuk MySQL adalah flag statis. Setelah Anda mengupdate instance dengan flag, instance akan dimulai ulang secara otomatis agar perubahan konfigurasi diterapkan.
Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi flag database untuk MySQL, lihat Mengonfigurasi flag database.
Menonaktifkan dukungan untuk penyematan vektor
Untuk menonaktifkan dukungan untuk penyematan vektor, tetapkan 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.
Menetapkan cloudsql_vector
ke off
akan mencegah Anda membuat kolom penyematan vektor baru dan indeks penelusuran vektor. Setelah Anda mengonfigurasi flag 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 dibuat. Namun, Cloud SQL untuk MySQL tidak membuat ulang indeks dan kueri penelusuran apa pun ke indeks ini akan menampilkan error.
- Terus menyimpan penyematan vektor di tabel dasar. Embed vektor tetap dapat diakses.
Jika Anda mengaktifkan kembali flag cloudsql_vector
untuk instance nanti, Cloud SQL akan mencoba membuat ulang indeks saat instance dimulai ulang berdasarkan entri dalam tabel kamus data.
Mengonfigurasi alokasi memori untuk indeks penelusuran vektor
Cloud SQL membuat dan mengelola indeks penelusuran vektor dalam memori. Jenis indeks TREE_SQ
tetap ada saat shutdown bersih dan dimuat ulang setelah instance dimulai ulang.
Selama runtime, semua indeks penelusuran vektor harus tetap berada dalam memori.
Untuk memastikan Cloud SQL memiliki memori yang cukup 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 jumlah memori yang dialokasikan instance Cloud SQL untuk indeks penelusuran vektor. Saat Anda mengonfigurasi nilai untuk flag, perhatikan hal berikut:
- Nilai default dan minimum adalah 1 GB. Batas atas adalah 50% dari ukuran buffer pool.
- Setelah Anda menetapkan tanda ini, instance akan otomatis dimulai ulang agar perubahan konfigurasi diterapkan.
- Jika instance telah menggunakan semua memori yang dikonfigurasinya, Anda tidak dapat membuat atau mengubah indeks penelusuran vektor.
Untuk memperbarui 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 otomatis memulai ulang instance Anda sehingga perubahan dapat diterapkan.
Menghitung memori yang diperlukan
Jumlah memori yang diperlukan indeks bergantung pada jenis indeks, jumlah penyematan vektor, dan dimensi penyematan. Ada dua persyaratan memori yang perlu dipertimbangkan:
- Memori waktu build: memori yang diperlukan selama build indeks
- Memori indeks: memori yang digunakan indeks setelah indeks dibuat
Untuk indeks tertentu, ukuran set datanya adalah memori yang diperlukan untuk membaca semua penyematan vektor dalam memori. Mengingat 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 penyematan dengan 768 dimensi, dataset_size
Anda adalah 3 GB.
Berdasarkan contoh sebelumnya, persyaratan memori untuk berbagai jenis indeks adalah sebagai berikut:
Jenis indeks | Memori waktu build | Memori indeks |
---|---|---|
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
mempertimbangkan 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 penyematan vektor disimpan mengalami operasi DML, indeks penelusuran vektor akan diperbarui secara real time. Pembaruan ini
mengubah jejak memori indeks, yang dapat menyusut atau meluas bergantung
pada operasi DML. Anda dapat memantau jejak memori 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 versi pemeliharaan dan kriteria pengaktifan flag, Cloud SQL akan sepenuhnya mendukung penyematan 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 secara terpisah pada instance replika baca yang sudah ada.
Dalam hal dampak terhadap jeda 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 indeks penelusuran vektor dan kueri berbasis ANN di Cloud SQL.
Membuat embedding vektor. Anda dapat membuat embedding vektor secara manual atau menggunakan text embedding API pilihan Anda. Untuk contoh yang menggunakan Vertex AI, lihat Membuat penyematan vektor berdasarkan data baris.
Buat tabel di Cloud SQL untuk MySQL yang berisi kolom penyematan vektor dengan tiga dimensi.
CREATE TABLE books ( id INTEGER PRIMARY KEY AUTO_INCREMENT, title VARCHAR(60), embedding VECTOR(3) USING VARBINARY );
Sisipkan penyematan vektor ke dalam kolom.
INSERT INTO books VALUES ( 1, 'book title', string_to_vector('[1,2,3]') );
Lakukan commit pada perubahan.
commit;
Buat 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' );
Dapatkan tetangga terdekat.
SELECT title FROM books WHERE NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
Membuat embedding vektor berdasarkan data baris
Anda dapat membuat embedding vektor untuk data baris tertentu menggunakan API embedding teks seperti Vertex AI atau OpenAI. Anda dapat menggunakan API penyematan teks apa pun dengan penyematan vektor Cloud SQL. Namun, Anda harus menggunakan API penyematan 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 penyematan 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("text-embedding-004")
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 penyematan 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 dan menyisipkan 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 penyematan 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 sama persis, yang memberikan recall sempurna. Anda juga dapat menambahkan indeks untuk menggunakan penelusuran ANN, yang mengorbankan beberapa recall untuk 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, 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 memiliki lebih banyak titik data, Anda akan memiliki partisi dan pelatihan indeks yang lebih baik. - Memantau penggunaan memori indeks. Jika instance kehabisan memori,
Anda tidak dapat membuat atau mem-build 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 di
tabel
information_schema.innodb_vector_indexes
. - Jika tabel dasar yang mendasarinya telah mengalami perubahan DML besar, buat 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
. - Umumnya, Anda dapat membiarkan jumlah partisi dihitung secara internal. Jika memiliki kasus penggunaan yang ingin menentukan jumlah partisi, Anda harus memiliki minimal 100 titik data per partisi.
Tabel dasar hanya baca selama operasi indeks penelusuran vektor
Selama durasi ketiga operasi indeks penelusuran vektor—buat, ubah, dan hapus—tabel dasar akan dimasukkan ke dalam 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 dipertahankan ke disk
saat shutdown bersih dari shutdown instance.
Indeks penelusuran vektor yang menggunakan jenis TREE_AH
dan BRUTE_FORCE
hanya
ada dalam memori.
Setelah instance dimatikan secara bersih, Cloud SQL memuat ulang indeks penelusuran vektor saat instance dimulai ulang. Namun, setelah error atau penghentian yang tidak bersih, Cloud SQL harus membuat 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 mem-build ulang indeks penelusuran vektor Anda. Untuk peristiwa ini, hal berikut akan terjadi:
- Pembuatan ulang akan terjadi di latar belakang secara otomatis.
- Selama proses build ulang, tabel dasar berada dalam mode hanya baca.
- Jika pembuatan ulang otomatis tidak dapat mendapatkan kunci pada tabel dalam periode waktu tunggu tertentu, pembuatan ulang akan gagal. Anda mungkin perlu membuat ulang indeks secara manual.
Waktu yang diperlukan untuk membuat ulang indeks dapat meningkatkan waktu yang diperlukan untuk penonaktifan, yang juga dapat meningkatkan waktu pemeliharaan dan update yang diperlukan untuk instance.
Membuat indeks penelusuran vektor
Pernyataan untuk membuat indeks penelusuran vektor menggunakan sintaksis 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 dalam database.
Parameter indeks penelusuran vektor
Fungsi buat indeks penelusuran (dan ubah indeks penelusuran) mendukung beberapa parameter yang dapat Anda tentukan dengan pasangan nilai kunci yang dipisahkan koma. Semua parameter fungsi pembuatan indeks penelusuran bersifat opsional. Jika Anda menentukan 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 defaultnya. - 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 default untuk tabel yang memiliki kurang dari 10.000 barisTREE_SQ
adalah default untuk tabel yang memiliki 10.000 baris atau lebih
Untuk menentukan jenis indeks
TREE_AH
atauTREE_SQ
, ukuran tabel dasar Anda harus lebih besar 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 harus lebih besar dari 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 membuat ulang indeks penelusuran
vektor. Untuk menggunakan fungsi ini, indeks harus sudah ada. Anda mungkin ingin
mem-build ulang indeks untuk kasus penggunaan berikut:
- Anda ingin membuat ulang indeks dengan opsi yang berbeda. Misalnya, Anda mungkin ingin menggunakan jenis indeks atau pengukuran jarak yang berbeda.
- Anda ingin membuat ulang indeks karena tabel dasar telah mengalami perubahan DML utama. Misalnya, Anda perlu melatih ulang indeks penelusuran vektor berdasarkan data saat ini di tabel dasar.
Semua parameter untuk mem-build ulang indeks identik dengan parameter yang tersedia untuk membuat indeks dan juga bersifat opsional. Jika Anda menentukan 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 diberikan pada waktu pembuatan indeks, nilai parameter default akan digunakan.
Indeks penelusuran vektor yang ada tersedia selama operasi perubahan. Anda masih dapat menjalankan kueri penelusuran terhadap indeks.
Menghapus indeks penelusuran vektor
Anda tidak dapat melakukan operasi DDL pada tabel yang memiliki indeks penelusuran vektor. Sebelum melakukan operasi DDL pada tabel, Anda harus menghapus indeks penelusuran vektor.
CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');
Membuat kueri embedding vektor
Bagian ini memberikan contoh berbagai cara untuk membuat kueri penyematan 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 perkiraan penelusuran 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 diselidiki 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 ditampilkan. Nilai ini menggantikan nilai yang ditetapkan pada waktu pembuatan indeks penelusuran vektor.
Memfilter embedding vektor
Gunakan kolom tambahan sebagai predikat untuk menyesuaikan 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;
Membuat kueri jarak penyematan vektor
Bagian ini memberikan contoh fungsi jarak vektor yang tersedia untuk penelusuran KNN.
Mendapatkan jarak Kosinus
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 Kuadrat L2
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
Di tabel information_schema.innodb_vector_indexes
, Anda dapat melihat
hal berikut:
- Opsi yang berpotensi dihasilkan. Dengan kata lain,
num_partitions
atau jumlah partisi yang akan diselidiki untuk kueri. - Kolom
STATE
danSTATUS
memberi tahu Anda status indeks saat ini. Selama fase build, kolom status memberikan informasi tentang sejauh mana indeks penelusuran vektor berada dalam fase build. - Kolom
INITIAL_SIZE
memberikan ukuran tabel selama pembuatan indeks. Anda dapat membandingkan ukuran ini denganCURRENT_SIZE
untuk mendapatkan ide tentang seberapa banyak indeks telah berubah sejak pembuatannya karena DML pada tabel dasar. - Kolom
QUERIES
danMUTATIONS
memberi Anda insight real-time tentang seberapa sibuk indeks. Kolom
INDEX_MEMORY
danDATASET_MEMORY
memberikan informasi tentang konsumsi memori indeks.INDEX_MEMORY
menunjukkan jumlah memori yang digunakan oleh indeks dan
DATASET_MEMORY
menunjukkan jumlah memori tambahan yang digunakan selama waktu build.
Untuk mendapatkan daftar indeks vektor penelusuran yang dibuat di 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.
- Embedding vektor dapat memiliki hingga 16.000 dimensi.
- Partisi tingkat tabel InnoDB pada tabel dengan kolom penyematan vektor tidak didukung.
- Jika instance dimulai ulang dari penghentian yang tidak bersih, Cloud SQL
akan membuat ulang indeks penelusuran vektor secara otomatis.
- Saat membuat ulang indeks penelusuran vektor, tabel dasar bersifat hanya baca.
- Jika Cloud SQL tidak dapat memperoleh kunci pada tabel dalam waktu yang ditentukan, pembuatan ulang indeks secara otomatis mungkin akan gagal.
- Jika pembuatan ulang indeks otomatis gagal, Anda harus membuat ulang indeks secara manual.
- Untuk menambahkan kolom penyematan vektor, tabel harus memiliki kunci utama. Cloud SQL tidak mendukung kunci utama dari jenis
BIT
,BINARY
,VARBINARY
,JSON
,BLOB
,TEXT
, atau jenis data spasial. Kunci utama gabungan tidak dapat menyertakan jenis apa pun dari jenis ini. - Jika indeks penelusuran vektor ada di tabel, operasi DDL tidak diizinkan. Indeks penelusuran vektor harus dihapus sebelum melakukan operasi DDL pada tabel dasar.
- Penyematan 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" lain menggunakanAND
atauOR
. Predikat skalar di tabel dievaluasi setelah predikat vektor diterapkan. - Predikat
NEAREST..TO
hanya didukung dalam pernyataanSELECT
. Pernyataan DML lainnya tidak mendukungNEAREST..TO
. - Subkueri tidak didukung dengan
NEAREST..TO
. Batasan tidak dapat ditambahkan ke kunci utama tabel dasar jika indeks penelusuran vektor ada. 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
Pasca-pemfilteran didukung dengan fungsi
NEAREST..TO
dan jarak.
Memecahkan masalah
Jika terjadi error, indeks akan otomatis dibuat ulang. Saat proses 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.