Ringkasan penelusuran vektor Spanner Omni

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.

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.

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 vektor

  • EUCLIDEAN_DISTANCE(): Mengukur jarak garis lurus terpendek antara dua vektor

  • DOT_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.

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 BY yang menggunakan fungsi jarak perkiraan.

  • Klausa LIMIT untuk 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_leaves dan num_leaves_to_search berdasarkan 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.