Halaman ini menjelaskan berbagai cara untuk membuat kueri penyematan vektor. Untuk ringkasan penelusuran kemiripan 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_vector
atauvector_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_measure
saat membuat indeks. Parameter ini wajib diisi. Kemungkinan nilai untuk parameter ini adalah:COSINE
L2_SQUARED
DOT_PRODUCT
num_leaves_to_search
: opsional. menentukan jumlah daun yang akan diselidiki untuk penelusuran kemiripan vektor ANN. Jika Anda tidak menentukan jumlah daun, Cloud SQL akan menggunakan nilai yang dihasilkan 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_search
untuk mencapai keseimbangan terbaik antara kualitas dan performa penelusuran untuk beban kerja tertentu. Jika ditingkatkan, hal ini akan memengaruhi performa, tetapi meningkatkan recall.
Contoh berikut menunjukkan cara menggunakan approx_distance
untuk menemukan baris terdekat
K teratas menggunakan pengukuran jarak l2_squared
dan mengurutkan hasil menurut 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 pasca. Fungsi
approx_distance
dievaluasi sebelum menerapkan filter, yang berarti
jumlah hasil yang ditampilkan bersifat nondeterministik.
Misalnya, untuk kueri berikut:
SELECT id FROM products WHERE price < 100
ORDER BY approx(embedding, @query_vector,'distance_measure=cosine')
LIMIT 11;
Fungsi approx_distance
menampilkan 11 tetangga terdekat ke vektor kueri,
terlepas dari harganya. Dalam pemfilteran pasca, produk dengan harga
< 100 dipilih. Mungkin semua tetangga terdekat memiliki harga < 100, sehingga ada 11 hasil untuk kueri. Atau, jika tidak ada tetangga terdekat yang memiliki harga < 100, tidak ada baris yang ditampilkan.
Jika Anda mengantisipasi bahwa filter dalam kondisi WHERE
sangat selektif, penelusuran persis (KNN) mungkin merupakan opsi yang lebih baik untuk memastikan bahwa jumlah baris yang ditampilkan memadai.
Memeriksa status penggantian pada penelusuran ANN
Ada kasus tertentu saat penelusuran ANN kembali ke penelusuran KNN. Hal ini meliputi:
- Tidak ada indeks vektor di tabel dasar.
- Ada indeks vektor di tabel dasar, tetapi indeks ini menggunakan ukuran jarak yang berbeda dari parameter
distance_measure
di opsi penelusuranapprox_distance
. - Indeks vektor rusak atau tidak terlihat oleh transaksi saat ini.
LIMIT
yang ditentukan lebih besar dari 10.000.- Tidak ada
LIMIT
yang ditentukan. - Kueri saat ini melibatkan lebih dari satu panggilan
approx_distance
pada tabel dasar yang sama. - Pengoptimal menghitung bahwa penggunaan KNN lebih efisien.
Semua kasus ini akan mengirimkan peringatan ke 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 terjadinya fallback dan menilai apakah akan melakukan perubahan sehingga ANN digunakan sebagai gantinya.
Contoh: Membuat indeks vektor dan menjalankan kueri ANN
Contoh panduan berikut memberikan langkah-langkah untuk membuat indeks vektor dan menjalankan kueri ANN di Cloud SQL.
- 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 embedding vektor berdasarkan data baris.
Buat tabel di Cloud SQL 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);
Sisipkan penyematan vektor ke dalam kolom.
INSERT INTO books VALUES ((1, 'book title', string_to_vector('[1,2,3]')));
Lakukan commit pada perubahan.
commit;
Buat indeks vektor menggunakan fungsi
L2_squared
untuk 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
LIMIT
dari 4 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-nearest neighbors (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.