Partilhar via


Comprimir vetores usando quantização escalar ou binária

O Azure AI Search dá suporte à quantização escalar e binária para reduzir o tamanho dos vetores em um índice de pesquisa. A quantização é recomendada porque reduz a memória e o armazenamento em disco para incorporações float16 e float32. Para compensar os efeitos da compactação com perdas, pode-se adicionar sobreamostragem e reavaliação.

Para usar a quantização interna, siga estas etapas:

  • Comece com campos vetoriais e uma vectorSearch configuração para um índice
  • Adicionar vectorSearch.compressions
  • Adicionar uma configuração scalarQuantization ou binaryQuantization e dar-lhe um nome
  • Definir propriedades opcionais para atenuar os efeitos da indexação destrutiva
  • Criar um novo perfil de vetor que usa a configuração nomeada
  • Criar um novo campo vetorial com o novo perfil vetorial
  • Carregue o índice com dados float32 ou float16 que são quantizados durante a indexação com a configuração que definiu.
  • Opcionalmente, consulte dados quantificados usando o parâmetro de sobreamostragem. Se o campo de vetor não especificar a sobreamostragem em sua definição, você poderá adicioná-lo no momento da consulta.

Sugestão

Azure AI Search: Reduza os custos de vetor até 92,5% com novas técnicas de compressão compara estratégias de compressão e explica a economia em armazenamento e custos. Ele também inclui métricas para medir a relevância com base no ganho cumulativo descontado normalizado (NDCG), demonstrando que você pode compactar seus dados sem sacrificar a qualidade da pesquisa.

Pré-requisitos

  • Campos vetoriais em um índice de pesquisa, com uma vectorSearch configuração especificando o algoritmo Hierarchical Navigable Small Worlds (HNSW) ou o exaustivo K-Nearest Neighbor (KNN) e um novo perfil vetorial.

Técnicas de quantização suportadas

A quantização aplica-se a campos vetoriais que recebem vetores do tipo float. Nos exemplos deste artigo, o tipo de dados do campo é Collection(Edm.Single) para incorporações float32 de entrada, mas float16 também é suportado. Quando os vetores são recebidos em um campo com compressão configurada, o mecanismo executa a quantização para reduzir a pegada dos dados vetoriais na memória e no disco.

Dois tipos de quantização são suportados:

  • A quantização escalar compacta valores flutuantes em tipos de dados mais estreitos. O AI Search atualmente suporta int8, que é de 8 bits, reduzindo o tamanho do índice vetorial quatro vezes.

  • A quantização binária converte flutuações em bits binários, que ocupam 1 bit. Isso resulta em uma redução do tamanho do índice vetorial em até 28 vezes.

Nota

Embora os serviços gratuitos ofereçam suporte à quantização, eles não demonstram a economia total de armazenamento devido à cota de armazenamento limitada.

Rescoring é uma técnica usada para compensar a perda de informações devido à compressão vetorial. Usa a sobreamostragem para obter vetores extras e informações suplementares para reavaliar os resultados iniciais encontrados pela consulta. As informações suplementares são vetores originais de precisão total não compactados ou, apenas para quantização binária, tem a opção de reavaliar usando os candidatos a documentos quantizados binariamente em relação ao vetor de consulta. As opções de repontuação são especificadas no índice, mas você pode invocar a repontuação no momento da consulta se o índice oferecer suporte a ela.

As versões da API determinam qual comportamento de reavaliação é operacional para o seu código. A API de visualização mais recente suporta uma nova abordagem de repontuação para quantização binária. Os índices criados com 2025-03-01-preview podem usar os novos métodos de repontuação.

Versão da API Tipo de quantização Reclassificação de propriedades
2024-07-01 Quantização escalar e binária, em índices vetoriais construídos usando gráficos Hierarchical Navigable Small World (HNSW) para pesquisa de similaridade rerankWithOriginalVectors
2024-11-01-pré-visualização Quantização escalar e binária em gráficos HNSW rescoringOptions.enableRescoring e rescoreStorageMethod.preserveOriginals
2025-03-01-pré-visualização Quantização binária em gráficos HNSW As combinações de parâmetros anteriores ainda são suportadas, mas a quantização binária agora pode ser reavaliada se os embeddings originais forem excluídos: rescoringOptions.enableRescoring e rescoringOptions.rescoreStorageMethod=discardOriginals

