Relevância na pesquisa vetorial

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

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

Os algoritmos de pesquisa vetorial incluem vizinhos k-nearest exaustivos (KNN) e Hierarchical Navigable Small World (HNSW).

Apenas os campos vetoriais marcados como searchable no índice, ou como searchFields na consulta, são usados para pesquisar e pontuar.

Quando usar a KNN exaustiva

A KNN exaustiva calcula as distâncias entre todos os pares de pontos de dados e encontra os vizinhos exatos k mais próximos de um ponto de consulta. Destina-se a cenários em que a alta recuperação é de extrema importância e os usuários estão dispostos a aceitar as compensações na latência da consulta. Como é computacionalmente intensivo, use KNN exaustivo para conjuntos de dados pequenos e médios ou quando os requisitos de precisão superarem as considerações de desempenho da consulta.

Um caso de uso seconário é construir um conjunto de dados para avaliar a recuperação aproximada do algoritmo vizinho mais próximo. O KNN exaustivo pode ser usado para construir o conjunto de verdades básicas dos vizinhos mais próximos.

O suporte exaustivo a KNN está disponível através da API REST 2023-11-01, da API REST 2023-10-01-Preview e nas bibliotecas de cliente do SDK do Azure destinadas a qualquer versão da API REST.

Quando utilizar HNSW

Durante a indexação, o HNSW cria estruturas de dados extras para uma pesquisa mais rápida, organizando pontos de dados em uma estrutura gráfica hierárquica. O HNSW tem vários parâmetros de configuração que podem ser ajustados para atingir a taxa de transferência, latência e objetivos de recuperação para seu aplicativo de pesquisa. Por exemplo, no momento da consulta, você pode especificar opções para pesquisa exaustiva, mesmo que o campo vetorial esteja indexado para HNSW.

Durante a execução da consulta, o HNSW permite consultas vizinhas rápidas navegando pelo gráfico. Esta abordagem estabelece um equilíbrio entre a precisão da pesquisa e a eficiência computacional. O HNSW é recomendado para a maioria dos cenários devido à sua eficiência ao pesquisar em conjuntos de dados maiores.

Como funciona a pesquisa de vizinhos mais próximos

As consultas vetoriais são executadas em um espaço de incorporação que consiste em vetores gerados a partir do mesmo modelo de incorporação. Geralmente, o valor de entrada dentro de uma solicitação de consulta é alimentado no mesmo modelo de aprendizado de máquina que gerou incorporações no índice vetorial. A saída é um vetor no mesmo espaço de incorporação. Como vetores semelhantes são agrupados próximos, encontrar correspondências é equivalente a encontrar 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 mapeia a consulta em um vetor que existe em algum lugar no cluster de vetores que representam documentos sobre hotéis. Identificar quais vetores são mais semelhantes à consulta, com base em uma métrica de similaridade, determina quais documentos são os mais relevantes.

Quando os campos vetoriais são indexados para KNN exaustivo, a consulta é executada em relação a "todos os vizinhos". Para campos indexados para HNSW, o mecanismo de pesquisa usa um gráfico HNSW para pesquisar sobre um subconjunto de nós dentro do índice vetorial.

Criando o gráfico HNSW

Durante a indexação, o serviço de pesquisa constrói o gráfico HNSW. O objetivo de indexar um novo vetor em um gráfico HNSW é adicioná-lo à estrutura do gráfico de uma maneira que permita uma pesquisa eficiente do vizinho mais próximo. As etapas a seguir resumem o processo:

  1. Inicialização: comece com um gráfico HNSW vazio ou o gráfico HNSW existente se não for um novo índice.

  2. Ponto de entrada: Este é o nível superior do gráfico hierárquico e serve como ponto de partida para a indexação.

  3. Adicionando ao gráfico: Diferentes níveis hierárquicos representam diferentes granularidades do gráfico, com níveis mais altos sendo mais globais e níveis mais baixos sendo mais granulares. Cada nó no gráfico representa um ponto vetorial.

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

    • O número de pontos de dados considerados como conexões candidatas é regido efConstruction pelo parâmetro. Esta lista dinâmica forma o conjunto de pontos mais próximos no gráfico existente para o algoritmo considerar. Valores mais altos efConstruction resultam em mais nós sendo considerados, o que muitas vezes leva a bairros locais mais densos para cada vetor.

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

  4. Poda e otimização de gráficos: Isso pode acontecer após a indexação de todos os vetores e melhora a navegabilidade e a eficiência do gráfico HNSW.

Uma consulta vetorial navega na estrutura hierárquica do gráfico para procurar correspondências. A seguir, resume as etapas do processo:

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

  2. Travessia: Em seguida, ele percorre o gráfico nível por nível, navegando do nível superior para o nível inferior, selecionando nós candidatos que estão mais próximos do vetor de consulta com base na métrica de distância configurada, como semelhança de cosseno.

  3. Poda: Para melhorar a eficiência, o algoritmo elimina o espaço de pesquisa considerando apenas os nós que provavelmente contêm vizinhos mais próximos. Isto é conseguido mantendo uma fila prioritária de potenciais candidatos e atualizando-a à medida que a pesquisa progride. O comprimento desta 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 candidato seja refinado, melhorando a precisão.

  5. Conclusão: A pesquisa é concluída quando o número desejado de vizinhos mais próximos tiver sido identificado ou quando outros critérios de parada forem atendidos. Esse número desejado de vizinhos mais próximos é regido pelo parâmetro kquery-time.

Métricas de semelhança usadas para medir a proximidade

O algoritmo encontra vetores candidatos para avaliar a semelhança. Para executar essa tarefa, um cálculo de métrica de similaridade compara o vetor candidato ao vetor de consulta e mede a semelhança. O algoritmo mantém o controle do conjunto ordenado da maioria dos vetores semelhantes que ele encontrou, que forma o conjunto de resultados classificados quando o algoritmo atingiu a conclusão.

Métrico Description
cosine Esta métrica mede o ângulo entre dois vetores e não é afetada por diferentes comprimentos vetoriais. Matematicamente, calcula o ângulo entre dois vetores. Cosine é a métrica de semelhança usada pelos modelos de incorporação do Azure OpenAI, portanto, se você estiver usando o Azure OpenAI, especifique cosine na configuração do vetor.
dotProduct Esta métrica mede o comprimento de cada par de dois vetores e o ângulo entre eles. Matematicamente, calcula os produtos das magnitudes dos vetores e o ângulo entre eles. Para vetores normalizados, isso é idêntico à cosine semelhança, mas um pouco mais performante.
euclidean (também conhecido/a l2 normpor ) Esta métrica mede o comprimento da diferença vetorial entre dois vetores. Matematicamente, calcula a distância euclidiana entre dois vetores, que é a norma l2 da diferença dos dois vetores.

Pontuações em resultados de pesquisa vetorial

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

Método de pesquisa Parâmetro Métrica de pontuação Intervalo
pesquisa vetorial @search.score Cosina 0.333 - 1.00

Paracosine métrica, é importante observar que o calculado @search.score não é o valor cosseno entre o vetor de consulta e os vetores de documento. Em vez disso, a Pesquisa de IA do Azure aplica transformações de tal forma que a função de pontuação está monotonicamente diminuindo, o que significa que os valores de pontuação sempre diminuirão de valor à medida que a semelhança piorar. Essa transformação garante que as pontuações de pesquisa sejam utilizáveis para fins de classificação.

Existem algumas nuances com pontuações de semelhança:

  • A semelhança cosseno é definida como o cosseno do ângulo entre dois vetores.
  • A distância cossena é definida como 1 - cosine_similarity.

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

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

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

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

Dicas para ajuste de relevância

Se você não estiver obtendo resultados relevantes, experimente alterações na configuração da consulta. Não há recursos específicos de ajuste, como um perfil de pontuação ou aumento de campo ou termo, para consultas vetoriais:

  • Experimente o tamanho do pedaço e a sobreposição. Tente aumentar o tamanho do bloco e garantir que haja sobreposição suficiente para preservar o contexto ou a continuidade entre os blocos.

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

  • Aumente k os resultados para alimentar mais resultados de pesquisa em um modelo de bate-papo, se você estiver usando um.

  • Experimente consultas híbridas com classificação semântica. Nos testes de referência, esta combinação produziu consistentemente os resultados mais relevantes.

Próximos passos