Membuat dan mengelola indeks vektor

Halaman ini menjelaskan cara mengonfigurasi memori untuk indeks vektor, serta membuat, menyesuaikan, memantau, dan menghapus indeks vektor.

Sebelum memulai

Sebelum membuat indeks vektor, Anda harus memuat data ke dalam tabel dasar dengan nilai embedding vektor. Tabel dasar Anda harus memiliki minimal 1.000 baris. Jika Anda memiliki lebih banyak titik data yang tersedia, Anda bisa mendapatkan partisi dan pelatihan indeks yang lebih baik.

Mengonfigurasi alokasi memori untuk indeks vektor

Flag database cloudsql_vector_max_mem_size mengontrol jumlah memori yang didedikasikan instance Cloud SQL Anda untuk indeks vektor. Ini adalah tanda statis yang memerlukan instance Anda untuk dimulai ulang. Memori ini memiliki dua tujuan utama:

  1. Menyimpan struktur indeks vektor: bagian non-leaf dari indeks vektor (TREE_MEMORY) berada di memori ini. Perkiraan ukuran pohon ini bergantung pada jumlah node daun (num_leaves) dan dimensi vektor Anda:

     Approximate TREE_MEMORY = num_leaves * vector dimensions * 4 * 2
    

    Misalnya, indeks dengan 1.000 leaf dan 768 dimensi akan memiliki TREE_MEMORY sekitar 1.000 * 768 * 4 * 2 atau 6.144.000 byte. Anda juga dapat memeriksa TREE_MEMORY yang sebenarnya menggunakan tabel information_schema.innodb_vector_indexes. Cloud SQL mengelola memori tersebut. Anda tidak perlu mengalokasikan ruang untuk semua indeks vektor secara bersamaan, karena indeks yang tidak aktif akan dibongkar untuk memberi ruang bagi permintaan lain.

  2. Memori untuk pembuatan indeks (data pelatihan): selama pembuatan indeks vektor, memori diperlukan untuk memproses sampel data dari tabel dasar Anda guna membuat indeks. Memori ini hanya digunakan selama proses pembuatan indeks dan dikosongkan setelahnya. Perkiraan ukuran memori yang diperlukan untuk pelatihan adalah:

     approximate_training_memory = num_rows in base table * 0.1 * 4 * vector dimensions
    

    Misalnya, dengan tabel 1.000.000 baris dan 768 dimensi, training_memory adalah 1000000 * 0,1 * 768 * 4 atau 307.200.000 byte. Hanya 10% data tabel dasar yang diambil sampelnya untuk menghitung sentroid untuk pohon.

    Saat Anda mengaktifkan flag cloudsql_vector, Cloud SQL akan otomatis menetapkan cloudsql_vector_max_mem_size default berdasarkan ukuran VM Anda. Setelan default ini biasanya sudah cukup untuk workload umum. Cloud SQL mengurangi flag innodb_buffer_pool_size untuk mengalokasikan memori ini. Nilai maksimum default untuk cloudsql_vector_max_mem_size adalah 16 GB. Jika perlu menyesuaikan ukuran memori, Anda dapat menyesuaikan cloudsql_vector_max_mem_size secara dinamis berdasarkan penggunaan indeks vektor.

    Penting: Jika Anda meningkatkan cloudsql_vector_max_mem_size, Anda harus mengurangi innodb_buffer_pool_size untuk menghindari masalah memori.

cloudsql_vector_max_mem_size nilai

Ukuran VM cloudsql_vector_max_mem_size
4 GB 194MB
8 GB 515MB
16 GB 1,2 GB
32 GB 2,56 GB
64 GB 5,12 GB
128 GB 10,24 GB
256GB+ 16 GB

Rentang memori indeks vektor yang dialokasikan adalah sebagai berikut:

  • Minimum 128 MB
  • 10% dari kumpulan buffer
  • Maksimum 16 GB

Anda dapat menyesuaikan memori nanti, sesuai kebutuhan. Untuk mengetahui informasi selengkapnya, lihat Mengaktifkan flag database untuk penyematan vektor.

Untuk mengetahui informasi tentang cara memantau ukuran indeks vektor, lihat Memantau indeks vektor.

Untuk memperbarui memori yang dialokasikan untuk indeks vektor pada instance, gunakan perintah berikut:

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 vektor Anda.

Perubahan ini akan langsung diterapkan setelah database dimulai ulang.

Membuat indeks vektor

Ada dua cara untuk membuat indeks vektor:

Gunakan sintaksis berikut untuk membuat indeks vektor menggunakan CREATE VECTOR INDEX:

CREATE
  VECTOR INDEX INDEX_NAME
ON TABLE_NAME(COLUMN_NAME)
USING
  SCANN[QUANTIZER = SQ8]
    DISTANCE_MEASURE
  = L2_SQUARED | COSINE | DOT_PRODUCT[NUM_LEAVES = INT_VALUE { '</var>' }}];

