Skaler veya ikili niceleme kullanarak vektörleri sıkıştırma
Azure AI Search, arama dizinindeki vektörlerin boyutunu küçültmek için skaler ve ikili nicelemesini destekler. Float16 ve float32 eklemeleri için hem bellek hem de disk depolama tüketimini düşürdüğü için vektör boyutunu küçültmek için niceleme önerilir. Kayıplı sıkıştırmanın etkilerini dengelemek için, sıkıştırılmamış vektörler üzerinde fazla örnekleme ve yeniden puanlama ekleyebilirsiniz.
Yerleşik niceleme kullanmak için şu adımları izleyin:
- Vektör alanları ve
vectorSearch
dizin yapılandırmasıyla başlayın vectorSearch.compressions
eklescalarQuantization
VeyabinaryQuantization
yapılandırması ekleme ve buna bir ad verme- Kayıplı dizin oluşturmanın etkilerini azaltmak için isteğe bağlı özellikleri ayarlama
- Adlandırılmış yapılandırmayı kullanan yeni bir vektör profili oluşturma
- Yeni vektör profiline sahip yeni bir vektör alanı oluşturma
- Dizini, tanımladığınız yapılandırmayla dizin oluşturma sırasında ölçülen float32 veya float16 verileriyle yükleyin
- İsteğe bağlı olarak, varsayılanı geçersiz kılmak istiyorsanız, oversampling parametresini kullanarak nicelenmiş verileri sorgula
Önkoşullar
- Hiyerarşik Gezinilebilir Küçük Dünyalar (HNSW) veya kapsamlı K-en yakın komşu (eKNN) algoritmaları ve yeni bir vektör profili kullanılarak yapılandırmalı bir arama dizinindeki
vectorSearch
vektör alanları.
Desteklenen niceleme teknikleri
Niceleme, kayan tür vektörleri alan vektör alanlarına uygulanır. Bu makaledeki örneklerde, alanın veri türü gelen float32 eklemelerine yöneliktir Collection(Edm.Single)
, ancak float16 da desteklenir. Vektörler sıkıştırma yapılandırılmış bir alana alındığında, altyapı bellekteki ve diskteki vektör verilerinin ayak izini azaltmak için otomatik olarak niceleme gerçekleştirir.
İki tür niceleme desteklenir:
Skaler niceleme, kayan değerleri daha dar veri türlerine sıkıştırır. AI Search şu anda 8 bit olan int8'i destekleyerek vektör dizini boyutunu dört kat azaltıyor.
İkili niceleme, float'ları 1 bit alan ikili bitlere dönüştürür. Bu, vektör dizini boyutunun 28 kata kadar azalmasına neden olur.
Arama dizinine "sıkıştırmalar" ekleme
Aşağıdaki örnekte, vektör alanı ve bölüm içeren bir alan koleksiyonu içeren kısmi dizin vectorSearch.compressions
tanımı gösterilmektedir.
Hem hem de scalarQuantization
binaryQuantization
içerir. İstediğiniz kadar sıkıştırma yapılandırması belirtebilir ve sonra istediğiniz yapılandırmaları bir vektör profiline atayabilirsiniz.
için vectorSearch.Compressions
söz dizimi kararlı ve önizleme REST API'leri arasında değişiklik gösterir; önizleme depolama iyileştirmesi için yeni seçenekler ve mevcut söz diziminde değişiklikler ekler. Geriye dönük uyumluluk iç API eşlemeleri aracılığıyla korunur, ancak kodda 2024-11-01-preview ve gelecek sürümleri hedefleyen yeni söz dizimini benimsemeniz gerekir.
Sıkıştırma ayarlarını yapılandırmak için Dizin Oluştur veya Dizin Oluştur veya Güncelleştir REST API'sini kullanın.
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
}
]
}
}
Önemli noktalar:
kind
veyabinaryQuantization
olarak ayarlanmalıdırscalarQuantization
.rerankWithOriginalVectors
özgün sıkıştırılmamış vektörleri kullanarak benzerliği yeniden hesaplar ve ilk arama sorgusu tarafından döndürülen en iyi sonuçları yeniden oluşturur. Sıkıştırılmamış vektörler, false olsastored
bile arama dizininde bulunur. Bu özellik isteğe bağlıdır. Varsayılanı doğrudurdefaultOversampling
, bilgilerdeki azalmayı nicelemeden dengelemek için daha geniş bir olası sonuç kümesini dikkate alır. Olası sonuçlara yönelik formül, sorgudaki formülden ve bir fazla örnekleme çarpanından oluşurk
. Örneğin, sorgu 5'inik
belirtiyorsa ve fazla örnekleme 20 ise, sorgu bu amaç için özgün sıkıştırılmamış vektörü kullanarak yeniden boyutlandırmada kullanılmak üzere etkin bir şekilde 100 belge istemektedir. Yalnızca en üsttekik
yeniden kaydedilen sonuçlar döndürülür. Bu özellik isteğe bağlıdır. Varsayılan değer 4'dür.quantizedDataType
isteğe bağlıdır ve yalnızca skaler niceleme için geçerlidir. Eklerseniz, olarak ayarlanmalıdırint8
. Bu, şu anda skaler niceleme için desteklenen tek ilkel veri türüdür. Varsayılanint8
değeridir.
Vektör arama algoritmasını ekleme
2024-11-01-preview REST API'sinde HNSW algoritmasını veya kapsamlı KNN'yi kullanabilirsiniz. Kararlı sürüm için yalnızca HNSW kullanın.
"vectorSearch": {
"profiles": [ ],
"algorithms": [
{
"name": "use-hnsw",
"kind": "hnsw",
"hnswParameters": {
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
}
],
"compressions": [ <see previous section>]
}
Yeni vektör profili oluşturma ve atama
Yeni bir niceleme yapılandırması kullanmak için yeni bir vektör profili oluşturmanız gerekir. Bellekte sıkıştırılmış dizinler oluşturmak için yeni bir vektör profili oluşturulması gerekir. Yeni profiliniz HNSW kullanıyor.
Aynı dizin tanımında yeni bir vektör profili oluşturun ve bir sıkıştırma özelliği ile bir algoritma ekleyin. Burada, her bir niceleme yaklaşımı için bir profil olan iki profil yer alır.
"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> ] }
Yeni bir vektör alanına vektör profili atayın. Alanın veri türü float32 veya float16'dır.
Azure AI Search'te float32 ve float16 türlerinin Varlık Veri Modeli (EDM) eşdeğerleri sırasıyla ve
Collection(Edm.Half)
şeklindedirCollection(Edm.Single)
.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Çekme modeli dizin oluşturma için dizin oluşturucuları veya gönderme modeli dizin oluşturma API'lerini kullanarak dizini yükleyin.
Azure AI Search'te skaler niceleme nasıl çalışır?
Skaler niceleme, her vektör ekleme içindeki her sayının çözünürlüğünü azaltır. Her sayıyı 16 bit veya 32 bit kayan noktalı sayı olarak tanımlamak yerine 8 bit tamsayı kullanır. Bir sayı aralığını (genellikle 99. yüzdebirlik dilim minimum ve maksimum) tanımlar ve bunları sonlu düzey veya bölme sayısına bölerek her bir bölmeye bir tanımlayıcı atar. 8 bit skaler nicelemede 2^8 veya 256 olası bölmeler vardır.
Vektörün her bileşeni, gerçek bir sayıyı en yakın tamsayıya yuvarlamaya benzer bir işlemdeki bu niceleme düzeyleri kümesindeki en yakın temsili değere eşlenir. Nicelenmiş 8 bit vektörde, tanımlayıcı numarası özgün değerin yerine durur. Nicelemeden sonra her vektör, bileşenlerinin ait olduğu bölmeler için bir tanımlayıcı dizisiyle temsil edilir. Bu nicelenmiş vektörler, depolamak için özgün vektöre kıyasla çok daha az bit gerektirir, böylece depolama gereksinimlerini ve bellek ayak izini azaltır.
Azure AI Search'te ikili niceleme nasıl çalışır?
İkili niceleme, her bileşeni 0 veya 1 olarak tek bir bit olarak temsil ederek yüksek boyutlu vektörleri sıkıştırır. Bu yöntem, bellek ayak izini önemli ölçüde azaltır ve arama ve alma görevleri için çok önemli olan vektör karşılaştırma işlemlerini hızlandırır. Karşılaştırma testleri vektör dizin boyutunda %96'ya kadar azalma gösteriyor.
Özellikle 1024'ten büyük boyutlara sahip eklemeler için etkilidir. Daha küçük boyutlar için ikili nicelemenin kalitesini test etmenizi veya bunun yerine skaler değerleri denemenizi öneririz. Buna ek olarak, eklemeler sıfır etrafında ortalandığında BQ'nun çok iyi performans göstermiş olduğunu bulduk. OpenAI, Cohere ve Mistral gibi en popüler ekleme modelleri sıfır etrafında ortalanır.
Fazla örnekleme kullanarak nicelenmiş vektör alanını sorgulama
Sıkıştırılmış veya nicelenmiş vektör alanı için sorgu söz dizimi, özgün vektörlerle fazla örnekleme veya yeniden puanlama ile ilişkili parametreleri geçersiz kılmak istemediğiniz sürece sıkıştırılmamış vektör alanlarıyla aynıdır.
Dizindeki vektör sıkıştırma tanımının kayıplı sıkıştırmanın etkilerini azaltmak için rerankWithOriginalVectors
ve defaultOversampling
ayarlarının olduğunu hatırlayın. Sorgu zamanındaki davranışı değiştirmek için varsayılan değerleri geçersiz kılabilirsiniz. Örneğin, 10.0 ise defaultOversampling
sorgu isteğinde başka bir şeyle değiştirebilirsiniz.
Dizinin açıkça bir rerankWithOriginalVectors
veya defaultOversampling
tanımı olmasa bile oversampling parametresini ayarlayabilirsiniz. Sorgu zamanında sağlama oversampling
, bu sorgunun dizin ayarlarını geçersiz kılar ve sorguyu true kadar etkili rerankWithOriginalVectors
bir şekilde yürütür.
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
}
]
}
Önemli noktalar:
Vektör profili ataması başına vektör sıkıştırması yapılan vektör alanları için geçerlidir.
defaultOversampling
Dizinin sıkıştırma yapılandırması aşırı örnekleme veya yeniden boyutlandırma seçeneklerini belirtmese bile değeri geçersiz kılar veya sorgu zamanında fazla örneklemeye neden olur.