Garantindo precisão semântica com pontuação mínima
Melhore a precisão semântica empregando limiares mínimos de pontuação. O artigo inclui exemplos concretos de busca semântica e híbrida.
A busca semântica abriu um mundo de oportunidades para a relevância da busca. Modelos esparsos e densos de alta qualidade, como ELSER, E5 e Jina Embedding v4, retornam resultados relevantes com base no significado das palavras, em vez da correspondência de palavras-chave. No entanto, a busca semântica às vezes retorna resultados irrelevantes na cauda final ou para consultas que não apresentam resultados relevantes no índice. Essa propriedade dos modelos esparsos e densos pode confundir os usuários ou desperdiçar tokens preciosos para grandes modelos de linguagem (LLMs).
Neste artigo, você aprenderá como usar o parâmetro de pontuação mínima para aumentar a precisão dos seus resultados de busca semânticos. Se você quiser testar os exemplos fornecidos neste post do blog, acesse o caderno Jupyter associado.
Contexto: Precisão e recall
Na relevância da pesquisa, a precisão e a recall são conceitos-chave. Qualquer leitor que ainda não esteja familiarizado é altamente incentivado a pesquisar sobre eles. Segue abaixo um resumo.
Precisão: a fração dos resultados de busca retornados que são relevantes para o usuário.
Recall: a fração de todos os documentos relevantes no corpus que estão incluídos no conjunto de resultados de busca.
Ou, em outras palavras, a precisão retorna apenas resultados relevantes e o recall retorna todos os resultados relevantes. Como você pode imaginar, esses são requisitos frequentemente concorrentes. A busca semântica tende a ter uma memória muito alta, mas pode ter dificuldades com precisão. Continue lendo para saber como se locomover por esta propriedade.
Apresentando o parâmetro de pontuação mínima
O parâmetro ‘min_score’ nos permite melhorar a precisão ao definir uma pontuação mínima, que truncará o conjunto de resultados removendo quaisquer correspondências com uma pontuação inferior ao limite definido. Aqui está um exemplo simples:
GET search-movies/_search
{
"retriever": {
"linear": {
"min_score": 4,
"retrievers": [
...
]
}
}
}Normalização da pontuação
Definir uma pontuação mínima é muito bom; no entanto, nem todos os modelos semânticos retornam uma pontuação adequada para um limite estático. ELSER, por exemplo, retorna uma pontuação que é ilimitada. Algumas pontuações de modelos densos estão fortemente agrupadas e só fazem sentido no contexto da consulta específica.
Para a maioria dos casos de busca semântica, recomendamos usar uma abordagem de normalização antes de aplicar o 'min_score'. A normalização garante que a pontuação do documento esteja dentro de um intervalo definido. Os recuperadores Elasticsearch fornecem dois desses normalizadores, 'l2_norm' e 'minmax'. O mais comumente usado é o 'minmax', pois é fácil de entender e funciona bem em muitos cenários. As principais propriedades do 'minmax' incluem:
As pontuações dos documentos são distribuídas entre 0 e 1.
O documento com maior pontuação é sempre pontuado como 1.
O documento com menor pontuação sempre é pontuado como 0.
Isso pode torná-lo menos adequado para buscar palavras-chave. Consulte a seção “Busca híbrida” para uma discussão mais aprofundada.
A seguir está um exemplo de consulta semântica normalizada com min_score. O tamanho da janela de classificação foi aumentado para 500 para permitir que possamos retornar uma lista maior de resultados de busca, começando em 100.
GET search-movies/_search
{
"size": 100,
"_source": [
"title", "overview"
],
"retriever": {
"linear": {
"rank_window_size": 500,
"min_score": 0.25,
"retrievers": [
{
"normalizer": "minmax",
"retriever": {
"standard": {
"query": {
"semantic": {
"field": "overview_vector",
"query": "superhero movie"
}
}
}
}
}
]
}
}
}O tamanho foi ajustado para um valor maior do que o normalmente visto na produção. Isso é para que possamos inspecionar a qualidade dos resultados de busca e ajustar os resultados.
Busca híbrida usando o recuperador linear
Para busca híbrida, a abordagem mais simples é normalizar todas as pontuações, atribuir pesos e aplicar uma pontuação mínima. Note que, ao escolher pesos cuja soma seja 1, você mantém a pontuação total dentro de um intervalo de 0 a 1. Isso facilita entender as pontuações finais e afinar min_score. A seguir está um exemplo:
GET search-movies/_search
{
"size": 100,
"_source": ["title", "overview","keywords"],
"retriever": {
"linear": {
"rank_window_size": 500,
"min_score": 0.25,
"retrievers": [
{
"weight": 0.6,
"normalizer": "minmax",
"retriever": {
"standard": {
"query": {
"semantic": {
"field": "overview_vector",
"query": "superhero movie"
}
}
}
}
},
{
"weight": 0.4,
"normalizer": "minmax",
"retriever": {
"standard": {
"query": {
"multi_match": {
"query": "superhero movie",
"fields": ["overview","keywords", "title"],
"type": "cross_fields",
"minimum_should_match": "2"
}
}
}
}
}
]
}
}
}Busca híbrida usando o RRF
Com o BM25, muitas vezes controlamos a precisão por outros meios, como usando o operador AND ou minimum_should_match. Além disso, consultas compostas por termos únicos, precisos e raros naturalmente causam resultados de busca com poucos resultados, muitas vezes todos altamente relevantes. Isso pode resultar em:
Os resultados mais distantes na lista recebem uma pontuação normalizada baixa no recuperador BM25, mesmo que a pontuação absoluta do BM25 esteja próxima das pontuações mais altas.
Ao adicionar uma pontuação BM25 muito baixa à pontuação semântica, o total pode ser aproximado como a pontuação semântica.
A falta de contribuição da pontuação BM25 pode fazer com que o documento seja descartado pelo
min_score threshold.
Como solução, podemos usar a fusão de classificação recíproca (RRF) para combinar os resultados BM25 e semânticos. O RRF contorna o desafio de comparar pontuações de diferentes algoritmos de busca focando na posição em cada conjunto de resultados. Nesse cenário, o min_score é aplicado apenas ao recuperador semântico.
GET search-movies/_search
{
"_source": ["title", "overview","keywords"],
"retriever": {
"rrf": {
"rank_window_size": 500,
"retrievers": [
{
"linear": {
"rank_window_size": 500,
"min_score": 0.25,
"retrievers": [
{
"normalizer": "minmax",
"retriever": {
"standard": {
"query": {
"semantic": {
"field": "overview_vector",
"query": "superhero movie"
}
}
}
}
}
]
}
},
{
"standard": {
"query": {
"multi_match": {
"query": "superhero movie",
"fields": ["overview", "keywords","title"],
"type": "cross_fields",
"minimum_should_match": "2"
}
}
}
}
]
}
}
}Conclusão
Usando min_score, mostramos como podemos reduzir o número de falsos positivos em nossos conjuntos de resultados causados pela alta recordação de algoritmos de busca semântica. Para saber mais sobre recuperadores, consulte este post do blog e a documentação do Elasticsearch.




