Kompres vektor menggunakan kuantisasi skalar atau biner

Pencarian Azure AI mendukung kuantisasi skalar dan biner untuk mengurangi ukuran vektor dalam indeks pencarian. Kuantisasi disarankan karena mengurangi penyimpanan memori dan disk untuk penyematan float16 dan float32. Untuk mengimbangi efek kompresi lossy, Anda dapat menambahkan oversampling dan rescoring.

Untuk menggunakan kuantisasi bawaan, ikuti langkah-langkah berikut:

  • Mulai dengan bidang vektor dan vectorSearch konfigurasi untuk dijadikan indeks
  • Menambahkan vectorSearch.compressions
  • Tambahkan konfigurasi scalarQuantization atau binaryQuantization dan berikan nama.
  • Atur properti opsional untuk memperkecil dampak dari pengindeksan lossy.
  • Membuat profil vektor baru yang menggunakan konfigurasi bernama
  • Membuat bidang vektor baru yang memiliki profil vektor baru
  • Muat indeks dengan data float32 atau float16 yang diukur selama pengindeksan dengan konfigurasi yang Anda tentukan
  • Secara opsional, kueri data yang dikuantisasi menggunakan parameter pengambilan sampel berlebih. Jika bidang vektor tidak menentukan pengambilan sampel berlebih dalam definisinya, Anda bisa menambahkannya pada waktu kueri.

Petunjuk / Saran

Pencarian Azure AI: Potong Biaya Vektor Hingga 92,5% dengan Teknik Kompresi Baru membandingkan strategi kompresi dan menjelaskan penghematan penyimpanan dan biaya. Ini juga termasuk metrik untuk mengukur relevansi berdasarkan keuntungan kumulatif diskon normal (NDCG), menunjukkan bahwa Anda dapat mengompresi data Anda tanpa mengorbankan kualitas pencarian.

Prasyarat

  • Bidang vektor dalam indeks pencarian, dengan konfigurasi yang vectorSearch menentukan algoritma Hierarkis Navigable Small Worlds (HNSW) atau K-Nearest Neighbor (KNN) yang lengkap, dan profil vektor baru.

Teknik kuantisasi yang didukung

Kuantisasi berlaku untuk bidang vektor yang menerima vektor jenis float. Dalam contoh dalam artikel ini, jenis data bidang adalah Collection(Edm.Single) untuk embedding float32 yang masuk, tetapi float16 juga didukung. Ketika vektor diterima di bidang dengan kompresi dikonfigurasi, mesin melakukan kuantisasi untuk mengurangi jejak data vektor dalam memori dan pada disk.

Dua jenis kuantisasi didukung:

  • Kuantisasi skalar mengompresi nilai float ke dalam jenis data yang lebih sempit. Pencarian AI saat ini mendukung int8, yaitu 8 bit, mengurangi ukuran indeks vektor empat kali lipat.

  • Kuantisasi biner mengonversi float menjadi bit biner, yang memakan waktu 1 bit. Ini menghasilkan hingga 28 kali pengurangan ukuran indeks vektor.

Catatan

Meskipun layanan gratis mendukung kuantisasi, layanan ini tidak menunjukkan penghematan penyimpanan penuh karena kuota penyimpanan yang terbatas.

Kuantisasi skalar mengurangi resolusi setiap angka dalam setiap penyematan vektor. Alih-alih menjelaskan setiap angka sebagai angka floating point 16-bit atau 32-bit, angka tersebut menggunakan bilangan bulat 8-bit. Ini mengidentifikasi rentang angka (biasanya minimum dan maksimum persentil ke-99) dan membaginya menjadi sejumlah tingkat atau bin yang terbatas, menetapkan pengidentifikasi untuk setiap bin. Dalam kuantisasi skalar 8-bit, ada 2^8, atau 256, kemungkinan bin.

Setiap komponen vektor dipetakan ke nilai perwakilan terdekat dalam set tingkat kuantisasi ini dalam proses yang mirip dengan pembulatan angka riil ke bilangan bulat terdekat. Dalam vektor 8-bit yang dikuantisasi, nomor pengidentifikasi berdiri sebagai pengganti nilai asli. Setelah kuantisasi, setiap vektor diwakili oleh array pengidentifikasi untuk bin tempat komponennya berada. Vektor kuantisasi ini membutuhkan lebih sedikit bit untuk disimpan dibandingkan dengan vektor asli, sehingga mengurangi persyaratan penyimpanan dan jejak memori.