Apenas os gráficos HNSW permitem a reavaliação de pontuação. O KNN exaustivo não suporta a reclassificação.

O processo generalizado de repontuação é:

  1. A consulta vetorial é executada sobre campos vetoriais compactados.
  2. A consulta vetorial retorna os k candidatos superamostrados mais relevantes.
  3. Os candidatos k sobreamostrados são repontuados usando os vetores originais não compactados ou o produto ponto da quantização binária. 1 Após a repontuação, os resultados são ajustados para que as correspondências mais relevantes apareçam primeiro.

Adicionar "compressões" a um índice de pesquisa

Esta seção explica como especificar uma vectorsSearch.compressions seção no índice. O exemplo a seguir mostra uma definição de índice parcial com uma coleção fields que inclui um campo vetorial.

O exemplo de compactação inclui ambos scalarQuantization e binaryQuantization. Você pode especificar quantas configurações de compactação precisar e, em seguida, atribuir as que deseja a um perfil de vetor.

A sintaxe para vectorSearch.Compressions varia entre APIs REST estáveis e de visualização, com a visualização adicionando mais opções para otimização de armazenamento, além de alterações na sintaxe existente. A compatibilidade com versões anteriores é preservada por meio de mapeamentos internos de API, mas recomendamos a adoção das propriedades mais recentes no código destinado a 2024-11-01-preview e versões futuras.

Utilize a API REST Criar Índice ou Criar ou Atualizar Índice para definir as configurações de compactação.

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": [ 
      {
          "name": "vector-profile-1",
          "algorithm": "use-hnsw",
          "compression": "use-scalar"
      }
    ],
    "algorithms": [ 
      {
        "name": "use-hnsw",
        "kind": "hnsw",
        "hnswParameters": { },
        "exhaustiveKnnParameters": null
      }
    ],
    "compressions": [
      {
        "name": "use-scalar",
        "kind": "scalarQuantization",
        "scalarQuantizationParameters": {
          "quantizedDataType": "int8"
        },
        "rerankWithOriginalVectors": true,
        "defaultOversampling": 10
      },
      {
        "name": "use-binary",
        "kind": "binaryQuantization",
        "rerankWithOriginalVectors": true,
        "defaultOversampling": 10
      }
    ]
  }
}

Pontos principais:

  • kind deve ser definido como scalarQuantization ou binaryQuantization.

  • rerankWithOriginalVectors usa os vetores não compactados originais para recalcular a semelhança e reclassificar os principais resultados retornados pela consulta de pesquisa inicial. Os vetores não compactados existem no índice de pesquisa, mesmo que stored seja falso. Esta propriedade é opcional. A predefinição é verdadeira.

  • defaultOversampling considera um conjunto mais amplo de resultados potenciais para compensar a redução da informação a partir da quantização. A fórmula para resultados potenciais consiste no k na consulta, com um multiplicador de sobreamostragem. Por exemplo, se a consulta especificar um k de 5 e a sobreamostragem for 20, a consulta solicitará efetivamente 100 documentos para uso na reclassificação, usando o vetor não compactado original para essa finalidade. Apenas os k melhores resultados reclassificados são retornados. Esta propriedade é opcional. O padrão é 4.

  • quantizedDataType é opcional e aplica-se apenas à quantização escalar. Se o adicionar, deve ser definido como int8. Este é o único tipo de dados primitivo suportado para quantização escalar no momento. A predefinição é int8.

Adicionar o algoritmo de pesquisa vetorial

Você pode usar o algoritmo HNSW ou eKNN na API REST 2024-11-01-preview ou posterior. Para a versão estável, use apenas HNSW. Caso queira rever a pontuação, deve escolher HNSW.

"vectorSearch": {
    "profiles": [ ],
    "algorithms": [
      {
          "name": "use-hnsw",
          "kind": "hnsw",
          "hnswParameters": {
              "m": 4,
              "efConstruction": 400,
              "efSearch": 500,
              "metric": "cosine"
          }
      }
    ],
     "compressions": [ <see previous section>] 
}

Criar e atribuir um novo perfil de vetor

