Bagikan melalui


Kuantisasi produk untuk pencarian vektor di Azure DocumentDB

Kuantisasi produk (PQ) adalah teknik yang kuat di Azure DocumentDB yang secara signifikan mengompresi penyematan vektor dimensi tinggi yang digunakan dalam pencarian vektor. Kompresi ini mengurangi penggunaan memori dan mempercepat pencarian tetangga terdekat, meningkatkan efisiensi untuk himpunan data vektor besar. Meskipun PQ menawarkan manfaat untuk kecepatan dan skala, PQ mungkin mengorbankan akurasi.

Keuntungan

  • Penyimpanan Berkurang: PQ sangat menurunkan penyimpanan yang diperlukan untuk indeks vektor dibandingkan dengan vektor presisi penuh (float32), yang mengarah ke penghematan biaya besar untuk himpunan data besar.
  • Pencarian Lebih Cepat: Bekerja dengan vektor terkompresi memungkinkan sistem untuk menghitung jarak dan menemukan tetangga terdekat potensial jauh lebih cepat daripada dengan vektor presisi penuh.
  • Peningkatan Skalabilitas: Overhead memori yang lebih rendah memungkinkan penskalaan pencarian vektor untuk menangani penyematan dimensi yang lebih besar dan lebih tinggi dalam kluster Anda.

Cara kerjanya

Kuantisasi produk membagi ruang vektor dimensi tinggi menjadi beberapa subspace dimensi yang lebih rendah. Setiap subspace kemudian diukur secara independen menggunakan algoritma pengklusteran (biasanya k-means). Pusat setiap kluster mewakili semua vektor di dalamnya. Setiap vektor asli kemudian diwakili oleh kode pendek ID kluster miliknya di setiap subspace.

Menggunakan kuantisasi Produk

Untuk membuat indeks vektor dengan Kuantisasi produk, gunakan createIndexes perintah dengan cosmosSearchOptions menentukan "compression": "pq" dan "kind" : "vector-diskann":

{
    "createIndexes": "<collection_name>",
    "indexes": [
        {
            "name": "<index_name>",
            "key": {
                "<path_to_property>": "cosmosSearch"
            },
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "<string_value>", // "COS", "L2"
                "dimensions": <integer_value>, // Max 16,000
                "compression": "pq",
                "pqCompressedDims": <integer_value>, // Dimensions after compression (< original)
                "pqSampleSize": <integer_value>    // Samples for centroid generation
            }
        }
    ]
}
Bidang Tipe Description
compression string Atur ke "pq" untuk mengaktifkan Kuantisasi produk.
pqCompressedDims bilangan bulat Dimensi setelah kompresi PQ (harus kurang dari dimensi asli). Dihitung secara otomatis jika dihilangkan. Rentang: 1-8000.
pqSampleSize bilangan bulat Jumlah vektor sampel untuk pelatihan sentroid PQ. Nilai yang lebih tinggi berarti kualitas yang lebih baik tetapi waktu build yang lebih lama. Bawaan: 1000. Rentang: 1000-100000.

Nota

Kuantisasi produk saat ini hanya didukung dengan vector-diskann jenis indeks.

Nota

Untuk hasil terbaik, buat indeks PQ setelah koleksi Anda memiliki data. Jika koleksi kosong, sistem menggunakan vektor acak untuk sentroid awal. Jika jumlah dokumen kurang dari pqSampleSize, data pelatihan diisi dengan data acak dalam rentang data vektor Anda yang ada.

Bagaimana dimensi terkompresi diatur

Jika Anda tidak menentukan pqCompressedDims, itu secara otomatis menentukan berdasarkan vektor dimensionsasli :

Rentang Dimensi Asli pqCompressedDims
[0 - 32) dimensi / 2
[32 - 64) 16
[64 - 128) 32
[128 - 512) 64
[512 - 1536) 96
di atas 1536 128

Membuat indeks PQ

db.runCommand(
{
    "createIndexes": "your_vector_collection",
    "indexes": [
        {
            "key": { "v": "cosmosSearch" },
            "name": "diskann_pq_index",
            "cosmosSearchOptions": {
                "kind": "vector-diskann",
                "similarity": "COS",
                "dimensions": 1536,
                "compression": "pq",
                "pqCompressedDims": 96,
                "pqSampleSize": 2000
            }
        }
    ]
} )

