Penelusuran vektor di Spanner Omni adalah fitur bawaan berperforma tinggi yang memungkinkan penelusuran semantik dan pencocokan kemiripan pada data vektor berdimensi tinggi. Dengan menyimpan dan mengindeks embedding vektor secara langsung dalam database transaksional Anda, Spanner Omni menghilangkan kebutuhan akan database vektor terpisah dan pipeline ekstrak, transformasi, muat (ETL) yang kompleks.
Topik dalam dokumen ini berlaku untuk Spanner Omni dengan cara yang sama seperti penerapannya pada Spanner.
Cara kerja penelusuran vektor
Penelusuran vektor memungkinkan Anda menemukan item yang serupa secara semantik dengan merepresentasikan data sebagai vektor numerik (embedding). Spanner Omni mendukung dua metode penelusuran utama:
K-tetangga terdekat (KNN): Melakukan penelusuran yang tepat dengan menghitung jarak antara kueri dan setiap vektor dalam set data. Metode ini memberikan recall tertinggi, tetapi dapat memakan biaya komputasi yang besar untuk set data besar.
Tetangga terdekat perkiraan (ANN): Menggunakan indeks vektor untuk menemukan kecocokan dengan cepat di seluruh set data besar. Model ini mengorbankan sedikit akurasi (recall) untuk mendapatkan peningkatan kecepatan dan skalabilitas.
Penelusuran vektor sangat efektif jika dikombinasikan dengan fitur lain:
| Kombinasi | Manfaat |
|---|---|
| Penelusuran vektor dengan pemfilteran SQL | Gabungkan penelusuran vektor dengan filter secara efisien (misalnya, "Temukan gambar serupa dengan kategori = 'sepatu' dan harga < 100"). |
| Penelusuran vektor + penelusuran teks lengkap | Gabungkan kemiripan semantik dengan presisi kata kunci menggunakan penggabungan peringkat timbal balik (RRF) untuk meningkatkan relevansi penelusuran. |
| Vektor + grafik | Gunakan penelusuran vektor untuk menemukan titik entri (node) yang relevan dalam grafik properti, lalu telusuri hubungan yang kompleks. |
Untuk mengetahui informasi selengkapnya, lihat Ringkasan penelusuran vektor Spanner dalam dokumentasi Spanner.
Melakukan penelusuran K-nearest neighbors
Spanner Omni mendukung penelusuran K-nearest neighbors (KNN) menggunakan fungsi jarak bawaan. Anda dapat memberikan embedding vektor sebagai parameter input untuk menemukan vektor terdekat dalam ruang berdimensi N.
Fungsi jarak berikut tersedia:
COSINE_DISTANCE(): Mengukur kosinus sudut antara dua vektorEUCLIDEAN_DISTANCE(): Mengukur jarak garis lurus terpendek antara dua vektorDOT_PRODUCT(): Menghitung kosinus sudut yang dikalikan dengan hasil kali besaran vektor (ideal untuk data yang dinormalisasi)
Untuk mengetahui informasi selengkapnya, lihat Melakukan penelusuran kesamaan vektor dengan menemukan K-nearest neighbors dalam dokumentasi Spanner.
Memilih fungsi jarak vektor terbaik
Memilih fungsi jarak yang sesuai bergantung pada data dan model yang digunakan untuk membuat penyematan.
| Fungsi | Deskripsi | Hubungan dengan peningkatan kemiripan |
|---|---|---|
| Perkalian titik | Menghitung kosinus sudut yang dikalikan dengan hasil perkalian besaran vektor yang sesuai. | Meningkatkan |
| Jarak kosinus | Mengukur kosinus sudut antara dua vektor (1 - kemiripan kosinus). | Menurunkan |
| Jarak Euclidean | Mengukur jarak garis lurus antara dua vektor. | Menurunkan |
Jika sematan Anda dinormalisasi (magnitudo = 1,0), DOT_PRODUCT() biasanya merupakan pilihan yang efisien. Untuk data yang tidak dinormalisasi, lakukan eksperimen dengan
COSINE_DISTANCE() atau EUCLIDEAN_DISTANCE() untuk menentukan mana yang menghasilkan
hasil yang lebih baik untuk kasus penggunaan Anda.
Untuk mengetahui informasi selengkapnya, lihat Memilih fungsi jarak vektor dalam dokumentasi Spanner.
Tetangga terdekat perkiraan (ANN)
Penelusuran ANN dirancang untuk set data yang sangat besar di mana penelusuran KNN yang tepat menjadi terlalu lambat atau mahal. Fitur ini menggunakan indeks vektor untuk memberikan hasil yang cepat dengan sedikit penurunan perolehan.
Tanpa pekerja komputasi khusus, penelusuran ANN di Spanner Omni mendukung set data hingga 1 juta vektor untuk vektor dengan panjang hingga 128 dimensi. Jika vektor Anda memiliki lebih banyak dimensi, jumlah vektor yang didukung akan berkurang secara proporsional. Spanner Omni mendukung tabel yang lebih besar saat Anda men-deploy pekerja untuk membuat indeks vektor. Untuk mengetahui informasi selengkapnya, lihat Membuat dan mengelola indeks vektor.
Melakukan penelusuran ANN dengan indeks vektor
Untuk melakukan penelusuran ANN, gunakan fungsi jarak perkiraan seperti
APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE(), atau
APPROX_DOT_PRODUCT(). Fungsi ini memerlukan:
Indeks vektor yang ada di kolom embedding.
Klausul
ORDER BYyang menggunakan fungsi jarak perkiraan.Klausa
LIMITuntuk menentukan jumlah hasil.
Untuk mengetahui informasi selengkapnya, lihat Menemukan perkiraan tetangga terdekat (ANN) dan membuat kueri embedding vektor dalam dokumentasi Spanner.
Membuat dan mengelola indeks vektor
Saat membuat indeks vektor, tentukan vector_length kolom sematan Anda dan gunakan klausa STORING untuk menyertakan kolom tambahan agar pemfilteran lebih cepat.
Berikut adalah contoh cara membuat indeks vektor:
CREATE VECTOR INDEX INDEX_NAME
ON TABLE_NAME(EMBEDDING_COLUMN)
OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);
Untuk mengetahui informasi selengkapnya, lihat Membuat dan mengelola indeks vektor dalam dokumentasi Spanner.
Membuat indeks vektor pada tabel besar yang melampaui batas dalam Approximate nearest neighbors (ANN) memerlukan pekerja komputasi khusus untuk mengurangi beban pemrosesan dari server Spanner Omni Anda. Untuk mengetahui informasi selengkapnya, lihat Men-deploy dan mengelola worker.
Menggunakan pengambilan sampel saat membuat indeks vektor
Untuk set data besar—seperti tabel dengan puluhan juta baris atau lebih—Anda dapat mengurangi waktu pembuatan indeks vektor dengan menentukan persentase pengambilan sampel. Gunakan opsi clustering_sampling_percentage dalam pernyataan CREATE VECTOR INDEX untuk mengambil sampel subset set data saat Anda membuat pohon indeks awal.
Sebagai panduan umum, targetkan minimal 50 baris yang disampel per daun. Misalnya,
untuk set data 10 juta baris dengan 10.000 daun, rasio pengambilan sampel 5%
(clustering_sampling_percentage = 5) mengambil sampel 500.000 baris, atau 50 baris per
daun, seperti yang ditunjukkan contoh berikut:
CREATE VECTOR INDEX VectorIndex
ON BaseTable(Embedding)
WHERE Embedding IS NOT NULL
OPTIONS (
tree_depth = 3,
num_leaves = 10000,
num_branches = 100,
leaf_scatter_factor = 32,
distance_type = 'COSINE',
min_branch_splits = 10,
min_leaf_splits = 10,
clustering_sampling_percentage = 5
);
Dibandingkan dengan membuat indeks pada set data lengkap tanpa pengambilan sampel, pengambilan sampel meningkatkan latensi kueri dan penggunaan CPU per kueri untuk target perolehan yang sama. Meningkatkan persentase pengambilan sampel akan meningkatkan waktu pembuatan indeks, tetapi mengurangi latensi kueri dan biaya CPU per kueri. Pilih persentase pengambilan sampel yang menyeimbangkan waktu pembuatan indeks dan performa kueri berdasarkan resource komputasi yang tersedia untuk pembuatan indeks.
Praktik terbaik pengindeksan vektor
Untuk mempertahankan performa dan perolehan penelusuran yang tinggi:
Sesuaikan opsi indeks: Sesuaikan
num_leavesdannum_leaves_to_searchberdasarkan ukuran data dan persyaratan performa Anda.Bangun ulang secara berkala: Bangun ulang indeks jika distribusi vektor Anda berubah secara signifikan dari waktu ke waktu.
Gunakan pemfilteran secara efektif: Simpan kolom yang sering difilter dalam indeks untuk meningkatkan efisiensi penelusuran.
Untuk mengetahui informasi selengkapnya, lihat Praktik terbaik pengindeksan vektor dalam dokumentasi Spanner.