Kuantisasi biner mengompresi vektor dimensi tinggi dengan mewakili setiap komponen sebagai satu bit, baik 0 atau 1. Metode ini secara drastis mengurangi jejak memori dan mempercepat operasi perbandingan vektor, yang sangat penting untuk tugas pencarian dan pengambilan. Pengujian tolok ukur menunjukkan pengurangan hingga 96% dalam ukuran indeks vektor.

Ini sangat efektif untuk embedding dengan dimensi yang lebih besar dari 1024. Untuk dimensi yang lebih kecil, sebaiknya uji kualitas kuantisasi biner, atau mencoba skalar sebagai gantinya. Selain itu, kami telah menemukan bahwa kuantisasi biner sangat efektif ketika embedding berpusat di sekitar nol. Model penyematan paling populer yang ditawarkan oleh OpenAI, Cohere, dan Mistral berpusat di sekitar nol.

Teknik penilaian ulang yang didukung

Penilaian ulang adalah teknik opsional yang digunakan untuk mengimbangi kehilangan informasi karena kuantisasi vektor. Selama eksekusi kueri, ia menggunakan pengambilan sampel berlebih untuk mengambil vektor tambahan, dan informasi tambahan untuk mengodekan ulang hasil awal yang ditemukan oleh kueri. Informasi tambahan adalah vektor presisi penuh asli yang tidak dikompresi, atau, untuk kuantisasi biner, Anda memiliki opsi untuk melakukan penilaian ulang menggunakan kandidat dokumen yang terkuantisasi biner terhadap vektor kueri.

Hanya grafik HNSW yang memungkinkan penilaian ulang. KNN ekstensif tidak mendukung penilaian ulang karena menurut definisi, semua vektor dipindai pada waktu kueri, yang membuat penilaian ulang dan pengambilan sampel ulang menjadi tidak relevan.

Opsi penilaian ulang ditentukan dalam indeks, tetapi Anda dapat memanggil penilaian ulang pada waktu kueri dengan menambahkan parameter kueri oversampling.

Objek Karakteristik
Index Tambahkan RescoringOptions ke bagian kompresi vektor. Contoh dalam artikel ini menggunakan RescoringOptions.
Pertanyaan Tambahkan oversampling pada definisi RawVectorQuery atau VectorizableTextQuery. Menambahkan oversampling mengaktifkan penilaian ulang saat kueri.

Catatan

Nama parameter penilaian ulang telah berubah selama beberapa rilis terakhir. Jika Anda menggunakan API pratinjau yang lebih lama, tinjau instruksi peningkatan untuk mengatasi perubahan yang mengganggu.

Proses umum untuk pemeringkatan ulang adalah:

  1. Kueri vektor dijalankan melalui bidang vektor terkompresi.
  2. Kueri vektor mengembalikan kandidat teratas dari hasil lebih spesifik sebanyak k.
  3. Kandidat-k yang diambil secara berlebihan diberi skor ulang menggunakan vektor asli yang tidak dikompresi untuk kuantisasi berskala, atau hasil titik dari kuantisasi biner.
  4. Setelah penilaian ulang, hasil disesuaikan sehingga kecocokan yang lebih relevan muncul terlebih dahulu.

Pengambilan sampel berlebih untuk vektor berukuran skalar memerlukan ketersediaan vektor presisi penuh asli. Pengambilan sampel berlebih untuk vektor kuantisasi biner dapat menggunakan vektor presisi penuh (preserveOriginals) atau produk titik dari vektor biner (discardOriginals). Jika Anda mengoptimalkan penyimpanan vektor, pastikan untuk menyimpan vektor presisi penuh dalam indeks jika Anda membutuhkannya untuk tujuan penilaian ulang. Untuk informasi selengkapnya, lihat Menghilangkan instans vektor opsional dari penyimpanan.

Menambahkan "kompresi" ke indeks pencarian

Bagian ini menjelaskan cara menentukan bagian vectorsSearch.compressions dalam indeks. Contoh berikut menunjukkan definisi indeks parsial dengan kumpulan bidang yang menyertakan bidang vektor.

Contoh kompresi mencakup scalarQuantization atau binaryQuantization. Anda dapat menentukan konfigurasi kompresi sebanyak yang Anda butuhkan, lalu menetapkan konfigurasi yang Anda inginkan ke profil vektor.

