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 para reduzir o tamanho do vetor porque reduz o consumo de memória e armazenamento em disco para incorporações float16 e float32. Para compensar os efeitos da compactação com perdas, você pode adicionar sobreamostragem e repontuação em vetores não compactados.
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
scalarQuantization
configuração oubinaryQuantization
e dar-lhe um nome - Definir propriedades opcionais para atenuar os efeitos da indexação com perdas
- 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 quantizados durante a indexação com a configuração definida
- Opcionalmente, consulte dados quantizados usando o parâmetro de sobreamostragem se quiser substituir o padrão
Pré-requisitos
- Campos vetoriais em um índice de pesquisa com uma
vectorSearch
configuração, usando os algoritmos Hierarchical Navigable Small Worlds (HNSW) ou exaustivos K-nearest neighbor (eKNN) 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 automaticamente 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 até 28 vezes o tamanho do índice vetorial reduzido.
Adicionar "compressões" a um índice de pesquisa
O exemplo a seguir mostra uma definição de índice parcial com uma coleção de campos que inclui um campo de vetor e uma vectorSearch.compressions
seção.
Inclui ambos ou scalarQuantization
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 novas 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 você deve adotar a nova sintaxe no código que visa 2024-11-01-preview e versões 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": [ ],
"algorithms": [ ],
"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 comoscalarQuantization
oubinaryQuantization
.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 questored
seja falso. Esta propriedade é opcional. A predefinição é verdadeiro.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 nok
na consulta, com um multiplicador de sobreamostragem. Por exemplo, se a consulta especificar umk
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 osk
melhores resultados reclassificados são retornados. Esta propriedade é opcional. O padrão é 4.quantizedDataType
é opcional e aplica-se apenas à quantização escalar. Se você adicioná-lo, ele deve ser definido comoint8
. 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 KNN exaustivo na API REST 2024-11-01-preview. Para a versão estável, use apenas 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.
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> ] }
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)
eCollection(Edm.Half)
, respectivamente.{ "name": "vectorContent", "type": "Collection(Edm.Single)", "searchable": true, "retrievable": true, "dimensions": 1536, "vectorSearchProfile": "vector-profile-hnsw-scalar", }
Carregue o índice usando indexadores para indexação de modelo pull ou APIs para indexação de modelo push.
Como funciona a quantização escalar na Pesquisa de IA do Azure
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.
Como funciona a quantização binária na Pesquisa de IA do Azure
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 tentar escalar. Além disso, descobrimos que o BQ 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 parâmetros associados à sobreamostragem ou repontuação com vetores originais.
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, você pode 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 rerankWithOriginalVectors
definição OR defaultOversampling
. O fornecimento 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 vetoriais que sofrem compressão vetorial, de acordo com a atribuição de perfil vetorial.
Substitui o valor ou introduz a
defaultOversampling
sobreamostragem no momento da consulta, mesmo que a configuração de compactação do índice não tenha especificado opções de sobreamostragem ou reclassificação.