Praktik terbaik penelusuran vektor

Dokumen ini memberikan rekomendasi untuk mengoptimalkan performa penelusuran vektor di Spanner.

Memahami dasar-dasar Spanner

Untuk melakukan pengujian performa penelusuran vektor Spanner yang efektif, pahami dasar-dasar Spanner. Misalnya, menjalankan kembali kueri yang sama secara langsung dapat lebih cepat karena adanya cache. Untuk menguji performa pada aplikasi yang terutama menggunakan data hangat, lakukan pembacaan pemanasan terlebih dahulu.

Lihat panduan berikut:

Spanner memproses kueri secara paralel berdasarkan pemisahan database. Pengujian dengan beban kueri produksi yang berkelanjutan dapat mengaktifkan pemisahan berbasis beban, yang meningkatkan performa kueri melalui peningkatan paralelisme. Untuk meningkatkan paralelisme untuk beban mendatang, pertimbangkan untuk membagi terlebih dahulu database Anda, terutama untuk KNN.

Praktik terbaik penelusuran vektor

Dokumen ini menjelaskan praktik terbaik penelusuran vektor berikut:

Menganotasi kolom penyematan

Anotasikan kolom penyematan dengan vector_length. Anotasi ini memungkinkan pengoptimalan performa untuk penelusuran K-nearest neighbor (KNN) dan merupakan prasyarat untuk penelusuran approximate nearest neighbor (ANN).

Menggunakan kueri top-k

Untuk menemukan tetangga terdekat, gunakan klausa ORDER BY dengan LIMIT. Kueri top-k sangat dioptimalkan untuk penelusuran vektor. Hindari pemfilteran menurut nilai minimum jarak dalam klausa WHERE.

Misalnya, hal berikut tidak direkomendasikan:

SELECT d.DocId
FROM Documents AS d
WHERE COSINE_DISTANCE(d.DocEmbedding, @vector) < 1;

Sebagai gantinya, gunakan:

SELECT d.DocId
FROM Documents AS d
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

Penggunaan kueri top-k tidak hanya lebih sederhana karena menghilangkan penyesuaian nilai minimum jarak, tetapi juga memungkinkan pengoptimalan performa yang dikhususkan untuk penelusuran vektor.

Menggunakan literal SQL untuk klausa LIMIT

Jika batas top-k tetap, gunakan literal SQL, bukan parameter. Misalnya, gunakan LIMIT 10, bukan LIMIT @limit. Hal ini memberikan lebih banyak informasi kepada pengoptimal kueri Spanner untuk memilih rencana eksekusi kueri terbaik.

Menggunakan pemindaian berorientasi batch

Kueri penelusuran vektor sangat intensif dalam pemindaian. Untuk kueri KNN, pertimbangkan untuk menggunakan pemindaian berorientasi batch dengan petunjuk kueri scan_method=batch. Ini adalah metode pemindaian default untuk kueri ANN.

Menggunakan KNN untuk set data kecil

Jika KNN sudah cukup untuk anggaran latensi Anda, jangan buat indeks vektor. KNN lebih akurat, menghindari biaya pembuatan dan pemeliharaan indeks, serta dapat berperforma lebih baik daripada ANN jika jumlah baris input setelah pemfilteran apa pun kecil.

Mempercepat KNN yang difilter dengan indeks sekunder

Untuk meningkatkan performa kueri KNN yang difilter, buat indeks sekunder pada kolom pemfilteran. Misalnya, pertimbangkan kueri berikut:

SELECT d.DocId
FROM Documents AS d
WHERE Category = 'toy'
ORDER BY COSINE_DISTANCE(d.DocEmbedding, @vector)
LIMIT 10;

Jika jumlah dokumen per kategori kurang dari beberapa puluh ribu dan aplikasi Anda dapat menerima latensi kueri 100 md, buat indeks sekunder pada kolom Category. Simpan kolom DocEmbedding dalam indeks:

CREATE INDEX ON Documents(Category) STORING (DocEmbedding);

Pembuatan indeks ini membantu mempercepat kueri yang difilter.

Menggunakan ANN untuk set data besar

Jika jumlah baris besar setelah dievaluasi untuk filter, buat indeks vektor dan gunakan penelusuran ANN. Beberapa teknik dapat mempercepat pemfilteran dengan ANN:

  • Menyimpan kolom pemfilteran: Untuk mengaktifkan pemfilteran saat menjelajahi penelusuran vektor, simpan kolom pemfilteran dalam indeks vektor. Hal ini memungkinkan baris yang tidak memenuhi syarat dihapus lebih awal dalam eksekusi.

    CREATE VECTOR INDEX ON Documents(DocEmbedding) STORING(Category);
    
  • Kolom pemfilteran utama: Untuk mempercepat pemfilteran untuk kolom yang sangat selektif yang menghapus banyak hasil, atur kolom ini sebagai kolom utama tambahan dalam indeks vektor. Kueri yang menentukan persamaan persis (menggunakan operator =) untuk kunci tambahan ini akan dipercepat paling banyak. Menggunakan klausa IN untuk salah satu kunci tambahan ini tidak akan mencapai tingkat akselerasi yang sama.

    CREATE VECTOR INDEX ON Documents(DocEmbedding, Category);
    
  • Hindari menyimpan kolom besar atau menggunakannya sebagai kunci: Tindakan ini dapat mengurangi kualitas blok data untuk penyematan, yang dapat mengurangi efisiensi pembacaan. Sebagai alternatif, pertimbangkan untuk menggunakan kolom hash dalam indeks, dan gunakan kolom besar asli sebagai filter pasca-k teratas.

  • Buat indeks vektor yang difilter (parsial):Jika Anda hanya membuat kueri subset set data, dan kondisi pemfilteran menentukan subset tersebut, seperti Category = "Tech", buat indeks vektor yang difilter atau parsial.