Sintaks untuk vectorSearch.Compressions bervariasi antara REST API yang stabil dan pratinjau, dengan pratinjau menambahkan lebih banyak opsi untuk pengoptimalan penyimpanan, ditambah perubahan pada sintaks yang ada. Kompatibilitas mundur dipertahankan melalui pemetaan API internal, tetapi disarankan untuk menggunakan properti yang lebih baru dalam kode yang menargetkan pratinjau 2024-11-01 dan versi mendatang.

Gunakan REST API Buat Indeks atau Buat atau Perbarui Indeks untuk mengonfigurasi pengaturan pemadatan.

POST https://[servicename].search.windows.net/indexes?api-version=2025-09-01

{
  "name": "my-index",
  "description": "This is a description of this index",
  "fields": [
    { "name": "Id", "type": "Edm.String", "key": true, "retrievable": true, "searchable": true, "filterable": true },
    { "name": "content", "type": "Edm.String", "retrievable": true, "searchable": true },
    { "name": "vectorContent", "type": "Collection(Edm.Single)", "retrievable": false, "searchable": true, "dimensions": 1536,"vectorSearchProfile": "vector-profile-1"},
  ],
  "vectorSearch": {
    "profiles": [ 
      {
          "name": "vector-profile-1",
          "algorithm": "use-hnsw",
          "compression": "use-scalar"
      }
    ],
    "algorithms": [ 
      {
        "name": "use-hnsw",
        "kind": "hnsw",
        "hnswParameters": { },
        "exhaustiveKnnParameters": null
      }
    ],
    "compressions": [
      {
        "scalarQuantizationParameters": {
          "quantizedDataType": "int8"
        },
        "name": "mySQ8",
        "kind": "scalarQuantization",
        "rescoringOptions": {
            "enableRescoring": true,
            "defaultOversampling": 10,
            "rescoreStorageMethod": "preserveOriginals"
        },
        "truncationDimension": 2
      },
      {
        "name": "myBQC",
        "kind": "binaryQuantization",
        "rescoringOptions": {
            "enableRescoring": true,
            "defaultOversampling": 10,
            "rescoreStorageMethod": "discardOriginals"
        },
        "truncationDimension": 2
      }
    ]
  },
}

Poin utama:

  • kind harus diatur ke scalarQuantization atau binaryQuantization.

  • rescoringOptions adalah kumpulan properti yang digunakan untuk mengimbangi kompresi lossy dengan menilai ulang hasil kueri menggunakan vektor presisi penuh asli yang ada sebelum kuantisasi. Agar penilaian ulang dapat berfungsi, Anda harus memiliki instance vektor yang menyediakan konten ini. Pengaturan rescoreStorageMethod untuk discardOriginals mencegah Anda menggunakan enableRescoring atau defaultOversampling. Untuk informasi selengkapnya tentang penyimpanan vektor, lihat Menghilangkan instans vektor opsional dari penyimpanan.

  • "rescoreStorageMethod": "preserveOriginals" menilai ulang hasil pencarian vektor dengan vektor presisi penuh asli dapat menyebabkan penyesuaian pada skor pencarian dan peringkat, serta meningkatkan kecocokan yang lebih relevan seperti yang ditentukan oleh langkah penilaian ulang. Untuk kuantisasi biner, Anda dapat mengatur rescoreStorageMethod ke discardOriginals untuk mengurangi penyimpanan lebih lanjut, tanpa mengurangi kualitas. Vektor asli tidak diperlukan untuk kuantisasi biner.

  • defaultOversampling mempertimbangkan serangkaian hasil potensial yang lebih luas untuk mengimbangi pengurangan informasi dari kuantisasi. Rumus untuk hasil potensial terdiri dari k dalam kueri, dengan pengali sampel berlebih. Misalnya, jika kueri menentukan k 5, dan oversampling adalah 20, maka kueri secara efektif meminta 100 dokumen untuk digunakan dalam reranking, menggunakan vektor asli yang tidak dikompresi untuk tujuan tersebut. Hanya hasil peringkat ulang teratas k yang diberikan kembali. Properti ini bersifat opsional. Pengaturan bawaan adalah 4.

  • quantizedDataType bersifat opsional dan hanya berlaku untuk kuantisasi skalar. Jika Anda menambahkannya, itu harus ditetapkan ke int8. Ini adalah satu-satunya jenis data primitif yang didukung untuk kuantisasi skalar saat ini. Defaultnya adalah int8.

  • truncationDimension memanfaatkan kemampuan melekat dari model text-embedding-3 untuk "mengodekan informasi pada tingkat kedetailan yang berbeda dan memungkinkan embedding tunggal beradaptasi dengan batasan komputasi tugas hilir" (lihat Pembelajaran Representasi Matryoshka). Anda dapat menggunakan dimensi terpotong dengan atau tanpa opsi penilaian ulang. Untuk informasi lebih lanjut mengenai cara fitur ini diterapkan di Pencarian Azure AI, lihat Memotong dimensi menggunakan kompresi MRL.

