Busca híbrida e reranking
Combinar busca semântica com keyword e reordenar com um reranker para acertar mais.
6 min de leitura
Escolha como aprender
— combine como quiserDica: o vídeo é um resumo visual rápido — o áudio e o texto trazem a aula completa.
Busca vetorial é poderosa, mas falha em algo básico: termos exatos. Se o usuário digita "CVE-2024-1234" ou "API v3.2", o embedding não vai salvar você — ele vai te entregar chunks semanticamente próximos, mas provavelmente errados. A solução não é trocar de abordagem; é combinar as duas e depois reordenar o resultado com um modelo que realmente entende a pergunta.
O limite da busca só-vetorial
Na aula 02 vimos que embeddings capturam significado. Isso é ótimo para perguntas como "como faço para cancelar minha assinatura?", onde variações de linguagem existem. Mas considere estes casos:
- Um desenvolvedor busca por
NullPointerExceptionem logs de erro. - Um analista de segurança pesquisa pelo código
CVE-2024-1234. - Um usuário digita o nome exato de um produto:
XR-7000 Pro.
O modelo de embedding vai vetorizar esses termos e buscar vizinhos no espaço semântico. O problema é que CVE-2024-1234 e CVE-2024-5678 ficam muito próximos vetorialmente — afinal, são estruturalmente similares. O sistema vai recuperar o chunk errado com alta confiança.
Busca lexical (BM25, o algoritmo clássico de ranking por frequência de termos) não tem esse problema. Ela trata CVE-2024-1234 como uma string literal e só retorna documentos que contêm exatamente aquele token. É determinística, rápida e não precisa de GPU.
A fraqueza do BM25 é o inverso: sem sinônimos, sem tolerância a variações. "Cancelar assinatura" não encontra "encerrar contrato". Para linguagem natural, ele perde feio para embeddings.
Nenhuma das duas abordagens é superior em todos os cenários. A resposta certa é executar ambas em paralelo e fundir os resultados — isso é busca híbrida.
Busca híbrida: combinando os dois mundos
A mecânica é simples: você dispara duas buscas em paralelo — uma vetorial, uma lexical — e cada uma retorna uma lista ranqueada de chunks. O desafio é fundir essas listas em uma só, já que os scores são incomparáveis (cosine similarity vs. BM25 score).
A técnica mais usada na prática é Reciprocal Rank Fusion (RRF). A ideia é elegante: em vez de normalizar scores (o que é frágil), você usa apenas a posição de cada documento nas listas.
A fórmula é:
RRF(doc) = Σ 1 / (k + rank_i(doc))
Onde k é uma constante (tipicamente 60) e rank_i é a posição do documento na lista i. Um documento que aparece em 3º lugar na busca vetorial e em 5º no BM25 vai ter um score RRF alto. Um documento que só aparece em uma das listas vai ter score menor.
O OpenSearch Serverless e o OpenSearch Service suportam busca híbrida com RRF nativamente — você configura o hybrid query type e define os pesos de cada sub-query. O Amazon Bedrock Knowledge Bases também expõe essa opção no console e via API.
Um parâmetro importante é o peso relativo entre busca vetorial e lexical. Não existe valor universal: depende do seu domínio. Para documentação técnica com muitos códigos e siglas, eu dou mais peso ao BM25. Para FAQ em linguagem natural, mais peso ao vetorial. Comece 50/50 e ajuste com base nos resultados de avaliação (aula 08).
Fluxo: busca híbrida + reranking
Pipeline completo desde a query do usuário até os chunks finais enviados ao LLM. As duas buscas rodam em paralelo; RRF funde os rankings; o reranker seleciona os melhores candidatos.
- Busca Vetorial · ANN / cosine
- Busca Lexical · BM25 / keyword
- Reciprocal Rank · Fusion (RRF)
- Top-N candidatos · (ex: 20-50 chunks)
- Reranker · Cohere Rerank / Bedrock
- Top-K finais · (ex: 3-5 chunks)
- LLM (Claude / Titan) · Prompt + contexto
Reranking: o segundo filtro que muda o jogo
Busca híbrida melhora o recall — você recupera mais chunks relevantes. Mas o ranking ainda é imperfeito. O RRF não sabe por que a pergunta foi feita; ele só sabe que um chunk apareceu bem em duas listas.
O reranker resolve isso. Ele é um cross-encoder: recebe a query e cada chunk juntos como entrada e produz um score de relevância real. Diferente do embedding (que vetoriza query e documento separadamente), o cross-encoder lê os dois ao mesmo tempo e pode capturar dependências sutis — por exemplo, que a resposta à pergunta está na terceira frase do chunk, não na primeira.
O padrão de uso é: recupere muitos candidatos (20, 50, até 100 chunks) com busca híbrida, depois passe tudo pelo reranker e fique com os top-3 ou top-5. Isso funciona porque rerankers são caros por chamada mas você os usa uma vez por query, sobre um conjunto pequeno.
Na AWS, o caminho mais direto é o Cohere Rerank disponível via Amazon Bedrock. Você passa a query e a lista de chunks, recebe de volta os índices reordenados com scores. A integração com o Knowledge Bases ainda é manual neste fluxo — você chama o reranker depois do retrieve e antes de montar o prompt.
Um detalhe importante: rerankers têm um limite de tokens por documento. Chunks muito longos (da aula 03) vão ser truncados. Se você usa chunking de 1024 tokens, verifique o limite do modelo de reranking — geralmente 512 tokens por passagem é o máximo seguro.
Na prática, eu não ativo reranking em todo RAG que construo. Para casos simples — FAQ curto, base pequena, queries previsíveis — a busca híbrida já resolve bem e o reranker só adiciona latência e custo. Ativo reranking quando: (1) a base tem mais de 10k documentos e a densidade de informação é alta; (2) os usuários fazem perguntas complexas ou ambíguas; (3) os testes de avaliação mostram que os top-3 chunks ainda erram com frequência. O ganho de precisão é real, mas mensure antes de colocar em produção — use as métricas da aula 08 para justificar a decisão.
Ordene o fluxo híbrido + rerank
Da pergunta aos poucos trechos finais.
- 1Reranquear os candidatos por relevância
- 2Buscar candidatos por vetor E por keyword
- 3Manter apenas os top-N melhores para o contexto
- 4Fundir as duas listas (ex.: RRF)
Comparando as abordagens de busca
| Critério | Só vetorial | Só lexical (BM25) | Híbrida + Rerank | |
|---|---|---|---|---|
| Termos exatos / siglas | ❌ Fraco | ✅ Forte | ✅ Forte | — |
| Linguagem natural / sinônimos | ✅ Forte | ❌ Fraco | ✅ Forte | — |
| Latência | Baixa | Muito baixa | Média-alta | — |
| Custo por query | Baixo | Muito baixo | Maior (reranker) | — |
| Precisão no top-K | Média | Média | Alta | — |
Implementando busca híbrida + rerank na AWS
- 1
Configure o índice no OpenSearch com campos vetorial e texto
Crie um índice com
knn_vectorpara embeddings e um campotextpadrão para BM25. O OpenSearch indexa os dois automaticamente. No Bedrock Knowledge Bases, o índice híbrido é configurado via console ou CloudFormation. - 2
Dispare as duas buscas em paralelo
Use a
hybridquery do OpenSearch ou dispare duas queries assíncronas (umaknn, umamatch) e funda manualmente com RRF. Recupere N candidatos — comece com 20. - 3
Aplique RRF para fundir os rankings
Se usar a
hybridquery nativa do OpenSearch, o RRF já está embutido. Se fundir manualmente, implemente a fórmula1/(k+rank)com k=60 e some os scores de cada lista para cada documento. - 4
Chame o Cohere Rerank via Bedrock
Passe a query original e os N chunks fundidos. Use
bedrock-runtimecominvoke_modele o model ID do Cohere Rerank. Receba os índices reordenados e selecione os top-K (3 a 5 é o padrão razoável). - 5
Monte o prompt com os top-K chunks e envie ao LLM
Só agora você monta o contexto final. Menos chunks, mais precisos — o LLM vai errar menos e o custo de tokens de entrada cai. Guarde os scores do reranker para observabilidade (aula 12).
Dúvidas frequentes
Preciso de reranking se já uso busca híbrida?
Não necessariamente. Busca híbrida já melhora bastante o recall. Reranking melhora a precisão do top-K. Se seus testes de avaliação mostram que os chunks recuperados já são bons o suficiente, economize a latência e o custo do reranker.
Qual o impacto de latência do reranker?
Depende do número de candidatos e do tamanho dos chunks. Em geral, espere 200-600ms adicionais para 20-50 chunks com o Cohere Rerank via Bedrock. Isso é aceitável para a maioria dos casos de uso, mas pode ser crítico para aplicações de tempo real.
Posso usar um reranker open-source em vez do Cohere?
Sim. Modelos como cross-encoder/ms-marco-MiniLM-L-6-v2 (HuggingFace) funcionam bem e podem ser hospedados em SageMaker. O trade-off é operação de endpoint vs. custo por chamada do Cohere. Para volumes altos, o modelo próprio pode ser mais barato; para volumes baixos, o Cohere gerenciado é mais simples.
O Bedrock Knowledge Bases faz reranking automaticamente?
Não de forma nativa integrada ao fluxo gerenciado. Você usa o retrieve API para obter os chunks e depois chama o reranker separadamente antes de passar para o LLM. A aula 09 detalha o que o Knowledge Bases gerencia e o que fica na sua responsabilidade.
O que levar desta aula
Checagem rápida
1. O que um reranker faz?