Relevância na busca em vetores

Durante a execução da consulta em vetores, o mecanismo de pesquisa procura vetores semelhantes para encontrar os melhores candidatos a serem retornados nos resultados da pesquisa. Dependendo de como você indexou o conteúdo vetorial, a pesquisa por correspondências relevantes é completa ou restrita a vizinhos próximos para processamento mais rápido. Depois que os candidatos são encontrados, as métricas de similaridade são usadas para pontuar cada resultado com base na força da correspondência.

Este artigo explica os algoritmos usados para encontrar correspondências relevantes e as métricas de similaridade usadas para pontuação. Também oferece dicas para aumentar a relevância se os resultados da busca não atenderem às expectativas.

Os algoritmos da busca em vetores incluem o K Vizinhos Mais Próximos (KNN) exaustivo e o Mundo Pequeno Navegável Hierárquico (HNSW).

Somente os campos marcados como searchable no índice ou como searchFields na consulta são usados para a pesquisa e pontuação.

Quando usar o KNN completo

O KNN exaustivo calcula as distâncias entre todos os pares de pontos de dados e encontra os k vizinhos mais próximos exatos para um ponto de consulta. Esse algoritmo destina-se a cenários em que um alto recall é de extrema importância e os usuários estão dispostos a aceitar uma maior latência da consulta para conseguir isso. Como ele utiliza bastante computação, use o KNN completo para conjuntos de dados pequenos a médios ou quando os requisitos de precisão compensam as considerações de desempenho da consulta.

Um caso de uso secundário é criar um conjunto de dados para avaliar o recall do algoritmo Vizinho Mais Próximo Aproximado. O KNN completo pode ser usado para criar o conjunto de verdades básicas de vizinhos mais próximos.

O suporte a KNN completo está disponível por meio da API REST 2023-11-01, da API REST 2023-10-01-Preview e nas bibliotecas de clientes do SDK do Azure direcionadas a qualquer versão da API REST.

Quando usar o HNSW

Durante a indexação, o HNSW cria estruturas de dados adicionais para uma busca mais rápida, organizando pontos de dados em uma estrutura de grafo hierárquica. O HNSW tem vários parâmetros de configuração que podem ser ajustados para alcançar os objetivos de taxa de transferência, latência e recall para o aplicativo de pesquisa. Por exemplo, no momento da consulta, você pode especificar opções para pesquisa completa, mesmo que o campo do vetor seja indexado para HNSW.

Durante a execução da consulta, o HNSW permite consultas de vizinhos rápidas ao navegar pelo grafo. Essa abordagem encontra um equilíbrio entre a precisão da busca e a eficiência computacional. O HNSW é recomendado para a maioria dos cenários devido à sua eficiência ao pesquisar conjuntos de dados maiores.

Como funciona a pesquisa de vizinho mais próximo

As consultas vetoriais são executadas em um espaço de inserção que consiste em vetores gerados do mesmo modelo de inserção. Geralmente, o valor de entrada em uma solicitação de consulta é alimentado no mesmo modelo de machine learning que gerou as inserções no índice vetorial. A saída é um vetor no mesmo espaço de inserção. Como os vetores semelhantes são agrupados juntos, encontrar correspondências é equivalente a localizar os vetores mais próximos do vetor de consulta e retornar os documentos associados como resultado da pesquisa.

Por exemplo, se uma solicitação de consulta for sobre hotéis, o modelo mapeará a consulta para um vetor que existe em algum lugar no cluster de vetores que representam documentos sobre hotéis. Identificar quais vetores são os mais semelhantes à consulta, com base em uma métrica de similaridade, determina quais documentos são os mais relevantes.

Quando os campos de vetor são indexados para KNN completo, a consulta é executada em relação a "todos os vizinhos". Para campos indexados para HNSW, o mecanismo de pesquisa usa um grafo do HNSW para pesquisar um subconjunto de nós no índice vetorial.

Como criar o grafo do HNSW

Durante a indexação, o serviço de busca constrói o grafo do HNSW. A meta de indexar um novo vetor em um grafo do HNSW é adicioná-lo à estrutura do grafo de uma maneira que permita uma pesquisa de vizinho mais próximo eficiente. O processo é resumido pelas seguintes etapas:

  1. Inicialização: comece com um grafo do HNSW vazio ou com o grafo do HNSW existente, se não for um novo índice.

  2. Ponto de entrada: esse é o nível superior do grafo hierárquico e atua como ponto de partida para indexação.

  3. Como adicionar ao grafo: diferentes níveis hierárquicos representam diferentes granularidades do grafo, em que os níveis mais altos são mais globais e os níveis inferiores são mais granulares. Cada nó no gráfico representa um ponto vetorial.

    • Cada nó está conectado a até m vizinhos próximos. Esse é o parâmetro m.

    • O número de pontos de dados que são considerados como conexões candidatas é regido pelo parâmetro efConstruction. Essa lista dinâmica forma o conjunto de pontos mais próximos no grafo existente para o algoritmo a ser considerado. Os valores mais altos de efConstruction fazem com que mais nós sejam considerados, o que geralmente leva a vizinhanças locais mais densas para cada vetor.

    • Essas conexões usam a similaridade configurada metric para determinar a distância. Algumas conexões são conexões de "longa distância" que se conectam entre diferentes níveis hierárquicos, criando atalhos no grafo que melhoram a eficiência da pesquisa.

  4. Remoção e otimização do grafo: isso pode acontecer depois de indexar todos os vetores e melhora a navegação e a eficiência do grafo do HNSW.

