Compartilhar via


Compactar vetores usando a compartimentalização escalar ou binária

A Pesquisa de IA do Azure dá suporte à compartimentalização escalar e binária para reduzir o tamanho dos vetores em um índice de pesquisa. A quantização é recomendada porque reduz o uso tanto da memória quanto do armazenamento em disco para embeddings float16 e float32. Para compensar os efeitos da compressão com perdas, você pode adicionar sobreamostragem e redefinição de pontuaçã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
  • Adicione uma configuração de scalarQuantization ou binaryQuantization e forneça um nome a ela
  • Defina propriedades opcionais para atenuar os efeitos da indexação com perdas
  • Crie um novo perfil de vetor que usa a configuração nomeada
  • Crie o campo vetorial com o novo perfil de vetor
  • Carregue o índice com dados do tipo float32 ou float16 que são quantizados durante o processo de indexação com a configuração que você definiu.
  • Opcionalmente, consulte dados quantizados usando o parâmetro oversampling. Se o campo vetorial não especificar superamostragem em sua definição, você poderá adicioná-lo no momento da consulta.

Dica

Azure AI Search: Reduza os custos de vetores em até 92,5%% com novas técnicas de compressão compara estratégias de compressão e explica as economias em armazenamento e custos. Ele também inclui métricas para medir a relevância com base no NDCG (ganho cumulativo com desconto normalizado), 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 algoritmo exaustivo K-vizinho mais próximo (eKNN) e um novo perfil vetorial.

Técnicas de quantização suportadas

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

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

  • A quantização escalar comprime valores flutuantes em tipos de dados mais restritos. A Pesquisa de IA atualmente dá suporte ao int8, que é de 8 bits, reduzindo o tamanho do índice vetorial quatro vezes.

  • A compartimentalização binária converte floats em bits binários, o que ocupa 1 bit. Isso resulta em um tamanho de índice vetorial até 28 vezes menor.

Observação

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

A reclassificação é uma técnica usada para compensar a perda de informações devido à compressão vetorial. Ele usa superamostragem para coletar vetores extras e informações suplementares para reavaliar os resultados iniciais encontrados pela consulta. As informações suplementares são vetores originais descompactados de precisão total - ou somente para quantização binária - você tem a opção de reavaliar usando os candidatos de documentos quantizados binários em relação ao vetor de consulta. As opções de recortação são especificadas no índice, mas você pode invocar a recortação no momento da consulta se o índice der suporte a ele.

As versões da API determinam qual comportamento de reavaliação está operacional para o seu código. A API de visualização mais recente oferece suporte a uma nova abordagem de repontuação para quantização binária. Índices criados com 2025-03-01-preview podem usar os novos comportamentos de repontuação.

Versão da API Tipo de quantização Reclassificando propriedades
2024-07-01 Quantização escalar e binária, em índices vetoriais criados usando grafos hierárquicos de HNSW (Navigable Small World) para pesquisa de similaridade rerankWithOriginalVectors
2024-11-01-preview Quantização escalar e binária em grafos HNSW rescoringOptions.enableRescoring e rescoreStorageMethod.preserveOriginals
2025-03-01-preview Quantização binária em grafos HNSW As combinações de parâmetros anteriores ainda têm suporte, mas a quantização binária agora pode ser pontuada novamente se as inserções originais forem excluídas: rescoringOptions.enableRescoring e rescoringOptions.rescoreStorageMethod=discardOriginals

Somente grafos HNSW permitem a reclassificação. Exaustivo K Vizinhos Mais Próximos (eKNN) não dá suporte à reclassificação.

O processo generalizado para repontuação é:

  1. A consulta vetor é executada em campos de vetor compactados.
  2. A consulta vetorial retorna os k principais candidatos superamostrados.
  3. Candidatos k superamostrados são repontuados usando os vetores originais não compactados ou o produto escalar 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 de campos que inclui um campo de vetor.

O exemplo de compactação inclui ambos scalarQuantization ou binaryQuantization. Você pode especificar quantas configurações de compactação forem necessárias e atribuir as que deseja a um perfil de vetor.

A sintaxe para vectorSearch.Compressions varia entre as APIs REST estáveis e de pré-visualização, com a pré-visualização adicionando mais opções para otimização de armazenamento, além das mudanças 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 às versões 2024-11-01-preview e futuras.

Use 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 originais e não compactados para recalcular a similaridade e reordenar os resultados principais retornados pela consulta de pesquisa inicial. Os vetores não compactados existem no índice de pesquisa mesmo que stored seja false. Essa propriedade é opcional. O padrão é verdadeiro.

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

  • quantizedDataType é opcional e se aplica somente à compartimentalização escalar. Se você adicioná-lo, deve ser definido como int8. Esse é o único tipo de dados primitivo com suporte para compartimentalização escalar no momento. O padrão é int8.

Adicionar o algoritmo da busca em vetores

Você pode usar o algoritmo HNSW ou o KNN exaustivo na API REST 2024-11-01-preview ou posterior. Para a versão estável, use somente HNSW. Se você quiser reavaliar, você 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 compartimentalização, você deve criar um novo perfil de vetor. A criação de um novo perfil de vetor é necessária para criar í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 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 de vetor. O tipo de dados de campo é float32 ou float16.

    Na Pesquisa de IA do Azure, os equivalentes de EDM (Modelo de Dados de Entidade) 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 de pull ou APIs para indexação de modelo push.

A quantização escalar reduz a resolução de cada número em cada vetor de incrustação. 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 (normalmente 99º percentil 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 compartimentalização escalar de 8 bits, há 2^8 ou 256 compartimentos possíveis.

Cada componente do vetor é mapeado para o valor representativo mais próximo dentro desse conjunto de níveis de compartimentalização em um processo semelhante ao arredondamento de um número real para o inteiro mais próximo. No vetor de 8 bits quantificado, o número do identificador fica no lugar do valor original. Após a quantização, cada vetor é representado por um array de identificadores para as faixas às quais seus componentes pertencem. Esses vetores quantificados exigem muito menos bits para armazenar em comparação com o vetor original, reduzindo assim os requisitos de armazenamento e o volume de memória.

A compartimentalização binária compacta vetores de alta dimensão, representando cada componente como um único bit, 0 ou 1. Esse método reduz drasticamente o volume de 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 parâmetro de comparação mostram uma redução de até 96% no tamanho do índice vetorial.

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

Consultar um campo de vetor quantizado usando sobreamostragem

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

Lembre-se de que a definição de compactação de vetor no índice tem configurações para rerankWithOriginalVectors e defaultOversampling para atenuar os efeitos da compactaçã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, você poderá alterá-lo para outra coisa na solicitação 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 efetivo rerankWithOriginalVectors 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 de vetor que passam por compactação de vetor, de acordo com a atribuição de perfil de vetor.

  • Substitui o valor defaultOversampling ou introduz superamostragem no momento da consulta, mesmo que a configuração de compactação do índice não tenha especificado opções de superamostragem ou reclassificação.