Pontuação de relevância na pesquisa híbrida usando Reciprocal Rank Fusion (RRF)
Reciprocal Rank Fusion (RRF) é um algoritmo que avalia as pontuações de pesquisa a partir de vários resultados previamente classificados para produzir um conjunto de resultados unificado. No Azure AI Search, o RRF é usado sempre que há duas ou mais consultas que são executadas em paralelo. Cada consulta produz um conjunto de resultados classificados, e o RRF é usado para mesclar e homogeneizar as classificações em um único conjunto de resultados, retornado na resposta da consulta. Exemplos de cenários em que o RRF é sempre usado incluem pesquisa híbrida e várias consultas vetoriais executadas simultaneamente.
O RRF baseia-se no conceito de classificação recíproca, que é o inverso da classificação do primeiro documento relevante numa lista de resultados de pesquisa. O objetivo da técnica é levar em conta a posição dos itens nos rankings originais, e dar maior importância aos itens que são classificados mais alto em várias listas. Isso pode ajudar a melhorar a qualidade geral e a confiabilidade da classificação final, tornando-a mais útil para a tarefa de fundir vários resultados de pesquisa ordenados.
Nota
Uma novidade em 2024-09-01-preview é a capacidade de desconstruir uma pontuação de pesquisa classificada por RRF em suas subpontuações de componentes. Isso lhe dá transparência na composição da pontuação completa. Para obter mais informações, consulte descompactar pontuações de pesquisa (visualização) neste artigo.
Como funciona o ranking RRF
O RRF funciona pegando os resultados da pesquisa de vários métodos, atribuindo uma pontuação de classificação recíproca a cada documento nos resultados e, em seguida, combinando as pontuações para criar uma nova classificação. O conceito é que os documentos que aparecem nas primeiras posições em vários métodos de pesquisa provavelmente serão mais relevantes e devem ser classificados mais alto no resultado combinado.
Aqui está uma explicação simples do processo RRF:
Obtenha resultados de pesquisa classificados a partir de várias consultas executadas em paralelo.
Atribua pontuações de classificação recíprocas para o resultado em cada uma das listas classificadas. O RRF gera um novo
@search.score
para cada partida em cada conjunto de resultados. Para cada documento nos resultados da pesquisa, o mecanismo atribui uma pontuação de classificação recíproca com base em sua posição na lista. A pontuação é calculada como1/(rank + k)
, onderank
está a posição do documento na lista, ek
é uma constante, que foi observada experimentalmente para ter o melhor desempenho se for definida para um valor pequeno como 60. Observe que essek
valor é uma constante no algoritmo RRF e totalmente separado do que controlak
o número de vizinhos mais próximos.Combine pontuações. Para cada documento, o mecanismo soma as pontuações de classificação recíprocas obtidas em cada sistema de pesquisa, produzindo uma pontuação combinada para cada documento.
O mecanismo classifica os documentos com base em pontuações combinadas e os classifica. A lista resultante é a classificação fundida.
Somente os campos marcados como searchable
no índice ou searchFields
na consulta são usados para pontuação. Somente os campos marcados como retrievable
, ou os campos especificados na select
consulta, são retornados nos resultados da pesquisa, juntamente com sua pontuação de pesquisa.
Execução paralela de consultas
O RRF é usado sempre que há mais de uma execução de consulta. Os exemplos a seguir ilustram padrões de consulta onde ocorre a execução de consultas paralelas:
- Uma consulta de texto completo, mais uma consulta vetorial (cenário híbrido simples), equivale a duas execuções de consulta.
- Uma consulta de texto completo, mais uma consulta vetorial direcionada a dois campos vetoriais, equivale a três execuções de consulta.
- Uma consulta de texto completo, mais duas consultas vetoriais direcionadas a cinco campos vetoriais, equivale a 11 execuções de consulta
Pontuações em resultados de pesquisa híbridos
Sempre que os resultados são classificados, @search.score
a propriedade contém o valor usado para ordenar os resultados. As pontuações são geradas por algoritmos de classificação que variam para cada método. Cada algoritmo tem seu próprio alcance e magnitude.
O gráfico a seguir identifica a propriedade de pontuação retornada em cada correspondência, algoritmo e intervalo de pontuações para cada algoritmo de classificação de relevância.
Método de pesquisa | Parâmetro | Algoritmo de pontuação | Intervalo |
---|---|---|---|
Pesquisa de texto completo | @search.score |
Algoritmo BM25 | Sem limite máximo. |
pesquisa vetorial | @search.score |
Algoritmo HNSW, usando a métrica de similaridade especificada na configuração HNSW. | 0,333 - 1,00 (Cosseno), 0 a 1 para Euclidiano e DotProduct. |
Pesquisa híbrida | @search.score |
Algoritmo RRF | O limite superior é limitado pelo número de consultas que estão sendo fundidas, com cada consulta contribuindo com um máximo de aproximadamente 1 para a pontuação RRF. Por exemplo, a fusão de três consultas produziria pontuações RRF mais altas do que se apenas dois resultados de pesquisa fossem mesclados. |
Classificação semântica | @search.rerankerScore |
Classificação semântica | 0.00 - 4.00 |
A classificação semântica ocorre após a fusão dos resultados do RRF. Sua pontuação (@search.rerankerScore
) é sempre relatada separadamente na resposta da consulta. O classificador semântico pode reclassificar o texto completo e os resultados de pesquisa híbridos, supondo que esses resultados incluam campos com conteúdo semanticamente rico. Ele pode reclassificar consultas vetoriais puras se os documentos de pesquisa incluírem campos de texto que contenham conteúdo semanticamente relevante.
Descompactar uma pontuação de pesquisa em subpontuações (visualização)
Usando 2024-09-01-preview, você pode desconstruir uma pontuação de pesquisa para visualizar suas subpontuações.
Para consultas vetoriais, essas informações podem ajudá-lo a determinar um valor apropriado para ponderação de vetores ou definição de limites mínimos.
Para obter subpontuações:
Use a API REST de Pesquisa de Documentos de visualização mais recente ou um pacote beta do SDK do Azure que forneça o recurso.
Modifique uma solicitação de consulta, adicionando um novo
debug
conjunto de parâmetros paravector
,semantic
se estiver usando classificador semântico, ouall
.
Aqui está um exemplo de consulta híbrida que retorna subscores no modo de depuração:
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-09-01=preview
{
"vectorQueries": [
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"k": 10
},
{
"vector": [
-0.009154141,
0.018708462,
. . .
-0.02178128,
-0.00086512347
],
"fields": "DescriptionVector",
"kind": "vector",
"exhaustive": true,
"k": 10
}
],
"search": "historic hotel walk to restaurants and shopping",
"select": "HotelName, Description, Address/City",
"debug": "vector",
"top": 10
}
Pontuações ponderadas
Usando 2024-07-01 e versões mais recentes da API de visualização, você pode ponderar consultas vetoriais para aumentar ou diminuir sua importância em uma consulta híbrida.
Lembre-se de que, ao calcular o RRF para um determinado documento, o mecanismo de busca analisa a classificação desse documento para cada conjunto de resultados em que ele aparece. Suponha que um documento apareça em três resultados de pesquisa separados, onde os resultados são de duas consultas vetoriais e uma consulta de texto classificada como BM25. A posição do documento varia em cada resultado.
Correspondência encontrada | Posição nos resultados | @search.score | multiplicador de peso | @search.score (ponderado) |
---|---|---|---|---|
resultados vetoriais um | posição 1 | 0.8383955 | 0.5 | 0.41919775 |
resultados vetoriais dois | posição 5 | 0.81514114 | 2.0 | 1.63028228 |
Resultados BM25 | posição 10 | 0.8577363 | ND | 0.8577363 |
A posição do documento em cada conjunto de resultados corresponde a uma pontuação inicial, que é somada para criar a pontuação final do RRF para esse documento.
Se você adicionar ponderação vetorial, as pontuações iniciais estarão sujeitas a um multiplicador de ponderação que aumenta ou diminui a pontuação. O padrão é 1.0, o que significa que não há ponderação e a pontuação inicial é usada como está na pontuação RRF. No entanto, se você adicionar um peso de 0,5, a pontuação é reduzida e esse resultado se torna menos importante no ranking combinado. Por outro lado, se você adicionar um peso de 2,0, a pontuação se torna um fator maior na pontuação geral do RRF.
Neste exemplo, os @search.score valores (ponderados) são passados para o modelo de classificação RRF.
Número de resultados classificados em uma resposta de consulta híbrida
Por padrão, se você não estiver usando paginação, o mecanismo de pesquisa retornará as 50 correspondências mais altas para pesquisa de texto completo e as correspondências mais semelhantes k
para pesquisa vetorial. Em uma consulta híbrida, top
determina o número de resultados na resposta. Com base nos padrões, as 50 partidas mais bem classificadas do conjunto de resultados unificado são retornadas.
Muitas vezes, o motor de busca encontra mais resultados do que top
e k
. Para retornar mais resultados, use os parâmetros top
de paginação , skip
e next
. A paginação é como você determina o número de resultados em cada página lógica e navega pela carga útil completa. Você pode definir maxTextRecallSize
valores maiores (o padrão é 1.000) para retornar mais resultados do lado do texto da consulta híbrida.
Por padrão, a pesquisa de texto completo está sujeita a um limite máximo de 1.000 correspondências (consulte Limites de resposta da API). Uma vez que 1.000 correspondências são encontradas, o mecanismo de busca não procura mais.
Para obter mais informações, consulte Como trabalhar com resultados de pesquisa.
Diagrama de um fluxo de trabalho de pontuação de pesquisa
O diagrama a seguir ilustra uma consulta híbrida que invoca a pesquisa de palavras-chave e vetores, com impulsionamento por meio de perfis de pontuação e classificação semântica.
Uma consulta que gera o fluxo de trabalho anterior pode ter esta aparência:
POST https://{{search-service-name}}.search.windows.net/indexes/{{index-name}}/docs/search?api-version=2024-07-01
Content-Type: application/json
api-key: {{admin-api-key}}
{
"queryType":"semantic",
"search":"hello world",
"searchFields":"field_a, field_b",
"vectorQueries": [
{
"kind":"vector",
"vector": [1.0, 2.0, 3.0],
"fields": "field_c, field_d"
},
{
"kind":"vector",
"vector": [4.0, 5.0, 6.0],
"fields": "field_d, field_e"
}
],
"scoringProfile":"my_scoring_profile"
}