Menggunakan embedding vektor menggunakan Cloud SQL untuk MySQL

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.

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.

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.

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. Indeks TREE_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 ke on 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 total innodb_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.

  1. 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.

  2. 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
    );
    
  3. Masukkan embedding vektor ke dalam kolom.

    INSERT INTO books VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
    );
    
  4. Commit perubahan.

    commit;
    
  5. Membuat indeks penelusuran vektor. Jika Anda membuat indeks TREE_SQ atau TREE_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'
                                   );
    
  6. 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 dan TREE_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, dan DOT_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, dan TREE_AH.

    • BRUTE_FORCE adalah setelan default untuk tabel yang memiliki kurang dari 10.000 baris
    • TREE_SQ adalah setelan default untuk tabel yang memiliki 10.000 baris atau lebih

    Untuk menentukan jenis indeks TREE_AH atau TREE_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 untuk BRUTE_FORCE. Jika Anda menentukan jenis indeks TREE_SQ atau TREE_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 dan STATUS 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 dengan CURRENT_SIZE untuk mendapatkan gambaran tentang seberapa besar perubahan indeks sejak pembuatannya karena DML pada tabel dasar.
  • Kolom QUERIES dan MUTATIONS memberikan insight real-time tentang seberapa sibuk indeks.
  • Kolom INDEX_MEMORY dan DATASET_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

  1. Hanya boleh ada satu kolom penyematan vektor per tabel.
  2. Hanya boleh ada satu indeks penelusuran vektor per tabel.
  3. Penyematan vektor dapat memiliki hingga 16.000 dimensi.
  4. Partisi tingkat tabel InnoDB pada tabel dengan kolom penyematan vektor tidak didukung.
  5. Jika instance dimulai ulang dari penonaktifan yang tidak bersih, Cloud SQL akan otomatis membangun ulang indeks penelusuran vektor.
    1. Saat membangun kembali indeks penelusuran vektor, tabel dasar akan bersifat hanya baca.
    2. Jika Cloud SQL tidak dapat memperoleh kunci pada tabel dalam waktu yang ditentukan, pembuatan ulang otomatis indeks mungkin akan gagal.
    3. Jika pembuatan ulang indeks secara otomatis gagal, Anda harus membangun ulang indeks secara manual.
  6. 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.
  7. Jika indeks penelusuran vektor ada di tabel, operasi DDL tidak diizinkan. Indeks penelusuran vektor harus dihapus sebelum menjalankan operasi DDL pada tabel dasar.
  8. Embedding vektor tidak didukung pada tabel non-InnoDB atau pada tabel sementara.
  9. Kolom penyematan vektor tidak boleh berupa kolom yang dihasilkan.
  10. Predikat NEAREST..TO dapat digabungkan dengan predikat "skalar" lainnya menggunakan AND atau OR. Predikat skalar pada tabel dievaluasi setelah predikat vektor diterapkan.
  11. Predikat NEAREST..TO hanya didukung dalam pernyataan SELECT. Pernyataan DML lainnya tidak mendukung NEAREST..TO.
  12. Subquery tidak didukung dengan NEAREST..TO. Batasan tidak dapat ditambahkan ke kunci utama tabel dasar jika terdapat indeks penelusuran vektor.
  13. Pra-pemfilteran hanya dapat dilakukan melalui fungsi jarak dan dengan menggunakan ORDER BY dengan LIMIT.

    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:

  1. Selama pembuatan indeks, tabel dasar berada dalam mode hanya baca.
  2. Saat indeks dibuat ulang, kueri ANN terhadap indeks yang ada akan gagal.

Langkah selanjutnya