Aracılığıyla paylaş


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 ekle
  • scalarQuantization Veya binaryQuantization 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

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 binaryQuantizationiç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:

  • kindveya binaryQuantizationolarak 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 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 isteğe bağlıdır ve yalnızca skaler niceleme için geçerlidir. Eklerseniz, olarak ayarlanmalıdır int8. Bu, şu anda skaler niceleme için desteklenen tek ilkel veri türüdür. Varsayılan int8 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.

  1. 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> ] 
    }
    
  2. 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",
    }
    
  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ı 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.

İ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.