Uma consulta de vetor navega pela estrutura do grafo hierárquico para verificar se há correspondências. Veja a seguir o resumo das etapas no processo:

  1. Inicialização: o algoritmo inicia a pesquisa no nível superior do grafo hierárquico. Esse ponto de entrada contém o conjunto de vetores que atuam como pontos de partida para pesquisa.

  2. Passagem: em seguida, ele percorre o nível do grafo por nível, navegando do nível superior para os níveis mais baixos, selecionando nós candidatos que estão mais próximos do vetor de consulta com base na métrica de distância configurada, como similaridade de cosseno.

  3. Remoção: para melhorar a eficiência, o algoritmo remove o espaço de pesquisa considerando apenas os nós que provavelmente conterão os vizinhos mais próximos. Isso é feito mantendo uma fila de prioridade de possíveis candidatos e atualizando-a à medida que a pesquisa progride. O comprimento dessa fila é configurado pelo parâmetro efSearch.

  4. Refinamento: à medida que o algoritmo se move para níveis mais baixos e granulares, o HNSW considera mais vizinhos próximos à consulta, o que permite que o conjunto de vetores candidatos seja refinado, melhorando a precisão.

  5. Conclusão: a pesquisa é concluída quando o número desejado de vizinhos mais próximos é identificado ou quando outros critérios de interrupção são atendidos. Esse número desejado de vizinhos mais próximos é regido pelo parâmetro de tempo de consulta k.

Métricas de similaridade usadas para medir a proximidade

O algoritmo localiza os vetores candidatos para avaliar a similaridade. Para executar essa tarefa, um cálculo de métrica de similaridade compara o vetor candidato ao vetor de consulta e mede a similaridade. O algoritmo mantém o controle do conjunto ordenado da maioria dos vetores semelhantes encontrados, o que forma o conjunto de resultados classificado quando o algoritmo chega à conclusão.

Métrica Descrição
cosine Essa métrica mede o ângulo entre dois vetores e não é afetada por diferentes comprimentos de vetor. Matematicamente, ela calcula o ângulo entre dois vetores. O cosseno é a métrica de similaridade usada pelos modelos de inserção do Azure OpenAI. Portanto, se você estiver usando o Azure OpenAI, especifique cosine na configuração de vetor.
dotProduct Essa métrica mede o comprimento de cada par de dois vetores e o ângulo entre eles. Matematicamente, ela calcula os produtos das magnitudes dos vetores e o ângulo entre eles. Para vetores normalizados, isso é idêntico a similaridade de cosine, mas um desempenho um pouco melhor.
euclidean (também conhecida como l2 norm) Essa métrica mede o comprimento da diferença de vetor entre dois vetores. Matematicamente, ela calcula a distância euclidiana entre dois vetores, que é a norma l2 da diferença dos dois vetores.

Pontuações nos resultados da busca em vetores

As pontuações são calculadas e atribuídas a cada correspondência, com as correspondências mais altas retornadas como k resultados. A propriedade @search.score contém a pontuação. A tabela a seguir mostra o intervalo dentro do qual uma pontuação vai cair.

Método Search Parâmetro Métrica de pontuação Intervalo
busca em vetores @search.score Cosseno 0,333 a 1,00

Para a métrica de cosine, é importante observar que a @search.score calculada não é o valor de cosseno entre o vetor de consulta e os vetores de documento. Em vez disso, o Azure AI Search aplica transformações de modo que a função de pontuação diminui monotonicamente, o que significa que os valores de pontuação diminuirão sempre, à medida que a semelhança piorar. Essa transformação garante que as pontuações de pesquisa sejam utilizáveis para fins de classificação.

Há algumas nuances com pontuações de similaridade:

  • A similaridade do cosseno é definida como o cosseno do ângulo entre dois vetores.
  • A distância do cosseno é definida como 1 - cosine_similarity.

Para criar uma função decrescente monotonicamente, o @search.score é definido como 1 / (1 + cosine_distance).

Os desenvolvedores que precisam de um valor do cosseno, em vez do valor sintético, podem usar uma fórmula para converter a pontuação de pesquisa novamente para a distância do cosseno:

double ScoreToSimilarity(double score)
{
    double cosineDistance = (1 - score) / score;
    return  -cosineDistance + 1;
}

Ter o valor do cosseno original pode ser útil em soluções personalizadas que configuram limites para cortar os resultados dos resultados de baixa qualidade.

Dicas para refinar a relevância

Se não estiver obtendo resultados relevantes, experimente fazer alterações na configuração da consulta. Não existem recursos de refinamento específicos para consultas de vetor, como um perfil de pontuação ou promoção de um campo ou termo:

  • Experimente alterar o tamanho e a sobreposição da parte. Tente aumentar o tamanho da parte e garantir que haja sobreposição suficiente para preservar o contexto ou a continuidade entre partes.

  • Para o HNSW, tente diferentes níveis de efConstruction para alterar a composição interna do grafo de proximidade. O padrão é 400. O intervalo é de 100 a 1.000.

  • Aumente os k resultados para alimentar mais resultados de busca em um modelo de chat, se você estiver usando um.

  • Experimente consultas híbridas com classificação semântica. No teste de parâmetro de comparação, essa combinação produziu consistentemente os resultados mais relevantes.

Próximas etapas