Meningkatkan pencarian dengan Oversampling

Pemadatan PQ dapat menyebabkan kehilangan presisi dalam perhitungan jarak. Untuk mengurangi hal ini, Azure DocumentDB menawarkan oversampling parameter di $search operator.

Faktor oversampling (float dengan minimal 1) menentukan berapa banyak lebih banyak vektor kandidat yang akan diambil dari indeks terkompresi daripada k (jumlah hasil yang diinginkan). Kandidat tambahan ini digunakan untuk menyempurnakan pencarian menggunakan vektor presisi penuh asli, meningkatkan akurasi teratas k akhir. Misalnya, untuk mendapatkan 10k (=10) vektor yang paling mirip, sebuah praktik terbaik adalah dengan mengatur oversampling ke nilai seperti 1,5 atau 2,0. Dengan "oversampling": 1.5, sistem pertama-tama akan mendapatkan 15 kandidat dari indeks dan kemudian memperbaiki 10 teratas menggunakan data presisi penuh.

{
    "$search": {
        "cosmosSearch": {
            "vector": <vector_to_search>,
            "path": "<path_to_property>",
            "k": <num_results_to_return>,
            "oversampling": <float_value> 
        },
    }
}

Cuplikan kode ini menunjukkan pencarian vektor menggunakan $search operator dengan kuantisasi Produk. queryVector Dibutuhkan sebagai input dan mencari bidang v . Kueri meminta 10 dokumen paling mirip (k: 10), dengan faktor oversampling sebesar 2.0, yang mengambil 20 kandidat dan meningkatkan akurasi pencarian pada indeks yang terkompresi.

db.your_vector_collection.aggregate([
    {
        $search: {
            "cosmosSearch": {
                "vector": [0.1, 0.5, 0.9, ...],
                "path": "v",
                "k": 10,
                "oversampling": 2.0 // Retrieve 2 * 10 = 20 candidates for reranking
            },
            "returnStoredSource": true
        }
    }
])

Half-Precision vs. Kuantisasi produk

Indeks vektor kompres Half-Prescision dan Product quantization (PQ) di Azure DocumentDB, tetapi mereka berbeda dalam cara mereka mencapai kompresi dan memengaruhi pencarian:

Fitur Presisi Setengah Kuantisasi produk (PQ)
Metode Kompresi Mengurangi setiap dimensi vektor menjadi 16 bit. Membagi ruang vektor menjadi sub-ruang dan mengukur masing-masing.
Dimensi Maks Hingga 4.000 Hingga 16.000
Perubahan Presisi Sedikit kerugian akibat kedalaman bit yang lebih rendah. Berpotensi kehilangan yang lebih besar, dapat dikonfigurasi melalui pqCompressedDims.
Kecepatan Pencarian Peningkatan kecepatan sedang karena indeks yang lebih kecil. Peningkatan kecepatan yang signifikan karena vektor yang sangat terkompresi.
Waktu Build Indeks Relatif cepat. Dapat berlangsung lebih lama karena pelatihan sentroid (pqSampleSize).
Dukungan Indeks HNSW, IVF. DiskANN.
Configuration Sederhana, aktifkan compression: "half". Parameter lainnya: pqCompressedDims, pqSampleSize.
Penggunaan Pengambilan Sampel Berlebih Membantu dengan penurunan sedikit dalam presisi. Penting untuk memulihkan akurasi dari kompresi yang lebih besar.
Kasus Penggunaan Ideal Pengurangan memori sedang, peningkatan dimensi, kompromi presisi yang dapat diterima. Himpunan data besar, dimensi tinggi, pencarian cepat yang diprioritaskan, presisi dikelola dengan pengambilan sampel berlebih.

Pertimbangan untuk Kuantisasi produk

  • Presisi vs. Kompresi: Kompresi PQ yang lebih tinggi menyebabkan indeks yang lebih kecil dan pencarian yang lebih cepat tetapi kehilangan presisi yang lebih besar. Bereksperimenlah dengan pqCompressedDims dan oversampling untuk menemukan keseimbangan yang tepat.
  • Waktu Pembangunan Indeks: Pembuatan indeks PQ dapat memakan waktu lebih lama karena proses pelatihan sentroid, dipengaruhi oleh pqSampleSize.
  • Distribusi Data: PQ berfungsi paling baik ketika data vektor memiliki struktur kluster yang jelas.

Langkah selanjutnya