Penelusuran vektor di Cloud SQL untuk MySQL

Halaman ini menjelaskan cara penerapan penelusuran vektor di instance Cloud SQL untuk MySQL. Cloud SQL memungkinkan Anda menyimpan embedding vektor, membuat indeks vektor, dan melakukan penelusuran vektor bersama dengan data tersimpan lainnya.

Penyimpanan embedding vektor

Anda menyimpan embedding vektor dalam tabel yang mematuhi properti atomicity, consistency, isolation, dan durability (ACID). Seperti data relasional lainnya dalam tabel, Anda dapat mengakses embedding vektor dalam tabel dengan semantik transaksional yang ada.

Untuk membuat pemetaan antara baris tabel dan representasi vektor, Anda perlu membuat kolom di tabel untuk menyimpan embedding vektor. Kolom harus menggunakan jenis data VECTOR. Kolom embedding vektor hanya dapat menyimpan embedding vektor yang menggunakan dimensi yang sama persis dengan yang Anda tentukan saat menentukan kolom. Tidak ada batasan jumlah baris dalam tabel tempat Anda menyimpan embedding vektor.

Jika memiliki penyimpanan dan memori yang cukup di instance Cloud SQL, Anda dapat memiliki beberapa tabel dengan kolom embedding vektornya sendiri.

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

Untuk mengetahui daftar batasan dan pembatasan untuk tabel, kolom, dan pernyataan DML embedding vektor, lihat Batasan.

Indeks vektor

Anda harus menggunakan indeks vektor untuk melakukan penelusuran kesamaan ANN pada embedding vektor Anda. Cloud SQL membuat indeks vektor menggunakan algoritma Scalable Nearest Neighbors (ScANN).

Indeks vektor memiliki persyaratan berikut:

  • Anda hanya dapat membuat satu indeks vektor per tabel.
  • Jika memiliki beberapa tabel dengan embedding vektor di instance, Anda dapat membuat indeks vektor untuk setiap tabel.
  • Jika membuat indeks vektor, Anda tidak dapat menambahkan batasan ke kunci utama tabel yang diindeks.

Untuk kualitas penelusuran yang lebih baik, buat indeks vektor hanya setelah memuat sebagian besar data Anda di tabel dasar. Jika Anda memiliki kurang dari 1.000 embedding dalam tabel dasar, pembuatan indeks akan gagal.

Saat memutuskan apakah akan membuat indeks vektor, jika Anda memiliki sedikit baris, pertimbangkan apakah Anda dapat melakukan penelusuran KNN. Keputusan untuk menggunakan penelusuran KNN atau ANN juga bergantung pada jumlah dimensi pada embedding vektor. Jumlah embedding yang lebih besar mungkin memerlukan indeks vektor.

Untuk mengetahui daftar batasan dan pembatasan indeks vektor, lihat Batasan. Untuk mengetahui informasi tentang cara membuat indeks vektor, lihat Membuat dan mengelola indeks vektor.

Pembaruan indeks vektor

Cloud SQL mengupdate indeks vektor secara real time. Setiap transaksi yang melakukan operasi bahasa pengolahan data (DML) pada tabel dasar juga menyebarkan perubahan ke indeks vektor terkait. Indeks vektor berperilaku sama seperti indeks sekunder lainnya pada tabel. Indeks vektor sepenuhnya konsisten secara transaksional dan mematuhi ACID. Jika Anda melakukan rollback transaksi, perubahan rollback yang sesuai juga akan terjadi di indeks vektor.

Replikasi indeks vektor

Cloud SQL mereplikasi indeks vektor ke semua replika baca, termasuk untuk replika bertingkat. Saat Anda membuat replika baca baru dari instance utama yang memiliki embedding vektor, replika baca akan mewarisi setelan embedding vektor dari instance utama. Untuk replika baca yang ada, Anda harus mengaktifkan dukungan embedding vektor di setiap replika.

Dalam hal dampak terhadap jeda replikasi, pembuatan dan pemeliharaan indeks vektor beroperasi dengan cara yang sama seperti indeks MySQL reguler.

Persistensi, penonaktifan, dan dampak pada pemeliharaan

Indeks vektor dipertahankan dengan cara yang sama seperti tabel dasar, dengan dukungan ACID penuh. Indeks vektor selalu sinkron dengan data tabel dasarnya, dan memiliki visibilitas, isolasi, dan keamanan error yang sama. Tidak ada dampak pada indeks vektor saat instance dinonaktifkan atau menerima pemeliharaan.

Pemeliharaan indeks

Setelah operasi DML yang ekstensif dilakukan pada tabel dasar, indeks vektor yang Anda latih pada data awal (pada saat pembuatan indeks) mungkin tidak mencerminkan status baru. Hal ini dapat memengaruhi kualitas penelusuran.