Berikut adalah opsi indeks:

  • USING SCANN: opsional. Menunjukkan jenis indeks yang akan digunakan. SCANN adalah satu-satunya nilai yang didukung.
  • QUANTIZER: opsional. Memetakan vektor berdimensi tinggi ke representasi terkompresi. SQ8 adalah satu-satunya nilai yang didukung.
  • DISTANCE_MEASURE: wajib diisi. Menentukan formula matematika yang akan digunakan untuk menghitung kemiripan dua vektor. Anda harus menetapkan ukuran jarak yang sama dalam parameter ini dengan jarak yang Anda tetapkan di opsi penelusuran approx_distance. Literal yang didukung adalah:
    • L2_SQUARED
    • COSINE
    • DOT_PRODUCT
  • NUM_LEAVES: opsional. Menentukan jumlah partisi (daun) yang akan dibuat. Ubah setelan ini dari setelan defaultnya hanya jika Anda memiliki pemahaman yang baik tentang penelusuran ANN dan set data Anda. Jumlah yang ditentukan tidak boleh lebih besar daripada jumlah sematan dalam tabel dasar.

Misalnya, untuk membuat indeks vektor, jalankan perintah berikut:

CREATE
  VECTOR INDEX vectorIndex
ON dbname.books(embeddings) DISTANCE_MEASURE = L2_SQUARED;

Saat pernyataan CREATE berjalan, tabel dasar akan dimasukkan ke mode hanya baca dan tidak ada DML yang diizinkan pada tabel dasar.

Anda dapat menggunakan sintaksis berikut untuk membuat indeks pada tabel yang ada:

ALTER TABLE tbl_name
  ADD VECTOR INDEX index_name(key_part)[index_option];

Misalnya, untuk membuat indeks pada tabel yang sudah ada:

ALTER TABLE t1 ADD VECTOR INDEX index1(j)
USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared NUM_LEAVES = 10;

Menyesuaikan indeks vektor

Bagian ini memberikan informasi lebih lanjut tentang parameter yang Anda gunakan untuk membuat indeks vektor. Untuk menyesuaikan indeks vektor, gunakan informasi ini untuk menentukan cara memengaruhi proses build.

Parameter Deskripsi Default Cakupan Dampak
cloudsql_vector_max_mem_size Memori yang dialokasikan untuk pelatihan indeks. Bervariasi Instance Memori yang tidak mencukupi dapat menyebabkan kegagalan build. Lihat Mengonfigurasi alokasi memori untuk indeks vektor.
innodb_ddl_threads Tingkat paralelisme untuk pelatihan dan pembuatan indeks. 4 Sesi Nilai yang lebih tinggi akan mengurangi waktu build, tetapi meningkatkan beban CPU. Tetapkan nilai ini ke jumlah CPU yang dapat Anda cadangkan tanpa memengaruhi operasi database secara negatif.

Pastikan cloudsql_vector_max_mem_size dikonfigurasi dengan tepat untuk pelatihan. Sesuaikan innodb_ddl_threads untuk menyeimbangkan waktu build dan beban CPU, dengan mempertimbangkan dampak pada operasi database serentak. Pantau pemakaian CPU selama build.

Menghapus indeks vektor

Untuk menghapus indeks vektor, gunakan pernyataan SQL DROP INDEX atau ALTER TABLE dengan nama indeks yang ingin Anda hapus, seperti yang ditunjukkan berikut:

DROP INDEX index_name ON books;

ALTER TABLE table_name
DROP INDEX index_name;

Memantau indeks vektor

Cloud SQL menyediakan tabel skema informasi berikut dengan informasi real-time tentang indeks vektor yang dimuat dalam memorinya:

  • information_schema.innodb_vector_indexes mencantumkan semua indeks vektor yang dibuka di memori setelah dimulai ulang.
  • information_schema.innodb_all_vector_indexes mencantumkan semua indeks vektor yang ada di instance (meskipun belum dibuka di memori).
  • information_schema.innodb_vector_indexes_memory memberikan informasi tentang penggunaan memori keseluruhan indeks vektor dalam instance.

Untuk mengetahui informasi yang lebih mendetail, lihat Skema informasi.

Untuk melihat informasi dalam tabel innodb_vector_indexes, jalankan perintah berikut:

SELECT * FROM information_schema.innodb_vector_indexes \ G;

Outputnya terlihat mirip dengan yang berikut ini:

 INDEX_NAME: t1_vec_index
 TABLE_NAME: test.t1
 INDEX_TYPE: TREE_SQ
 DIMENSION: 3
 DIST_MEASURE: COSINE
 STATUS: Ready
 STATE: INDEX_READY_TO_USE
 NUM_LEAVES: 10
 NUM_LEAVES_TO_SEARCH: 10
 QUERIES: 1
 MUTATIONS: 1
 TREE_MEMORY: 443

Langkah berikutnya