Menggunakan embedding vektor

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.

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.

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.

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

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

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

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

    commit;
    
  5. Buat 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. 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 dan TREE_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, dan DOT_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, dan TREE_AH.

    • BRUTE_FORCE adalah default untuk tabel yang memiliki kurang dari 10.000 baris
    • TREE_SQ adalah 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 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 untuk BRUTE_FORCE. Jika Anda menentukan jenis indeks TREE_SQ atau TREE_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 dan STATUS 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 dengan CURRENT_SIZE untuk mendapatkan ide tentang seberapa banyak indeks telah berubah sejak pembuatannya karena DML pada tabel dasar.
  • Kolom QUERIES dan MUTATIONS memberi Anda 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 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

  1. Hanya boleh ada satu kolom penyematan vektor per tabel.
  2. Hanya boleh ada satu indeks penelusuran vektor per tabel.
  3. Embedding 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 penghentian yang tidak bersih, Cloud SQL akan membuat ulang indeks penelusuran vektor secara otomatis.
    1. Saat membuat ulang indeks penelusuran vektor, tabel dasar bersifat hanya baca.
    2. Jika Cloud SQL tidak dapat memperoleh kunci pada tabel dalam waktu yang ditentukan, pembuatan ulang indeks secara otomatis mungkin akan gagal.
    3. Jika pembuatan ulang indeks otomatis gagal, Anda harus membuat ulang indeks secara manual.
  6. 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.
  7. Jika indeks penelusuran vektor ada di tabel, operasi DDL tidak diizinkan. Indeks penelusuran vektor harus dihapus sebelum melakukan operasi DDL pada tabel dasar.
  8. Penyematan 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" lain menggunakan AND atau OR. Predikat skalar di tabel dievaluasi setelah predikat vektor diterapkan.
  11. Predikat NEAREST..TO hanya didukung dalam pernyataan SELECT. Pernyataan DML lainnya tidak mendukung NEAREST..TO.
  12. Subkueri tidak didukung dengan NEAREST..TO. Batasan tidak dapat ditambahkan ke kunci utama tabel dasar jika indeks penelusuran vektor ada.
  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

    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:

  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