Ada dua bagian dalam indeks:

  • Hierarki indeks. Model ini dibuat dengan melatih data yang ada. Nilai ini tidak akan berubah selama masa aktif indeks.
  • Daun indeks. Tabel ini berisi semua baris data. Leaf indeks tidak pernah tidak sinkron.

Pohon indeks mungkin menjadi kurang efisien setelah sejumlah besar pernyataan DML dijalankan karena baris berpindah dari satu daun ke daun lainnya. Untuk memuat ulang pohon indeks, Anda perlu membangun ulang indeks.

Operasi DDL yang tidak didukung pada tabel dengan indeks vektor

Operasi bahasa definisi data (DDL) berikut tidak didukung untuk tabel yang memiliki indeks vektor.

  • Operasi alter table yang memerlukan algoritma penyalinan
  • Mengubah operasi tabel yang mengharuskan tabel dibuat ulang
  • Menghapus atau mengubah kunci utama
  • Memindahkan tabel ke tablespace umum

Cloud SQL menyediakan fungsi jarak vektor yang Anda gunakan untuk melakukan penelusuran kesamaan vektor perkiraan tetangga terdekat (ANN) dan K-nearest neighbors (KNN) pada instance Anda. Saat Anda menjalankan kueri, vektor kueri akan dibandingkan dengan vektor dalam set data Anda. Fungsi jarak menghitung jarak antara vektor menggunakan metrik kesamaan seperti kosinus. Vektor dengan jarak terpendek di antaranya adalah yang paling mirip dan ditampilkan dalam hasil penelusuran.

Cloud SQL menggunakan fungsi berikut untuk mengukur jarak antara vektor dalam penelusuran vektor saat Anda melakukan penelusuran vektor ANN dan KNN:

  • Cosine: mengukur kosinus sudut antara dua vektor. Nilai yang lebih kecil menunjukkan kesamaan yang lebih besar antara vektor.
  • Perkalian titik: menghitung kosinus sudut dikalikan dengan perkalian magnitudo vektor yang sesuai.
  • Jarak kuadrat L2: mengukur jarak Euclidean antara dua vektor dengan menambahkan jarak kuadrat pada setiap dimensi.

Penelusuran vektor KNN adalah metode penelusuran yang lebih disukai saat Anda memerlukan hasil yang tepat atau ingin menambahkan pemfilteran selektif. Penelusuran KNN melakukan komputasi jarak vektor kueri dengan setiap embedding dalam set data untuk menemukan tetangga terdekat. Penelusuran KNN di Cloud SQL memberikan perolehan yang sempurna. Penelusuran KNN tidak menggunakan indeks vektor, sehingga merupakan opsi yang baik saat bekerja dengan set data yang lebih kecil.

Untuk melakukan penelusuran KNN, Anda menggunakan fungsi vector_distance yang menggunakan dua vektor sebagai input: vektor kueri (yang Anda telusuri) dan vektor kandidat dari set data Anda. Fungsi ini menghitung jarak antara kedua vektor tersebut. Anda menggunakan vector_distance dalam pernyataan SELECT. Untuk mengetahui informasi selengkapnya, lihat Menelusuri K-nearest neighbors (KNN).

Jika mendapati bahwa KNN tidak berperforma baik, Anda dapat membuat indeks vektor nanti dan terus menggunakan approx_distance di aplikasi Anda untuk penelusuran ANN.

Penelusuran vektor ANN adalah jenis penelusuran yang lebih disukai jika efisiensi kueri menjadi perhatian. Metode ini mempercepat penelusuran kesamaan dengan menghitung jarak antara vektor kueri Anda dan hanya sebagian vektor dalam set data Anda. Untuk melakukannya, Cloud SQL mengatur data ke dalam cluster atau partisi, lalu memfokuskan penelusuran pada cluster yang paling dekat dengan kueri. Penelusuran ANN memerlukan indeks vektor. Indeks ini memprioritaskan kecepatan penelusuran daripada perolehan yang sempurna. Di Cloud SQL, jenis indeks TREE_SQ digunakan untuk penelusuran ANN.

Untuk melakukan penelusuran ANN, Anda menggunakan fungsi approx_distance dengan opsi pengukuran jarak. Anda menggunakan approx_distance dalam daftar ORDER BY atau SELECT dan klausa LIMIT diizinkan untuk membatasi hasil penelusuran. Anda juga dapat menambahkan klausa WHERE untuk melakukan pemfilteran pascaproses hasil penelusuran Anda. Jika Anda ingin memiliki kontrol yang lebih besar atas jumlah hasil yang ditampilkan saat melakukan penelusuran ANN dengan filter, Anda dapat menggunakan pemfilteran iteratif. Dengan pemfilteran iteratif, kueri penelusuran Anda dapat menampilkan lebih banyak hasil penelusuran dengan memindai lebih banyak indeks vektor hingga jumlah tetangga yang diinginkan ditemukan.