Para usar uma nova configuração de quantização, você deve criar um novo perfil vetorial. A criação de um novo perfil vetorial é necessária para a construção de índices compactados na memória. Seu novo perfil usa HNSW.

  1. Na mesma definição de índice, crie um novo perfil de vetor e adicione uma propriedade de compactação e um algoritmo. Aqui estão dois perfis, um para cada abordagem de quantização.

    "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. Atribua um perfil de vetor a um novo campo vetorial. O tipo de dados do campo é float32 ou float16.

    No Azure AI Search, os equivalentes do Modelo de Dados de Entidade (EDM) dos tipos float32 e float16 são Collection(Edm.Single) e Collection(Edm.Half), respectivamente.

    {
       "name": "vectorContent",
       "type": "Collection(Edm.Single)",
       "searchable": true,
       "retrievable": true,
       "dimensions": 1536,
       "vectorSearchProfile": "vector-profile-hnsw-scalar",
    }
    
  3. Carregue o índice usando indexadores para indexação de modelo pull ou APIs para indexação de modelo push.

A quantização escalar reduz a resolução de cada número dentro de cada incorporação vetorial. Em vez de descrever cada número como um número de ponto flutuante de 16 bits ou 32 bits, ele usa um inteiro de 8 bits. Ele identifica um intervalo de números (tipicamente percentil 99 mínimo e máximo) e os divide em um número finito de níveis ou compartimento, atribuindo a cada compartimento um identificador. Na quantização escalar de 8 bits, existem 2^8, ou 256, compartimentos possíveis.

Cada componente do vetor é mapeado para o valor representativo mais próximo dentro deste conjunto de níveis de quantização em um processo semelhante ao arredondamento de um número real para o inteiro mais próximo. No vetor quantizado de 8 bits, o número identificador substitui o valor original. Após a quantização, cada vetor é representado por uma matriz de identificadores para os compartimentos aos quais seus componentes pertencem. Esses vetores quantizados exigem muito menos bits para armazenar em comparação com o vetor original, reduzindo assim os requisitos de armazenamento e o espaço ocupado pela memória.

A quantização binária comprime vetores de alta dimensão representando cada componente como um único bit, 0 ou 1. Esse método reduz drasticamente o espaço ocupado pela memória e acelera as operações de comparação de vetores, que são cruciais para tarefas de pesquisa e recuperação. Os testes de referência mostram até 96% de redução no tamanho do índice vetorial.

É particularmente eficaz para incorporações com dimensões superiores a 1024. Para dimensões menores, recomendamos testar a qualidade da quantização binária ou usar quantização escalar. Além disso, descobrimos que a quantização binária funciona muito bem quando as incorporações são centradas em zero. Os modelos de incorporação mais populares, como OpenAI, Cohere e Mistral, são centrados em torno de zero.

Consultar um campo vetorial quantizado usando sobreamostragem

A sintaxe de consulta para um campo vetorial compactado ou quantizado é a mesma que para campos vetoriais não compactados, a menos que você queira substituir os parâmetros associados à sobreamostragem e à repontuação. Você pode adicionar um parâmetro o para invocar sobreamostragem e repontuação no momento da consulta.

Lembre-se de que a definição de compressão vetorial no índice tem configurações para rerankWithOriginalVectors e defaultOversampling para mitigar os efeitos da compressão com perdas. Você pode substituir os valores padrão para variar o comportamento no momento da consulta. Por exemplo, se defaultOversampling for 10.0, poderá alterá-lo para outro valor no pedido de consulta.

Você pode definir o parâmetro de sobreamostragem mesmo que o índice não tenha explicitamente uma definição rerankWithOriginalVectors ou defaultOversampling. Fornecer oversampling no momento da consulta substitui as configurações de índice para essa consulta e executa a consulta com um rerankWithOriginalVectors efetivo como verdadeiro.

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   
        }
  ]    
}

Pontos principais:

  • Aplica-se a campos vetoriais que sofrem compressão vetorial, de acordo com a atribuição de perfil vetorial.

  • Substitui o valor defaultOversampling ou introduz sobreamostragem durante a consulta, mesmo que a configuração de compactação do índice não especifique opções de sobreamostragem ou reclassificação.