Menggunakan penyematan vektor (Pratinjau)

Halaman ini menjelaskan cara berinteraksi dengan Cloud SQL untuk membangun 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 embedding vektor ini bersama dengan data lainnya yang Anda simpan di Cloud SQL.

Penyimpanan embedding vektor

Anda dapat menggunakan Cloud SQL untuk MySQL guna menyimpan embedding vektor dengan membuat kolom embedding vektor dalam tabel. Kolom sematan vektor khusus dipetakan ke jenis data VARBINARY. Seperti data relasional lainnya dalam tabel, Anda dapat mengakses sematan vektor dalam tabel dengan jaminan transaksional yang ada. Tabel yang memiliki kolom penyematan vektor adalah tabel InnoDB biasa dan oleh karena itu mematuhi properti atomisitas, konsistensi, isolasi, dan ketahanan (ACID). Properti ACID hanya berbeda untuk pencarian indeks penelusuran vektor.

Pertimbangkan hal berikut saat menyiapkan tabel untuk embedding vektor:

  • Anda dapat membuat maksimal 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 Anda menentukan kolom. Embedding vektor memiliki batas atas 16.000 dimensi. Jika tersedia 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 batas ketat untuk jumlah penyematan vektor yang dapat Anda simpan dalam tabel, indeks penelusuran vektor memerlukan memori. Oleh karena itu, sebaiknya Anda menyimpan tidak lebih dari 10 juta embedding vektor dalam tabel.

  • Lihat juga daftar Batasan.

Replikasi berfungsi dengan cara yang sama untuk kolom sematan vektor seperti halnya untuk kolom MySQL InnoDB lainnya.

Cloud SQL mendukung penelusuran kesamaan menggunakan kueri penelusuran K-nearest neighbor (KNN) dan approximate nearest neighbor (ANN). Anda dapat menggunakan kedua jenis penelusuran vektor di instance Cloud SQL Anda. Anda dapat membuat indeks penelusuran vektor hanya 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 penggunaan fungsi jarak penelusuran vektor, lihat 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 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 disimpan 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 melakukan operasi Bahasa Manipulasi Data (DML) pada tabel dasar juga 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 me-roll back 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 bertingkat tidak didukung.

Mengonfigurasi instance untuk mendukung embedding vektor

Bagian ini menjelaskan cara mengonfigurasi instance Cloud SQL untuk mendukung penyimpanan, pengindeksan, dan kueri embedding vektor.

Instance edisi Cloud SQL Enterprise dan edisi Cloud SQL Enterprise Plus mendukung penyematan vektor.

Sebelum memulai

Mengaktifkan embedding vektor

Untuk mengaktifkan dukungan untuk embedding vektor, Anda harus mengonfigurasi tanda database MySQL.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

Ganti INSTANCE_NAME dengan nama instance yang ingin Anda aktifkan dukungan penyematan vektornya.

Di FLAGS, konfigurasi tanda MySQL berikut pada instance Anda:

  • cloudsql_vector: tetapkan tanda ini ke on untuk mengaktifkan penyimpanan embedding vektor dan dukungan penelusuran. Anda dapat membuat kolom penyematan 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 merupakan alokasi memori minimum. Untuk mengetahui 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 ke innodb_buffer_pool_size Anda. Buffer pool yang tersedia berkurang dengan jumlah yang sama. Nilai maksimum yang diizinkan untuk tanda 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 tanda, 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 Anda akan otomatis dimulai ulang agar perubahan konfigurasi diterapkan.

Untuk mengetahui informasi selengkapnya tentang cara mengonfigurasi flag database untuk MySQL, lihat Mengonfigurasi flag database.

Menonaktifkan embedding vektor

Untuk menonaktifkan penyematan vektor, setel tanda 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 dan indeks penelusuran vektor baru. Setelah Anda mengonfigurasi tanda statis ini, instance akan dimulai ulang secara otomatis agar perubahan konfigurasi dapat diterapkan.

Setelah instance dimulai ulang, Cloud SQL untuk MySQL akan melakukan hal berikut:

  • Menghapus semua indeks penelusuran vektor TREE_SQ yang dipertahankan dari disk persisten.
  • Menyimpan entri tabel kamus data untuk indeks penelusuran vektor yang telah dibuat. Namun, Cloud SQL untuk MySQL tidak membangun ulang indeks dan kueri penelusuran apa pun ke indeks ini akan menampilkan error.
  • Terus menyimpan embedding vektor dalam tabel dasar. Penyematan vektor tetap dapat diakses.

Jika Anda mengaktifkan kembali flag cloudsql_vector untuk instance, Cloud SQL akan mencoba membangun ulang indeks saat instance dimulai ulang berdasarkan entri dalam tabel kamus data.

Konfigurasi replika baca

