Halaman ini menjelaskan berbagai cara yang dapat Anda lakukan untuk membuat kueri embedding vektor. Untuk ringkasan penelusuran kesamaan ANN dan KNN, lihat penelusuran vektor.
Menelusuri perkiraan tetangga terdekat (ANN)
Untuk melakukan penelusuran ANN, gunakan
fungsi approx_distance
dalam klausa SELECT dan ORDER BY. Anda harus menggunakan klausa LIMIT dalam penelusuran ANN. Anda juga bisa mendapatkan nilai jarak dengan menempatkan approx_distance dalam daftar
SELECT.
Gunakan sintaksis berikut untuk kueri ANN:
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance(
embedding_name,
string_to_vector('[1,2,3]'),
'distance_measure=cosine,num_leaves_to_search=3')
dist
FROM table
ORDER BY dist
LIMIT limit_value;
Fungsi approx_distance menggunakan opsi berikut:
embedding: menggunakan nama kolom penyematan vektor dari tabel dasar.string_to_vectoratauvector_to_string: mengonversi vektor menjadi string dan string menjadi vektor agar vektor dapat dibaca manusia.distance_measure: menentukan ukuran jarak yang akan digunakan untuk penelusuran kemiripan vektor. Nilai ini harus cocok dengan nilai yang Anda tetapkan di parameterdistance_measuresaat Anda membuat indeks. Parameter ini wajib diisi. Kemungkinan nilai untuk parameter ini adalah:COSINEL2_SQUAREDDOT_PRODUCT
num_leaves_to_search: opsional. menentukan jumlah leaf yang akan diperiksa untuk penelusuran kemiripan vektor ANN. Jika Anda tidak menentukan jumlah daun, Cloud SQL akan menggunakan nilai yang dibuat berdasarkan ukuran tabel, jumlah daun dalam indeks vektor, dan faktor lainnya. Anda dapat melihat nilai ini diinformation_schema.innodb_vector_indexes. Sebaiknya sesuaikannum_leaves_to_searchuntuk mendapatkan keseimbangan terbaik antara kualitas dan performa penelusuran untuk beban kerja spesifik Anda. Jika ditingkatkan, hal ini akan memengaruhi performa, tetapi meningkatkan ingatan.
Contoh berikut menunjukkan cara menggunakan approx_distance untuk menemukan K baris terdekat teratas menggunakan ukuran jarak l2_squared dan mengurutkan hasil berdasarkan jarak.
# Ordering by distance
SELECT title
FROM books
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared')
LIMIT 4;
# Selecting the distance value
SELECT
approx_distance
(embedding, string_to_vector('[1,2,3]'),
'distance_measure=l2_squared') dist
FROM table
ORDER BY dist
LIMIT 4;
Memfilter hasil dari kueri approx_distance
Anda dapat menggunakan fungsi approx_distance dengan kondisi WHERE yang memfilter
hasil kueri dengan predikat non-vektor untuk melakukan pemfilteran setelahnya. Fungsi
approx_distance dievaluasi sebelum menerapkan filter, yang berarti
jumlah hasil yang ditampilkan tidak deterministik.
Misalnya, untuk kueri berikut:
SELECT id FROM products WHERE price < 100
ORDER BY approx_distance(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;
Fungsi approx_distance menampilkan 11 tetangga terdekat ke vektor kueri, terlepas dari harga. Dalam pemfilteran setelahnya, produk dengan harga
< 100 akan dipilih. Ada kemungkinan bahwa semua tetangga terdekat memiliki harga < 100, sehingga ada 11 hasil untuk kueri. Atau, jika tidak ada tetangga terdekat yang memiliki harga < 100, 0 baris akan ditampilkan.
Jika Anda memperkirakan bahwa filter dalam kondisi WHERE sangat selektif, penelusuran persis (KNN) adalah salah satu opsi untuk membantu memastikan bahwa jumlah baris yang ditampilkan cukup.
Opsi lainnya adalah menggunakan pemfilteran iteratif untuk memindai lebih banyak indeks penelusuran ANN.
Menggunakan pemfilteran iteratif untuk meningkatkan hasil penelusuran ANN
Anda dapat menggunakan pemfilteran iteratif saat filter selektif
dari klausa WHERE dalam kueri penelusuran ANN
menghasilkan lebih sedikit hasil daripada jumlah hasil yang ditentukan
dalam klausa LIMIT.
Misalnya, dalam kueri berikut, saat Anda mengaktifkan pemfilteran iteratif, kueri memindai lebih banyak indeks vektor dikurangi kumpulan hasil yang difilter pertama.
EXPLAIN FORMAT=TREE
SELECT * FROM t1 WHERE next_id BETWEEN 15 AND 100
ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared')
LIMIT 10;
EXPLAIN
-> Limit: 10 row(s) (rows=10)
-> Vector index loop with iterative filtering
-> Vector index scan on t1
-> Filter: (t1.next_id between 15 and 100)
-> Single-row index lookup on t1 using PRIMARY (id=t1.id)
Anda mengambil lebih banyak tetangga dari indeks vektor penelusuran secara iteratif
hingga maksimum yang dikonfigurasi (cloudsql_vector_iterative_filtering_max_neighbors)
tercapai. Semua kecocokan filter dihitung untuk LIMIT dan dihapus
dari pemindaian indeks vektor tambahan.
Mengaktifkan pemfilteran iteratif
Secara default, pemfilteran iteratif dinonaktifkan untuk semua sesi dan instance Cloud SQL.
Untuk mengaktifkan pemfilteran iteratif untuk sesi yang ada, gunakan pernyataan SQL berikut.
SET SESSION cloudsql_vector_iterative_filtering=on;
Anda juga dapat mengaktifkan pemfilteran iteratif secara global untuk semua sesi klien yang terhubung ke instance dengan menyetel tanda pada instance. Untuk menyetel flag pada instance, lihat Menyetel flag database.
Untuk mengetahui informasi selengkapnya tentang cara menyetel variabel sistem di tingkat sesi atau global, lihat Menggunakan Variabel Sistem dalam dokumentasi MySQL.
Menyesuaikan pemfilteran iteratif
Untuk mengontrol jumlah tetangga terdekat yang ditampilkan untuk kueri penelusuran ANN dengan pemfilteran iteratif diaktifkan, Anda dapat menggunakan variabel sistem global atau sesi cloudsql_vector_iterative_filtering_max_neighbors.
Anda dapat menggunakan konfigurasi ini untuk meningkatkan
jumlah tetangga terdekat yang diminta. Namun, untuk menghindari penyimpanan terlalu banyak hasil dalam memori, nilai maksimum untuk variabel ini adalah 1000.
Untuk menetapkan variabel ini untuk sesi, gunakan pernyataan SQL berikut:
SET cloudsql_vector_iterative_filtering_max_neighbors=600;
Defaultnya adalah 500, dan jumlah minimumnya adalah 10.
Batasan
Berikut adalah batasan penggunaan pemfilteran iteratif:
Tidak dijamin: saat Anda menggunakan pemfilteran iteratif, Cloud SQL akan mencoba menemukan jumlah hasil yang ditentukan dalam klausa
LIMIT, tetapi tidak menjamin bahwa jumlah tersebut akan ditemukan. Hal ini dapat terjadi jika jumlah maksimum tetangga (cloudsql_vector_iterative_filtering_max_neighbors) tercapai sebelumLIMITterpenuhi, atau jika tidak ada cukup baris yang cocok dengan filter dalam tabel.Kueri kompleks: pemfilteran iteratif hanya berfungsi jika predikat filter didorong ke bawah ke jalur akses tabel dasar. Fungsi ini tidak didukung untuk filter di atas tabel sementara; misalnya, tabel yang menggunakan klausa
HAVING. Dalam subkueri, hanya filter pada tabel dasar dalam subkueri itu sendiri yang dipertimbangkan untuk pemfilteran iteratif.
Memeriksa status penggantian pada penelusuran ANN
Ada kasus tertentu saat penelusuran ANN kembali ke penelusuran KNN. Hal ini mencakup:
- Tidak ada indeks vektor pada tabel dasar.
- Ada indeks vektor pada tabel dasar, tetapi indeks tersebut menggunakan
pengukuran jarak yang berbeda dari parameter
distance_measuredi opsi penelusuranapprox_distance. - Indeks vektor rusak atau tidak terlihat oleh transaksi saat ini.
LIMITyang ditentukan lebih besar dari 10000.- Tidak ada
LIMITyang ditentukan. - Kueri saat ini melibatkan lebih dari satu panggilan
approx_distancepada tabel dasar yang sama. - Pengoptimal menghitung bahwa penggunaan KNN lebih efisien.
Semua kasus ini mendorong peringatan kepada klien yang menunjukkan bahwa penelusuran persis telah dilakukan dan alasannya.
Gunakan perintah berikut di klien mysql untuk melihat status penggantian:
SHOW global status LIKE '%cloudsql_vector_knn_fallback%';
Jika Anda ingin menggunakan ANN dan ANN kembali ke KNN, kueri mungkin berjalan lebih lambat. Anda harus menemukan alasan mengapa ANN menggunakan penggantian dan menilai apakah perlu melakukan perubahan agar ANN digunakan.
Contoh: Membuat indeks vektor dan menjalankan kueri ANN
Panduan contoh berikut memberikan langkah-langkah untuk membuat indeks vektor dan menjalankan kueri ANN di Cloud SQL.
- 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.
Buat tabel di Cloud SQL 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);Sisipkan penyematan vektor ke dalam kolom.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));Lakukan commit perubahan.
commit;Buat indeks vektor menggunakan fungsi
L2_squareduntuk mengukur jarak.CREATE VECTOR INDEX vectorIndex ON dbname.books(embeddings) USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;Gunakan sintaksis berikut untuk melakukan penelusuran ANN dengan
LIMIT4 hasil penelusuran:SELECT title FROM books ORDER BY approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=l2_squared') LIMIT 4; SELECT approx_distance(embedding, string_to_vector('[1,2,3]'), 'distance_measure=cosine') dist FROM books ORDER BY dist LIMIT 4;
Menelusuri K tetangga terdekat (KNN)
Untuk melakukan penelusuran tetangga K-terdekat, gunakan
fungsi vector_distance
dengan opsi pengukuran jarak dan fungsi konversi vektor
(string_to_vector atau vector_to_string) dalam pernyataan SELECT. Gunakan sintaksis berikut:
SELECT vector_distance(string_to_vector('[1,2,3]'),
string_to_vector('[1,2,3]'),
'Distance_Measure=dot_product');
Ganti nilai [1,2,3] dengan nilai penyematan data Anda.
Contoh berikut menunjukkan cara menggunakan kueri ini dengan fungsi cosine_distance dan fungsi konversi vektor string_to_vector.
SELECT id,cosine_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY distance
LIMIT 10;
Mendapatkan jarak Kosinus dalam kueri KNN
Gunakan
fungsi cosine_distance Cloud SQL
untuk menghitung jarak menggunakan kosinus.
SELECT cosine_distance(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Mendapatkan jarak Dot Product dalam kueri KNN
Gunakan fungsi dot_product Cloud SQL
untuk menghitung jarak menggunakan produk titik.
SELECT dot_product(embedding, string_to_vector('[3,1,2]')) AS distance FROM books WHERE id = 10;
Mendapatkan jarak L2 kuadrat dalam kueri KNN
Gunakan fungsi
l2_squared_distance Cloud SQL
untuk menghitung jarak menggunakan L2 kuadrat.
SELECT
l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance
FROM books
WHERE id = 10;
Langkah berikutnya
- Baca ringkasan tentang penelusuran vektor di Cloud SQL.
- Pelajari cara mengaktifkan dan menonaktifkan penyematan vektor di instance Anda.
- Pelajari cara membuat embedding vektor.
- Pelajari cara membuat indeks vektor.
- Pelajari cara melakukan penelusuran pada embedding vektor.