Menambahkan algoritma pencarian vektor

Anda dapat menggunakan algoritma HNSW atau eKNN dalam REST API pratinjau versi 2024-11-01 atau versi yang lebih baru. Untuk versi stabil, gunakan HNSW saja. Jika Anda ingin penilaian ulang, Anda harus memilih HNSW.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Membuat dan menetapkan profil vektor baru

Untuk menggunakan konfigurasi kuantisasi baru, Anda harus membuat profil vektor baru . Pembuatan profil vektor baru diperlukan untuk membangun indeks terkompresi dalam memori. Profil baru Anda menggunakan HNSW.

  1. Dalam definisi indeks yang sama, buat profil vektor baru dan tambahkan properti kompresi dan algoritma. Berikut adalah dua profil, satu untuk setiap pendekatan kuantisasi.

    "vectorSearch": {
        "profiles": [
           {
              "name": "vector-profile-hnsw-scalar",
              "compression": "use-scalar", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           },
           {
              "name": "vector-profile-hnsw-binary",
              "compression": "use-binary", 
              "algorithm": "use-hnsw",
              "vectorizer": null
           }
         ],
         "algorithms": [  <see previous section> ],
         "compressions": [ <see previous section> ] 
    }
    
  2. Tetapkan profil vektor ke bidang vektor baru . Jenis data bidang adalah float32 atau float16.

    Dalam Pencarian Azure AI, Model Data Entitas (EDM) yang setara dengan jenis float32 dan float16 adalah Collection(Edm.Single) dan Collection(Edm.Half), masing-masing.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Muat indeks menggunakan pengindeks untuk pengindeksan model penarikan, atau API untuk pengindeksan model pendorongan.

Mengkueri bidang vektor terkuantisasi menggunakan pengambilan sampel berlebih

Sintaks kueri untuk bidang vektor terkompresi atau terkuantisasi sama dengan untuk bidang vektor yang tidak dikompresi, kecuali Anda ingin mengambil alih parameter yang terkait dengan pengambilan sampel dan penilaian ulang berlebih. Anda dapat menambahkan oversampling parameter untuk memanggil pengambilan sampel dan penilaian ulang berlebih pada waktu kueri.

Gunakan Dokumen Pencarian untuk permintaan tersebut.

Ingat bahwa definisi kompresi vektor di dalam indeks memiliki pengaturan untuk , enableRescoring, dan rescoreStorageMethod guna mengurangi efek kompresi dengan kehilangan. Anda dapat mengubah nilai default untuk mengubah perilaku selama kueri berlangsung. Misalnya, jika defaultOversampling adalah 10.0, Anda dapat mengubahnya menjadi sesuatu yang lain dalam permintaan kueri.

Anda dapat mengatur parameter oversampling meskipun indeks tidak secara eksplisit memiliki opsi penilaian ulang atau sudah ada defaultOversampling definisi. Pada waktu kueri, menyediakan oversampling akan mengesampingkan pengaturan indeks untuk kueri tersebut dan menjalankan kueri dengan enableRescoring sebagai efektif benar.

POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2025-09-01

{    
    "vectorQueries": [
        {    
            "kind": "vector",    
            "vector": [8, 2, 3, 4, 3, 5, 2, 1],    
            "fields": "myvector",
            "oversampling": 12.0,
            "k": 5   
        }
  ]    
}

Poin utama:

  • Pengambilan sampel berlebih berlaku untuk bidang vektor yang mengalami pemadatan vektor, per penetapan profil vektor.

  • Oversampling dalam kueri menggantikan nilai defaultOversampling dalam indeks, atau mengaktifkan oversampling dan pengulangan penilaian saat waktu kueri, bahkan jika konfigurasi kompresi indeks tidak menentukan opsi oversampling atau penyusunan ulang ulang.