Jika instance memenuhi kriteria versi pemeliharaan dan pengaktifan tanda, 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.

Dari segi dampak terhadap jeda replikasi, pembuatan dan pengelolaan indeks penelusuran vektor beroperasi dengan cara yang sama seperti indeks MySQL biasa.

Indeks penelusuran vektor tidak didukung pada replika bertingkat.

Contoh: Indeks dan kueri penelusuran vektor ANN

Panduan contoh berikut memberikan langkah-langkah untuk membuat indeks penelusuran vektor berbasis ANN dan kueri di Cloud SQL.

  1. Buat embedding vektor. Anda dapat membuat embedding vektor secara manual atau menggunakan API embedding 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 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 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 embedding teks apa pun dengan embedding vektor Cloud SQL. Namun, Anda harus menggunakan Text Embedding API 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("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 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]')
);

Meng-upsert 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]');

Bekerja dengan indeks penelusuran vektor

Secara default, Anda dapat melakukan penelusuran tetangga terdekat yang tepat, yang memberikan recall sempurna. Anda juga dapat menambahkan indeks untuk menggunakan penelusuran ANN, yang mengorbankan beberapa perolehan 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 workload 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 Anda memiliki lebih banyak titik data yang tersedia, Anda akan memiliki partisi dan pelatihan indeks yang lebih baik.
  • Pantau 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 di 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.
  • Umumnya, Anda dapat membiarkan jumlah partisi dihitung secara internal. Jika Anda memiliki kasus penggunaan di mana Anda ingin menentukan jumlah partisi, maka Anda harus memiliki setidaknya 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 mode hanya baca. Selama operasi ini, tidak ada DML yang diizinkan pada tabel dasar.

Persistensi, penonaktifan, dan dampak pada pemeliharaan

Hanya indeks penelusuran vektor yang menggunakan jenis TREE_SQ yang dipertahankan ke disk saat instance dimatikan dengan benar. Indeks penelusuran vektor yang menggunakan jenis TREE_AH dan BRUTE_FORCE hanya ada di dalam memori.

Setelah instance dimatikan dengan benar, Cloud SQL akan memuat ulang indeks penelusuran vektor saat instance dimulai ulang. Namun, setelah terjadi error atau penonaktifan yang tidak bersih, 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 terjadi:

  • Pembangunan ulang terjadi di latar belakang secara otomatis.
  • Selama pembangunan ulang, tabel dasar berada dalam mode hanya baca.
  • Jika pembuatan ulang otomatis tidak dapat mengunci tabel dalam periode waktu tunggu tertentu, pembuatan ulang akan gagal. Anda mungkin perlu membangun ulang indeks secara manual.

Waktu yang diperlukan untuk membangun ulang indeks dapat meningkatkan waktu yang diperlukan untuk mematikan, yang juga dapat meningkatkan waktu pemeliharaan dan update yang diperlukan untuk instance.

Mengonfigurasi alokasi memori untuk indeks penelusuran vektor

Cloud SQL membuat dan mengelola indeks penelusuran vektor dalam memori. Jenis indeks TREE_SQ tetap ada saat penonaktifan bersih dan dimuat ulang setelah instance dimulai ulang. Selama runtime, semua indeks penelusuran vektor harus tetap berada dalam memori.

Untuk memastikan Cloud SQL memiliki cukup memori yang tersedia untuk menyimpan semua indeks penelusuran vektor dalam memori, konfigurasi instance Cloud SQL dengan flag database cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size mengatur jumlah memori yang didedikasikan instance Cloud SQL untuk indeks penelusuran vektor. Saat Anda mengonfigurasi nilai untuk tanda, perhatikan hal berikut:

  • Nilai default dan minimum adalah 1 GB. Batas atas adalah 50% dari ukuran kumpulan buffer.
  • Setelah Anda menyetel tanda ini, instance Anda 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 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 memulai ulang instance Anda secara otomatis agar perubahan dapat diterapkan.

Menghitung memori yang diperlukan

Jumlah memori yang diperlukan indeks bergantung pada jenis indeks, jumlah sematan vektor, dan dimensi sematan. Ada dua persyaratan memori yang perlu dipertimbangkan:

  • Memori waktu build: memori yang diperlukan selama build indeks.
  • Memori indeks: memori yang ditempati indeks setelah indeks dibuat.

Untuk indeks tertentu, ukuran set datanya adalah memori yang diperlukan untuk membaca semua embedding vektor dalam memori. Mengingat setiap dimensi diwakili oleh float yang menggunakan memori 4 byte, Anda dapat menentukan dataset_size sebagai berikut:

dataset_size = <num_embeddings> * (4 * <dimensions>)

Misalnya, jika Anda memiliki satu juta embedding dengan 768 dimensi, dataset_size Anda adalah 3 GB.

