Share via


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'sinde yeni veri türleri, vektör sıkıştırma özellikleri ve stored özelliği sağlanır.

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?
Vektör alanlarına daha küçük ilkel veri türleri atama , Int16ve gibi Float16dar veri türleri bellekte ve Int8diskte 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.
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.
Skaler niceleme ekleme Yerel Float32 eklemeleri 'ye sıkıştırmak için yerleşik skaler Int8niceleme 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.

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.

1. Seçenek: 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.

  1. 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 nokta
    • Collection(Edm.Int16) 16 bit işaretli tamsayı
    • Collection(Edm.SByte) 8 bit işaretli tamsayı

    Not

    İkili veri türleri şu anda desteklenmiyor.

  2. 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 Int8olabilirInt16. 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 Float32Collection(Edm.Single) sahiptir. 'den floatint türe dönüştürme yasaklandığından bu çıkışı Int8 ile eşleyemezsiniz. Bununla birlikte, öğesinden Float32 (veya Collection(Edm.Half)) türüne Float16 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) veya Collection(Edm.Half)
    metin ekleme-3-küçük Float32 Collection(Edm.Single) veya Collection(Edm.Half)
    metin ekleme-3-büyük Float32 Collection(Edm.Single) veya Collection(Edm.Half)
    int8 embedding_type ile V3 ekleme modellerini uyumlu yapma Int8 Collection(Edm.SByte)
  3. 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.

  4. Dizini tanımlayın ve oluşturun. Bu adım için Azure portalı, 2024-03-01-preview veya beta Azure SDK paketini kullanabilirsiniz.

  5. 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 2: 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. 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.

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.

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-03-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 ve retrievable 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ğunda stored , bir dizini yeniden oluşturmak zorunda kalmadan istediğiniz zaman true ile false arasında geçiş retrievable yapabilirsiniz. False olduğunda stored false retrievable olmalıdır ve değiştirilemez.

Seçenek 3: 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 de rerankWithOriginalVectors 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ır scalarQuantization. Ş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 olsa stored bile arama dizininde bulunur. Bu özellik isteğe bağlıdır. Varsayılanı doğrudur

  • defaultOversampling , 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şur k . Örneğin, sorgu 5'ini k 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 üstteki k 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ır int8. Şu anda desteklenen tek temel veri türü budur. Bu özellik isteğe bağlıdır. Varsayılan int8 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.

  1. 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
       }
     ]
    
  2. Yeni bir vektör alanına vektör profili atayın. Skaler niceleme, içeriği olarak Int8azaltır, bu nedenle içeriğinizin veya Float16olduğundan Float32 emin olun.

    Azure AI Search'te ve Float16 türlerinin Varlık Veri Modeli (EDM) eşdeğerleri Float32 sırasıyla ve Collection(Edm.Half)şeklindedirCollection(Edm.Single).

    {
       "name": "DescriptionVector",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "my-vector-profile"
    }
    
  3. Çekme modeli dizin oluşturma için dizin oluşturucuları veya gönderme modeli dizin oluşturma API'lerini kullanarak dizini yükleyin.

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.

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ğerleri Float16arama dizininde olduğu gibi Collection(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ğunda stored , 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-03-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.