Anda dapat mengaktifkan pemfilteran iteratif untuk kueri penelusuran dengan menetapkan flag cloudsql_vector_iterative_filtering ke ON di tingkat sesi untuk setiap klien atau tingkat global untuk semua klien yang terhubung ke instance.

Untuk mengetahui informasi selengkapnya, lihat Menelusuri approximate nearest neighbor (ANN).

Ada beberapa kasus saat penelusuran ANN beralih ke penelusuran KNN. Untuk mengetahui informasi selengkapnya, lihat Memeriksa status penggantian untuk penelusuran ANN.

Perbedaan dukungan vektor di versi Cloud SQL untuk MySQL

Cloud SQL untuk MySQL memperkenalkan dukungan untuk penelusuran vektor di versi 8.0.36 dan yang lebih baru. Mulai Cloud SQL untuk MySQL versi 9.7, Cloud SQL telah memodifikasi kemampuan penelusuran vektor tertentu agar terintegrasi lebih baik dengan dukungan vektor dan fungsi penyimpanan yang dikembangkan komunitas yang diperkenalkan di MySQL 9.0 yang dikembangkan komunitas.

Tabel berikut memberikan perbandingan versi Cloud SQL untuk MySQL yang menunjukkan pengaruh perbedaan versi terhadap penggunaan penelusuran vektor di Cloud SQL untuk MySQL.

Area dukungan Cloud SQL untuk MySQL 8.4 dan yang lebih lama Cloud SQL untuk MySQL 9.7 dan yang lebih baru
Pengaktifan vektor Untuk menambahkan embedding vektor ke database MySQL dan menggunakan penelusuran vektor, Anda harus menetapkan flag cloudsql_vector ke on untuk instance Cloud SQL. Jika ingin membuat indeks vektor dan melakukan penelusuran ANN, Anda harus menetapkan flag cloudsql_vector ke on.
Kolom embedding vektor dalam tabel Tabel hanya dapat memiliki satu kolom embedding vektor. Anda dibatasi untuk memiliki satu kolom embedding vektor per tabel hanya jika Anda membuat indeks pada tabel. Jika Anda tidak membuat indeks pada tabel, tabel tersebut dapat memiliki beberapa kolom embedding vektor.
Penggunaan COMMENT dan CONSTRAINT untuk mengidentifikasi kolom embedding vektor Untuk membedakan kolom embedding vektor dari kolom lain, Cloud SQL menambahkan anotasi COMMENT khusus dan aturan CONSTRAINT ke kolom. Batasan diperlukan untuk validasi input, dan anotasi kolom embedding vektor terlihat sebagai komentar. Anda tidak dapat mengubah atau menghapus komentar atau batasan. Anotasi COMMENT dan aturan CONSTRAINT tidak lagi digunakan untuk mengidentifikasi kolom embedding vektor di Cloud SQL untuk MySQL 9.7.
Batas dimensi Embedding vektor dibatasi hingga 16.000 dimensi tanpa default. Embedding vektor dibatasi hingga 16.383 dimensi dengan default 2.048.
Format penyimpanan vektor Format VARBINARY Format penyimpanan berbasis komunitas
Sintaksis untuk mendeklarasikan jenis data vektor VECTOR(VECTOR_DIMENSIONS)
USING VARBINARY
VECTOR(VECTOR_DIMENSIONS)
[USING VARBINARY]
Perbedaan fungsi konversi Output fungsi vector_to_string dicetak sebagai nilai keseluruhan. Output fungsi vector_to_string dirender dalam notasi ilmiah, yang merupakan standar komunitas.

Batasan

Berikut adalah batasan yang berlaku untuk semua versi Cloud SQL yang mendukung vektor:

  • Hanya boleh ada satu indeks vektor per tabel.
  • Kolom embedding vektor tidak boleh berupa kolom yang dihasilkan.
  • Partisi tingkat tabel pada tabel dengan kolom embedding vektor tidak didukung.
  • Kunci utama yang menggunakan jenis data BIT, BINARY, VARBINARY, JSON, BLOB, TEXT, atau data spasial tidak didukung untuk indeks vektor. Kunci utama gabungan juga tidak dapat menyertakan salah satu jenis ini.
  • Jika ada indeks vektor, Anda tidak dapat menambahkan batasan ke kunci utama tabel dasar.
  • Jika indeks vektor ada di tabel, ada operasi DDL yang tidak dapat Anda lakukan. Untuk mengetahui informasi selengkapnya, lihat Operasi DDL yang tidak didukung pada tabel dengan indeks vektor.

Batasan berikut berlaku untuk kueri penelusuran vektor:

  • Fungsi approx_distance hanya dapat digunakan dalam daftar ORDER BY atau SELECT.
  • Predikat yang melibatkan tabel dasar dapat digunakan dalam kondisi WHERE yang dikombinasikan dengan ekspresi approx_distance dalam daftar ORDER BY atau SELECT. Predikat kondisi WHERE dievaluasi setelah fungsi vektor approx_distance dievaluasi.

Langkah berikutnya