Kompres vektor menggunakan kuantisasi skalar atau biner
Azure AI Search mendukung kuantisasi skalar dan biner untuk mengurangi ukuran vektor dalam indeks pencarian. Kuantisasi direkomendasikan untuk mengurangi ukuran vektor karena menurunkan konsumsi penyimpanan memori dan disk untuk penyematan float16 dan float32. Untuk mengimbangi efek kompresi lossy, Anda dapat menambahkan oversampling dan rescoring melalui vektor yang tidak dikompresi.
Untuk menggunakan kuantisasi bawaan, ikuti langkah-langkah berikut:
- Mulai dengan bidang vektor dan
vectorSearch
konfigurasi ke indeks - Menambahkan
vectorSearch.compressions
-
scalarQuantization
Tambahkan konfigurasi ataubinaryQuantization
dan beri nama - Atur properti opsional untuk mengurangi efek 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 oversampling jika Anda ingin mengambil alih default
Prasyarat
-
Bidang vektor dalam indeks pencarian dengan
vectorSearch
konfigurasi, menggunakan algoritma Hierarkis Navigable Small Worlds (HNSW) atau algoritma K-nearest (eKNN) 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 penyematan float32 masuk, tetapi float16 juga didukung. Ketika vektor diterima di bidang dengan kompresi dikonfigurasi, mesin secara otomatis 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, mereka mungkin tidak menunjukkan penghematan penyimpanan penuh karena kuota penyimpanan yang terbatas.
Menambahkan "kompresi" ke indeks pencarian
Contoh berikut menunjukkan definisi indeks parsial dengan kumpulan bidang yang menyertakan bidang vektor, dan vectorSearch.compressions
bagian .
Ini termasuk atau scalarQuantization
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 opsi baru untuk pengoptimalan penyimpanan, ditambah perubahan pada sintaks yang ada. Kompatibilitas mundur dipertahankan melalui pemetaan API internal, tetapi Anda harus mengadopsi sintaks 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=2024-07-01
{
"name": "my-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": [ ],
"algorithms": [ ],
"compressions": [
{
"name": "use-scalar",
"kind": "scalarQuantization",
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
},
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
},
{
"name": "use-binary",
"kind": "binaryQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10
}
]
}
}
Poin utama:
kind
harus diatur kescalarQuantization
ataubinaryQuantization
.rerankWithOriginalVectors
menggunakan vektor asli yang tidak dikompresi untuk menghitung ulang kesamaan dan mererank hasil teratas yang dikembalikan oleh kueri pencarian awal. Vektor yang tidak dikompresi ada di indeks pencarian meskipunstored
salah. Properti ini bersifat opsional. Default-nya adalah true.defaultOversampling
mempertimbangkan serangkaian hasil potensial yang lebih luas untuk mengimbangi pengurangan informasi dari kuantisasi. Rumus untuk hasil potensial terdiri darik
dalam kueri, dengan pengali sampel berlebih. Misalnya, jika kueri menentukank
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 reranked teratask
yang dikembalikan. Properti ini bersifat opsional. Defaultnya adalah 4.quantizedDataType
bersifat opsional dan hanya berlaku untuk kuantisasi skalar. Jika Anda menambahkannya, itu harus diatur keint8
. Ini adalah satu-satunya jenis data primitif yang didukung untuk kuantisasi skalar saat ini. Defaultnya adalahint8
.
Menambahkan algoritma pencarian vektor
Anda dapat menggunakan algoritma HNSW atau KNN lengkap di REST API pratinjau 2024-11-01. Untuk versi stabil, gunakan HNSW saja.
"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.
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> ] }
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)
danCollection(Edm.Half)
, masing-masing.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Muat indeks menggunakan pengindeks untuk pengindeksan model penarikan, atau API untuk pengindeksan model pendorongan.
Cara kerja kuantisasi skalar di Azure AI Search
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 persentil ke-99 dan maksimum) dan membaginya menjadi jumlah tingkat atau bin terbatas, menetapkan setiap bin pengidentifikasi. 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.
Cara kerja kuantisasi biner di Azure AI Search
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 penyematan 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 BQ berkinerja sangat baik ketika penyematan berpusat di sekitar nol. Model penyematan paling populer seperti OpenAI, Cohere, dan Mistral berpusat di sekitar nol.
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 berlebihan atau penilaian ulang dengan vektor asli.
Ingat bahwa definisi kompresi vektor dalam indeks memiliki pengaturan untuk rerankWithOriginalVectors
dan defaultOversampling
untuk mengurangi efek kompresi lossy. Anda dapat mengambil alih nilai default untuk memvariasi perilaku pada waktu kueri. 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 rerankWithOriginalVectors
definisi atau defaultOversampling
.
oversampling
Menyediakan pada waktu kueri mengambil alih pengaturan indeks untuk kueri tersebut dan menjalankan kueri dengan efektif rerankWithOriginalVectors
sebagai true.
POST https://[service-name].search.windows.net/indexes/demo-index/docs/search?api-version=2024-07-01
{
"vectorQueries": [
{
"kind": "vector",
"vector": [8, 2, 3, 4, 3, 5, 2, 1],
"fields": "myvector",
"oversampling": 12.0,
"k": 5
}
]
}
Poin utama:
Berlaku untuk bidang vektor yang mengalami kompresi vektor, sesuai penetapan profil vektor.
Mengambil alih
defaultOversampling
nilai atau memperkenalkan pengambilan sampel berlebih pada waktu kueri, bahkan jika konfigurasi pemadatan indeks tidak menentukan opsi pengambilan sampel atau reranking berlebihan.