Azure AI Search'te daha küçük vektörler için vektör nicelemesini ve azaltılmış depolamayı yapılandırma
Önemli
Bu özellikler Ek Kullanım Koşulları altında genel önizleme aşamasındadır. 2024-03-01-preview REST API'leri ve sonraki önizleme API'leri yeni veri türlerini, vektör sıkıştırma özelliklerini ve stored
özelliğini sağlar. En son önizleme API'lerini kullanmanızı öneririz.
Bu makalede, Azure AI Search'te vektör dizinlerini sıkıştırmaya yönelik vektör niceleme ve diğer teknikler açıklanmaktadır.
Seçenekleri değerlendirme
İlk adım olarak, vektör alanları tarafından kullanılan depolama miktarını azaltmaya yönelik üç seçeneği gözden geçirin. Bu seçenekler birbirini dışlamaz.
Bellekteki ve diskteki vektör boyutunu en az çabayla sıkıştırdığından ve çoğu senaryoda en fazla faydayı sağlama eğiliminde olduğundan skaler niceleme öneririz. Buna karşılık, dar türler (hariç) bunları yapmak için Float16
özel bir çaba gerektirir ve stored
bellek kadar pahalı olmayan disk depolama alanına tasarruf eder.
Yaklaşım | Bu seçeneği neden kullanmalısınız? |
---|---|
Skaler niceleme ekleme | Yerel Float32 eklemeleri 'ye sıkıştırmak için yerleşik skaler Int8 niceleme kullanın. Bu seçenek, sorgu performansında düşüş olmadan bellekte ve diskte depolamayı azaltır. Gibi Int8 daha küçük veri türleri, içerik bakımından daha az zengin Float32 olan vektör dizinleri oluşturur. Yerleşik sıkıştırma, bilgi kaybını dengelemek için, sıkıştırılmamış eklemeler kullanılarak sorgu sonrası işleme ve daha ilgili sonuçlar döndürmek için fazla örnekleme seçenekleri içerir. Yeniden boyutlandırma ve fazla örnekleme, veya Float16 alanlarının yerleşik skaler nicelemesinin Float32 belirli özellikleridir ve özel nicelemeden geçen eklemelerde kullanılamaz. |
Vektör alanlarına daha küçük ilkel veri türleri atama | , Int16 , Int8 ve (ikili) gibi Float16 dar veri türleri bellekte ve byte diskte daha az alan tüketir, ancak vektörleri dar bir veri biçiminde veren bir ekleme modeline sahip olmanız gerekir. Veya küçük veri çıkışı veren özel niceleme mantığına sahip olmanız gerekir. Daha az çaba gerektiren üçüncü bir kullanım örneği, çoğu model tarafından üretilen yerel Float32 eklemeleri öğesine yeniden kaydetmektir Float16 . İkili vektörler hakkında ayrıntılı bilgi için bkz. dizin ikili vektörleri. |
Alınabilir vektörlerin isteğe bağlı depolama alanını ortadan kaldırın | Sorgu yanıtında döndürülen vektörler, sorgu yürütme sırasında kullanılan vektörlerden ayrı olarak depolanır. Vektör döndürmeniz gerekmiyorsa, alınabilir depolamayı kapatarak genel alan başına disk depolama alanını yüzde 50'ye kadar azaltabilirsiniz. |
Bu seçeneklerin tümü boş bir dizinde tanımlanır. Bunlardan herhangi birini uygulamak için Azure portalını, 2024-03-01-preview REST API'lerini veya bir beta Azure SDK paketini kullanın.
Dizin tanımlandıktan sonra, belgeleri ayrı bir adım olarak yükleyebilir ve dizinleyebilirsiniz.
Seçenek 1: Skaler nicelemesi yapılandırma
Yerleşik skaler niceleme önerilir çünkü bellek ve disk depolama gereksinimlerini azaltır ve daha küçük bir dizinin etkilerini dengelemek için yeniden boyutlandırma ve fazla örnekleme ekler. Yerleşik skaler niceleme, veya Float16
veri içeren Float32
vektör alanlarına uygulanabilir.
Yerleşik vektör sıkıştırmasını kullanmak için:
- Arama dizinine ekleyin
vectorSearch.compressions
. Bu önizlemede desteklenen sıkıştırma algoritması skaler nicelemedir. - Kayıplı dizin oluşturmanın etkilerini azaltmak için isteğe bağlı özellikleri ayarlayın.
defaultOversampling
Hem hem dererankWithOriginalVectors
sorgu yürütme sırasında iyileştirmeler sağlar. - Yeni bir vektör profiline ekleyin
vectorSearch.profiles.compression
. - Yeni vektör profilini yeni bir vektör alanına atayın.
Sıkıştırma ayarları ekleme ve isteğe bağlı özellikleri ayarlama
2024-03-01-preview REST API kullanılarak oluşturulan dizin tanımına bir compressions
bölüm ekleyin. Şablon olarak aşağıdaki JSON'yi kullanın.
"compressions": [
{
"name": "my-scalar-quantization",
"kind": "scalarQuantization",
"rerankWithOriginalVectors": true, (optional)
"defaultOversampling": 10.0, (optional)
"scalarQuantizationParameters": { (optional)
"quantizedDataType": "int8", (optional)
}
}
]
Önemli noktalar:
kind
olarak ayarlanmalıdırscalarQuantization
. Şu anda desteklenen tek niceleme yöntemi budur.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 hesaplar. 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
olarak ayarlanmalıdırint8
. Şu anda desteklenen tek temel veri türü budur. Bu özellik isteğe bağlıdır. Varsayılanint8
değeridir.
Vektör profiline sıkıştırma ayarı ekleme
Skaler niceleme, yeni vektör profilinde bir özellik olarak belirtilir. Bellekte sıkıştırılmış dizinler oluşturmak için yeni bir vektör profili oluşturulması gerekir.
Profil içinde Hiyerarşik Gezinilebilir Küçük Dünyalar (HNSW) algoritmasını kullanmanız gerekir. Yerleşik niceleme, kapsamlı KNN ile desteklenmez.
Yeni bir vektör profili oluşturun ve sıkıştırma özelliği ekleyin.
"profiles": [ { "name": "my-vector-profile", "compression": "my-scalar-quantization", "algorithm": "my-hnsw-vector-config-1", "vectorizer": null } ]
Yeni bir vektör alanına vektör profili atayın. Skaler niceleme, içeriği olarak
Int8
azaltır, bu nedenle içeriğinizin veyaFloat16
olduğundanFloat32
emin olun.Azure AI Search'te ve
Float16
türlerinin Varlık Veri Modeli (EDM) eşdeğerleriFloat32
sırasıyla veCollection(Edm.Half)
şeklindedirCollection(Edm.Single)
.{ "name": "DescriptionVector", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "my-vector-profile" }
Ç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ı 32 bit kayan noktalı sayı olarak tanımlamak yerine 8 bitlik bir 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.
Seçenek 2: Vektör alanlarına dar veri türleri atama
Vektör alanları, sayı dizisi olarak temsil edilen vektör eklemelerini depolar. Bir alan türü belirttiğinizde, bu dizilerdeki her sayıyı tutmak için kullanılan temel temel veri türünü belirtirsiniz. Veri türü, her sayinin ne kadar alan kapladğini etkiler.
Önizleme API'lerini kullanarak, vektör alanlarının depolama gereksinimlerini azaltmak için dar temel veri türleri atayabilirsiniz.
Vektör alanları için veri türlerini gözden geçirin:
Collection(Edm.Single)
32 bit kayan nokta (varsayılan)Collection(Edm.Half)
16 bit kayan noktaCollection(Edm.Int16)
16 bit işaretli tamsayıCollection(Edm.SByte)
8 bit işaretli tamsayı
Not
İkili veri türleri şu anda desteklenmiyor.
Ekleme modelinizin çıkışı veya özel nicelemeden geçen vektörler için geçerli olan bir veri türü seçin.
Çoğu ekleme modeli 32 bit kayan noktalı sayılar üretir, ancak özel niceleme uygularsanız, çıkışınız veya
Int8
olabilirInt16
. Artık daha küçük biçimi kabul eden vektör alanları tanımlayabilirsiniz.Metin ekleme modelleri, Azure AI Search'te ile eşlenen yerel çıkış biçimine
Float32
Collection(Edm.Single)
sahiptir. 'denfloat
int
türe dönüştürme yasaklandığından bu çıkışıInt8
ile eşleyemezsiniz. Bununla birlikte, öğesindenFloat32
(veyaCollection(Edm.Half)
) türüneFloat16
geçiş yapabilirsiniz ve bu, ek çalışma yapmadan dar veri türlerini kullanmanın kolay bir yoludur.Aşağıdaki tabloda, dar veri türlerini kullanan çeşitli ekleme modellerine bağlantılar sağlanmaktadır.
Ekleme modeli Yerel çıkış Azure AI Search'te geçerli türler metin ekleme-ada-002 Float32
Collection(Edm.Single)
veyaCollection(Edm.Half)
metin ekleme-3-küçük Float32
Collection(Edm.Single)
veyaCollection(Edm.Half)
metin ekleme-3-büyük Float32
Collection(Edm.Single)
veyaCollection(Edm.Half)
int8 embedding_type ile V3 ekleme modellerini uyumlu yapma Int8
Collection(Edm.SByte)
Dar bir veri türünün dezavantajlarını anladığınızdan emin olun.
Collection(Edm.Half)
daha az bilgiye sahip olduğundan daha düşük çözünürlük elde edebilirsiniz. Verileriniz homojen veya yoğunsa, ek ayrıntı veya nüans kaybı sorgu zamanında kabul edilemez sonuçlara yol açabilir çünkü yakındaki vektörleri ayırt etmek için kullanılabilecek daha az ayrıntı vardır.Dizini tanımlayın ve oluşturun. Bu adım için Azure portalı, 2024-03-01-preview veya beta Azure SDK paketini kullanabilirsiniz.
Sonuçları denetleyin. Vektör alanının alınabilir olarak işaretlendiğini varsayarsak, alan içeriğinin veri türüyle eşleşip eşleşmedığını doğrulamak için Arama gezginini veya REST API'yi kullanın. Sorgu için doğru
2024-03-01-preview
API sürümünü kullandığınızdan emin olun; aksi takdirde yeni özellikler gösterilmez.
Vektör dizini boyutunu denetlemek için Azure portalını veya 2024-03-01-preview'ı kullanın.
Not
Alanın veri türü, fiziksel veri yapısını oluşturmak için kullanılır. Bir veri türünü daha sonra değiştirmek isterseniz, dizini bırakın ve yeniden oluşturun veya yeni tanım ile ikinci bir alan oluşturun.
Seçenek 3: Alınabilir depolamayı stored
kaldırmak için özelliğini ayarlayın
stored
özelliği, bir vektör alanı tanımında depolamanın alınabilir vektör alanı içeriği için ayrılıp ayrılmadığını belirleyen yeni bir boole değeridir. stored
özelliği varsayılan olarak true olarak ayarlanır. Sorgu yanıtında vektör içeriğine ihtiyacınız yoksa false olarak ayarlayarak stored
alan başına yüzde 50'ye kadar depolama alanı kaydedebilirsiniz.
Bu özelliğin ayarlanıp ayarlanmayacağını değerlendirirken yanıtta vektörlere ihtiyacınız olup olmadığını göz önünde bulundurun. Vektörler insan tarafından okunabilir olmadığından, genellikle arama sayfasında işlenen bir sorgu yanıtında atlanırlar. Bununla birlikte, sorgu sonuçlarını vektör içeriğini kullanan bir modele veya işleme geçirme gibi aşağı akış işlemede vektörler kullanıyorsanız, true olarak ayarlı kalmalı stored
ve vektör boyutunu en aza indirmek için farklı bir teknik seçmelisiniz.
Atfın stored
geri alınamayacağını unutmayın. Fiziksel veri yapıları oluşturulduğunda vektör alanlarında dizin oluşturma sırasında ayarlanır. Vektör içeriğini daha sonra almak istiyorsanız, dizini bırakmanız ve yeniden oluşturmanız veya yeni ilişkilendirmeye sahip yeni bir alan oluşturup yüklemeniz gerekir.
Aşağıdaki örnekte bir arama dizininin alan koleksiyonu gösterilmektedir. Vektör alanının alınabilir depolama alanını kalıcı olarak kaldırmak için false olarak ayarlayın stored
.
PUT https://[service-name].search.windows.net/indexes/[index-name]?api-version=2024-05-01-preview
Content-Type: application/json
api-key: [admin key]
{
"name": "myindex",
"fields": [
{
"name": "myvector",
"type": "Collection(Edm.Single)",
"retrievable": false,
"stored": false,
"dimensions": 1536,
"vectorSearchProfile": "vectorProfile"
}
]
}
Önemli noktalar:
Yalnızca vektör alanlarına uygulanır.
Disk üzerindeki depolamayı etkiler, belleği etkilemez ve sorgular üzerinde hiçbir etkisi yoktur. Sorgu yürütme özelliğinden etkilenmeyen
stored
ayrı bir vektör dizini kullanır.stored
özelliği vektör alanlarında dizin oluşturma sırasında ayarlanır ve geri alınamaz. İçeriği daha sonra almak istiyorsanız, dizini bırakmanız ve yeniden oluşturmanız veya yeni ilişkilendirmeye sahip yeni bir alan oluşturup yüklemeniz gerekir.Varsayılanlar
stored
true veretrievable
false olarak ayarlanır. Varsayılan yapılandırmada, alınabilir bir kopya depolanır, ancak sonuçlarda otomatik olarak döndürülemez. True olduğundastored
, bir dizini yeniden oluşturmak zorunda kalmadan istediğiniz zaman true ile false arasında geçişretrievable
yapabilirsiniz. False olduğundastored
falseretrievable
olmalıdır ve değiştirilemez.
vectorCompression, veri türleri ve saklı özelliği olan örnek dizin
Aşağıda dar veri türlerini, azaltılmış depolamayı ve vektör sıkıştırmasını belirten bir arama dizininin bileşik örneği verilmiştir.
- "HotelNameVector", özgün
Float32
değerleriFloat16
arama dizininde olduğu gibiCollection(Edm.Half)
ifade ederek öğesine yeniden yayınlayan dar bir veri türü örneği sağlar. - "HotelNameVector" da
stored
false olarak ayarlanmıştır. Sorgu yanıtında kullanılan ek eklemeler depolanmaz. False olduğundastored
,retrievable
false da olmalıdır. - "DescriptionVector" vektör sıkıştırma örneği sağlar. Vektör sıkıştırma dizinde tanımlanır, profilde başvurulur ve ardından bir vektör alanına atanır. "DescriptionVector" da false olarak ayarlanmıştır
stored
.
### Create a new index
POST {{baseUrl}}/indexes?api-version=2024-03-01-preview HTTP/1.1
Content-Type: application/json
api-key: {{apiKey}}
{
"name": "hotels-vector-quickstart",
"fields": [
{
"name": "HotelId",
"type": "Edm.String",
"searchable": false,
"filterable": true,
"retrievable": true,
"sortable": false,
"facetable": false,
"key": true
},
{
"name": "HotelName",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": true,
"sortable": true,
"facetable": false
},
{
"name": "HotelNameVector",
"type": "Collection(Edm.Half)",
"searchable": true,
"retrievable": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "my-vector-profile-no-compression"
},
{
"name": "Description",
"type": "Edm.String",
"searchable": true,
"filterable": false,
"retrievable": false,
"sortable": false,
"facetable": false
},
{
"name": "DescriptionVector",
"type": "Collection(Edm.Single)",
"searchable": true,
"retrievable": false,
"dimensions": 1536,
"stored": false,
"vectorSearchProfile": "my-vector-profile-with-compression"
},
{
"name": "Category",
"type": "Edm.String",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": true
},
{
"name": "Tags",
"type": "Collection(Edm.String)",
"searchable": true,
"filterable": true,
"retrievable": true,
"sortable": false,
"facetable": true
},
{
"name": "Address",
"type": "Edm.ComplexType",
"fields": [
{
"name": "City", "type": "Edm.String",
"searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
},
{
"name": "StateProvince", "type": "Edm.String",
"searchable": true, "filterable": true, "retrievable": true, "sortable": true, "facetable": true
}
]
},
{
"name": "Location",
"type": "Edm.GeographyPoint",
"searchable": false,
"filterable": true,
"retrievable": true,
"sortable": true,
"facetable": false
}
],
"vectorSearch": {
"compressions": [
{
"name": "my-scalar-quantization",
"kind": "scalarQuantization",
"rerankWithOriginalVectors": true,
"defaultOversampling": 10.0,
"scalarQuantizationParameters": {
"quantizedDataType": "int8"
}
}
],
"algorithms": [
{
"name": "my-hnsw-vector-config-1",
"kind": "hnsw",
"hnswParameters":
{
"m": 4,
"efConstruction": 400,
"efSearch": 500,
"metric": "cosine"
}
},
{
"name": "my-hnsw-vector-config-2",
"kind": "hnsw",
"hnswParameters":
{
"m": 4,
"metric": "euclidean"
}
},
{
"name": "my-eknn-vector-config",
"kind": "exhaustiveKnn",
"exhaustiveKnnParameters":
{
"metric": "cosine"
}
}
],
"profiles": [
{
"name": "my-vector-profile-with-compression",
"compression": "my-scalar-quantization",
"algorithm": "my-hnsw-vector-config-1",
"vectorizer": null
},
{
"name": "my-vector-profile-no-compression",
"compression": null,
"algorithm": "my-eknn-vector-config",
"vectorizer": null
}
]
},
"semantic": {
"configurations": [
{
"name": "my-semantic-config",
"prioritizedFields": {
"titleField": {
"fieldName": "HotelName"
},
"prioritizedContentFields": [
{ "fieldName": "Description" }
],
"prioritizedKeywordsFields": [
{ "fieldName": "Tags" }
]
}
}
]
}
}
Fazla örnekleme kullanarak nicelenmiş vektör alanını sorgulama
Bu örnekteki sorgu söz dizimi, yerleşik skaler niceleme kullanılarak vektör alanlarına uygulanır. Varsayılan olarak, skaler niceleme kullanan vektör alanları, rerankWithOriginalVectors
daha küçük bir vektör dizininin etkilerini azaltmak için ve defaultOversampling
kullanır. Bu ayarlar arama dizininde belirtilir.
Sorguda, oversampling varsayılan değerini 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/[index-name]/docs/search?api-version=2024-05-01-Preview
Content-Type: application/json
api-key: [admin key]
{
"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.
Ayrıca bkz.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin