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 aos vizinhos mais 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.
Algoritmos utilizados na pesquisa vetorial
Os algoritmos de pesquisa vetorial incluem vizinhos k-nearest exaustivos (KNN) e Hierarchical Navigable Small World (HNSW).
A KNN exaustiva realiza uma pesquisa de força bruta que verifica todo o espaço vetorial.
O HNSW realiza uma pesquisa aproximada de vizinho mais próximo (ANN).
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 secundá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.
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:
Inicialização: comece com um gráfico HNSW vazio ou o gráfico HNSW existente se não for um novo índice.
Ponto de entrada: Este é o nível superior do gráfico hierárquico e serve como ponto de partida para a indexação.
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 é om
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 altosefConstruction
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.
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.
Navegando no gráfico HNSW no momento da consulta
Uma consulta vetorial navega na estrutura hierárquica do gráfico para procurar correspondências. A seguir, resume as etapas do processo:
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.
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.
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
.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.
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
k
query-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 norm por ) 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. |
Nota
Se você executar duas ou mais consultas vetoriais em paralelo ou se fizer uma pesquisa híbrida que combine consultas vetoriais e de texto na mesma solicitação, a Reciprocal Rank Fusion (RRF) será usada para pontuar os resultados finais da pesquisa.
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.