Menelusuri dan memfilter dengan embedding vektor

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_vector atau vector_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 parameter distance_measure saat Anda membuat indeks. Parameter ini wajib diisi. Kemungkinan nilai untuk parameter ini adalah:
    • COSINE
    • L2_SQUARED
    • DOT_PRODUCT
  • num_leaves_to_search: opsional. menentukan jumlah leaf yang akan diperiksa untuk penelusuran kemiripan vektor ANN. Jika Anda tidak menentukan jumlah leaf, Cloud SQL akan menggunakan nilai yang dibuat berdasarkan ukuran tabel, jumlah leaf dalam indeks vektor, dan faktor lainnya. Anda dapat melihat nilai ini di information_schema.innodb_vector_indexes. Sebaiknya sesuaikan num_leaves_to_search untuk mendapatkan keseimbangan terbaik antara kualitas dan performa penelusuran untuk workload 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 pasca-kueri. 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(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. Mungkin semua tetangga terdekat memiliki harga < 100, sehingga ada 11 hasil untuk kueri. Atau, jika tidak ada tetangga terdekat yang memiliki harga < 100, maka 0 baris yang ditampilkan.

Jika Anda memperkirakan bahwa filter dalam kondisi WHERE sangat selektif, penelusuran persis (KNN) mungkin merupakan opsi yang lebih baik untuk memastikan jumlah baris yang ditampilkan cukup banyak.

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_measure di opsi penelusuran approx_distance.
  • Indeks vektor rusak atau tidak terlihat oleh transaksi saat ini.
  • LIMIT yang ditentukan lebih besar dari 10000.
  • 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 memunculkan 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 akan 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.

  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 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);
    
  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 vektor menggunakan fungsi L2_squared untuk mengukur jarak.

    CREATE
      VECTOR INDEX vectorIndex
    ON dbname.books(embeddings)
    USING SCANN QUANTIZER = SQ8 DISTANCE_MEASURE = l2_squared;
    
  6. Gunakan sintaksis berikut untuk melakukan penelusuran ANN dengan LIMIT 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