Berdasarkan contoh sebelumnya, persyaratan memori untuk berbagai jenis indeks adalah sebagai berikut:

Jenis indeks Membangun memori waktu Memori indeks
TREE_SQ 4 GB 1 GB
TREE_AH 3,5 GB 3,5 GB
BRUTE_FORCE 3 GB 3 GB

Jika Anda 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 embedding vektor disimpan mengalami operasi DML, indeks penelusuran vektor akan diperbarui secara real time. Pembaruan ini mengubah jejak memori indeks, yang dapat mengecil 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.

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 mysql.create_vector_index dan mysql.alter_vector_index mendukung beberapa parameter yang dapat Anda tentukan dengan pasangan nilai kunci yang dipisahkan koma. Semua parameter fungsi mysql.create_vector_index 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 dari 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 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 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 membangun kembali indeks penelusuran vektor. Untuk menggunakan fungsi ini, indeks harus sudah ada. Anda mungkin ingin membangun ulang indeks untuk kasus penggunaan berikut:

  • Untuk membangun kembali indeks dengan opsi yang berbeda. Misalnya, Anda mungkin ingin menggunakan jenis indeks yang berbeda atau pengukuran jarak yang berbeda.
  • Untuk membangun ulang indeks karena tabel dasar telah mengalami perubahan DML yang signifikan. Misalnya, Anda perlu melatih ulang indeks penelusuran vektor berdasarkan data di tabel dasar.

Semua parameter untuk membangun kembali indeks sama dengan parameter yang tersedia untuk membuat indeks dan juga bersifat opsional. Jika Anda menentukan string kosong atau NULL saat membangun ulang indeks, indeks akan dibangun ulang berdasarkan parameter yang ditentukan pada saat pembuatan indeks. Jika tidak ada parameter yang diberikan pada saat pembuatan indeks, nilai parameter default akan digunakan.

Indeks penelusuran vektor yang ada tersedia selama operasi alter_vector_index. 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');

Mengkueri embedding vektor

Bagian ini memberikan contoh berbagai cara Anda dapat membuat kueri sematan vektor.

Melihat embedding vektor

SELECT vector_to_string(embedding) FROM books;

Mendapatkan penelusuran tetangga yang tepat untuk embedding vektor

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

Mendapatkan penelusuran tetangga perkiraan 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: tentukan jumlah partisi yang akan diselidiki untuk penelusuran vektor ANN. Jika Anda tidak menentukan jumlah partisi, penelusuran akan menggunakan nilai yang dibuat berdasarkan ukuran tabel, jumlah partisi dalam indeks penelusuran vektor, dan faktor lainnya.
  • num_neighbors: tentukan jumlah tetangga yang akan ditampilkan. Nilai ini menggantikan nilai yang ditetapkan pada saat pembuatan indeks penelusuran vektor.

Memfilter embedding vektor

Gunakan kolom tambahan sebagai predikat untuk menyesuaikan pemfilteran hasil kueri penyematan vektor. Misalnya, jika Anda 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 embedding 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 Perkalian Titik

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

Di tabel information_schema.innodb_vector_indexes, Anda dapat melihat 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 seberapa jauh 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 gambaran tentang seberapa besar perubahan indeks sejak dibuat karena DML pada tabel dasar.
  • Kolom QUERIES dan MUTATIONS memberikan insight real-time tentang seberapa sibuk indeks tersebut.
  • 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 sematan 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 ulang indeks penelusuran vektor, tabel dasar bersifat hanya baca.
    2. Jika Cloud SQL tidak dapat memperoleh kunci pada tabel dalam waktu yang ditentukan, maka pembangunan ulang indeks otomatis mungkin gagal.
    3. Jika pembangunan ulang indeks otomatis gagal, Anda harus membangun ulang indeks secara manual.
  6. Untuk menambahkan kolom penyematan vektor, tabel harus memiliki kunci utama. Cloud SQL tidak mendukung kunci utama jenis BIT, BINARY, VARBINARY, JSON, BLOB, TEXT, atau jenis data spasial. Kunci primer komposit tidak dapat menyertakan 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. Embedding vektor tidak didukung di tabel non-InnoDB atau di tabel sementara.
  9. Kolom sematan vektor tidak boleh berupa kolom yang dibuat.
  10. Predikat NEAREST..TO dapat digabungkan dengan predikat "skalar" lainnya dengan 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. Subkueri tidak didukung dengan NEAREST..TO. Batasan tidak dapat ditambahkan ke kunci utama tabel dasar jika ada indeks penelusuran vektor.
  13. Pemfilteran awal 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 didukung dengan fungsi NEAREST..TO dan jarak.

Memecahkan masalah

Jika terjadi kecelakaan, indeks akan dibangun ulang secara otomatis. Saat pembangunan ulang sedang berlangsung, ada dua batasan:

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

Langkah berikutnya