Avançado 12 minOtimização

Adicionar um reranker ao seu pipeline

Resposta direta

Um reranker é um cross-encoder que relê cada par pergunta-passagem e reordena os candidatos retornados pela busca vetorial: recuperamos um conjunto amplo (20 a 100 passagens) e mantemos as 3 a 5 melhores para o modelo. Para textos em francês, BAAI/bge-reranker-v2-m3 (licença Apache 2.0, cerca de 568 milhões de parâmetros) é o ponto de partida mais simples para execução local, em GPU ou até em CPU, se o volume permanecer modesto.

Os embeddings encontram trechos próximos de uma pergunta, mas não necessariamente trechos que a respondam. O reranker corrige esse defeito avaliando cada par pergunta-trecho em um único cálculo. Este guia explica quando vale a pena o custo, qual modelo escolher em francês, como integrar em trinta linhas e como verificar em seus próprios documentos se realmente melhora os resultados.

Por Mohamed Meguedmi·Atualização 2026-09-30·Testado no Windows, macOS e Linux

#Reranker: para que serve em um pipeline RAG

Um reranker recebe a pergunta e um trecho, lê os dois juntos e retorna uma pontuação de relevância; depois, os candidatos são ordenados por pontuação decrescente e apenas os melhores são enviados para o modelo de linguagem. Em um pipeline RAG local, ele é inserido entre a base vetorial (ChromaDB, Qdrant, Weaviate) e o LLM: a busca vetorial, por exemplo, retorna 30 trechos, e o reranker seleciona 5. A ficha oficial da BAAI o descreve assim: ao contrário de um modelo de embedding, o reranker recebe a pergunta e o documento como entrada e produz diretamente uma similaridade, em vez de um vetor. O ganho é mais significativo quando a resposta correta está entre os candidatos, mas não está no topo: trechos que falam do tema geral correto sem responder à pergunta específica ocupam as primeiras posições, e o modelo então gera uma resposta que foge da pergunta ou é inventada. Se a resposta correta não estiver entre os candidatos, um reranker não pode fazer nada: ele não busca, apenas ordena.

Um embedding gera um vetor para cada documento, independentemente da pergunta feita, e a distância mede a proximidade global de tema. Duas passagens sobre o mesmo tema podem, portanto, obter pontuações próximas, mesmo quando apenas uma contém a resposta. O cross-encoder analisa o par como um todo: verifica se a data, o nome ou a condição solicitados aparecem no trecho. É mais preciso nessa avaliação local e mais custoso, porque é necessário processar cada par no transformer, em vez de fazer um único cálculo por documento.

i
A metáfora
O embedding é o bibliotecário que leva você à seção certa e lhe entrega vinte livros. O reranker é o especialista que folheia esses vinte livros com a sua pergunta em mente e coloca no topo os três que respondem à pergunta.

#Bi-encoder e cross-encoder: por que combinar os dois

O kit RAG Local

Seus documentos, sua IA: um RAG local confiável para seus PDFs, notas e e-mails — sem enviar nada para a nuvem.

  • Espaço online vitalício
  • PDF + arquivos
  • Atualizações vitalícias
Bi-encoder (embedding)
Codifica a pergunta e cada documento separadamente; os vetores dos documentos são calculados uma vez na indexação, a busca reduz-se a uma comparação de vetores. Rápido, adequado para milhões de passagens.
Cross-encoder (reranker)
Codifica a pergunta e o trecho juntos e retorna uma pontuação. Nenhum cálculo é reutilizável: é preciso recalcular para cada pergunta e cada candidato. Preciso, mas impossível de aplicar a todo o corpus.

A documentação do Sentence Transformers explica o raciocínio: avaliar milhares ou milhões de pares seria bastante lento, por isso utiliza-se o retriever para gerar um conjunto de candidatos, por exemplo, cerca de cem, que o cross-encoder reordena. O esquema em duas etapas é o mesmo dos mecanismos de busca tradicionais. Ele também explica o ajuste principal: o número de candidatos recuperados controla tanto o recall (quanto mais candidatos são incluídos, maior a chance de o conjunto conter a resposta correta) quanto a latência (cada candidato adicional custa uma passagem pelo cross-encoder).

#Qual modelo de reranking escolher em francês?

A escolha depende de três critérios: a língua, a licença e a memória. Os valores de tamanho abaixo vêm das fichas do Hugging Face; observe que o tamanho do arquivo depende da precisão dos pesos, F32 para bge-reranker-v2-m3 (cerca de 4 bytes por parâmetro), F16 para mxbai.

Rerankers utilizáveis localmente (fichas de modelos do Hugging Face, setembro de 2026)
ModeloIdiomasTamanho anunciadoLicençaVeredito para o francês
BAAI/bge-reranker-v2-m3Multilíngue0,6 bilhão de parâmetros, pesos em F32 (aproximadamente 2,3 GB)Apache 2.0Escolha padrão: multilíngue, leve, com bom suporte de ferramentas
BAAI/bge-reranker-v2-gemmaMultilíngue3 bilhões de parâmetros, pesos em F32 (aproximadamente 10 GB)Apache 2.0Reservado para casos exigentes com GPU dedicada; reranker baseado em Gemma-2B
mixedbread-ai/mxbai-rerank-large-v1Inglês0,4 bilhão de parâmetros, pesos em F16Apache 2.0Evitar para um corpus francês: a ficha indica inglês
Cohere RerankMultilíngueServiço hospedadoComercialNão se aplica a um pipeline 100% local: os trechos saem da sua máquina

A ficha do bge-reranker-v2-m3 o apresenta como um reranker leve, com fortes capacidades multilíngues, fácil de implantar e rápido na inferência; a ficha do bge-reranker-v2-gemma o indica para contextos multilíngues, com bons resultados tanto em inglês quanto em vários idiomas. Duas correções úteis em relação ao que se lê com frequência: o arquivo do bge-reranker-v2-m3 pesa mais de 2 GB, não 560 MB (568 milhões de parâmetros em F32), e mxbai-rerank-large-v1 é um modelo voltado ao inglês, que não deve ser escolhido para documentos em francês. Uma vez carregado em meia precisão, o modelo m3 ocupa cerca de 1,1 GB para os pesos (568 milhões de parâmetros × 2 bytes, cálculo deste guia), aos quais se somam as ativações do lote processado.

→
Modelo de embedding e reranker são independentes
Você pode alterar um sem reindexar o outro: o reranker lê apenas o texto dos trechos, nunca seus vetores. Para escolher o modelo de embeddings, consultar o guia dedicado aos modelos de embeddings para o francês.

#O pipeline antes e depois do reranker

Antes / depois
AVANT :
  Question → Embedding → Base vectorielle (top-5) → LLM

APRÈS :
  Question → Embedding → Base vectorielle (top-20 à top-50)
                       → Reranker (top-5) → LLM

On récupère large, puis on ordonne finement.

Dois parâmetros regulam o conjunto: k_retrieve, o número de candidatos que a base vetorial retorna, e k_final, o número de trechos enviados ao LLM. Um k_final de 3 a 5 é adequado para a maioria dos modelos locais com 7 a 14 bilhões de parâmetros; acima disso, a janela de contexto é preenchida sem ganho líquido, e o tempo de processamento do prompt aumenta. O k_retrieve depende da dificuldade do corpus: 20 é um bom primeiro teste, 50 a 100 se as perguntas forem vagas ou se o corpus contiver muitos trechos próximos. O guia sobre a janela de contexto detalha o custo de trechos adicionais no prompt.

#Implementação: sentence-transformers, FlagEmbedding, llama.cpp

#Com sentence-transformers

A classe CrossEncoder carrega o modelo e avalia pares. Seu método rank aceita diretamente a pergunta e a lista de documentos e retorna os melhores; o parâmetro top_k limita o número de resultados (sem ele, todos os documentos são retornados).

CrossEncoder.rank
from sentence_transformers import CrossEncoder

reranker = CrossEncoder("BAAI/bge-reranker-v2-m3", max_length=512)

def retrieve_and_rerank(question, k_retrieve=20, k_final=5):
    # 1. Récupération par embedding (ChromaDB, Qdrant, etc.)
    candidats = embedding_search(question, top_k=k_retrieve)  # liste de textes

    # 2. Scoring par le cross-encoder, tri et coupe en une seule étape
    resultats = reranker.rank(question, candidats, top_k=k_final, batch_size=16)
    # resultats = [{'corpus_id': 3, 'score': 0.91}, ...]
    return [candidats[r['corpus_id']] for r in resultats]

#Com FlagEmbedding, a biblioteca dos autores do modelo

A ficha do modelo utiliza a biblioteca FlagEmbedding. Ela especifica que a pontuação bruta pode ser transformada em um valor entre 0 e 1 por uma função sigmoide com normalize=True, e que use_fp16=True acelera o cálculo ao custo de uma leve redução na qualidade. Lembre-se de que a pontuação bruta é um valor sem escala absoluta, muitas vezes negativo para trechos fora do assunto; apenas a ordem importa, a menos que você defina um limiar.

FlagReranker
from FlagEmbedding import FlagReranker

reranker = FlagReranker('BAAI/bge-reranker-v2-m3', use_fp16=True)
score = reranker.compute_score(['ma question', 'un passage'], normalize=True)  # entre 0 et 1

#Com llama.cpp, sem Python

O servidor llama.cpp oferece um ponto de acesso de reranking, desativado por padrão. A documentação indica que ele exige um modelo de reranking, cita bge-reranker-v2-m3 como exemplo e informa que o servidor deve ser iniciado com as opções --embedding e --pooling rank. É necessária uma versão GGUF do modelo. Essa é a opção indicada se sua pilha já está construída em torno do llama.cpp e você deseja evitar instalar o PyTorch. Verifique a opção exata na versão instalada: a documentação alerta que esse ponto de acesso pode evoluir.

llama-server (adaptar para a sua versão)
llama-server -m bge-reranker-v2-m3-Q8_0.gguf --embedding --pooling rank --reranking --port 8081

#Com o LlamaIndex

SentenceTransformerRerank
from llama_index.core.postprocessor import SentenceTransformerRerank

reranker = SentenceTransformerRerank(model="BAAI/bge-reranker-v2-m3", top_n=5)

query_engine = index.as_query_engine(
    similarity_top_k=20,
    node_postprocessors=[reranker],
)

#Custo: latência, memória, comprimento dos trechos

Nenhum valor de latência é garantido: ela depende da placa, da precisão (FP16 ou FP32), do número de candidatos e do comprimento dos trechos. Tenha em mente as proporções. O tempo de reranking cresce linearmente com o número de pares: passar de 20 para 100 candidatos multiplica o trabalho por cinco. Também cresce com o comprimento do trecho, pois cada par é codificado integralmente. Meça na sua máquina com seus próprios trechos em vez de confiar em um número de blog: cronometre cem requisições reais e observe a mediana do tempo e o pior caso.

Número de candidatos
Primeiro ajuste. Comece com 20, meça o recall e aumente para 50 apenas se boas respostas ainda ficarem fora do conjunto.
Precisão
use_fp16=True (FlagEmbedding) ou um carregamento em meia precisão reduz o uso de memória e acelera o cálculo, com uma leve queda de desempenho, segundo a ficha do modelo.
Tamanho do lote
O método rank do sentence-transformers processa 32 pares por lote por padrão. Reduza para 8 ou 16 se faltar memória e aumente se a GPU estiver subutilizada.
Comprimento máximo
512 tokens por par (valor max_length dos exemplos oficiais). Um trecho mais longo é truncado: se seus chunks ultrapassarem esse tamanho, a parte final do trecho não será lida. Encurte os chunks antes de aumentar o limite.
CPU ou GPU
Na CPU, o reranker funciona, mas cada requisição com 20 a 50 candidatos leva segundos; isso é aceitável para um assistente documental interno, mas menos para um chat interativo.
→
Pular o reranker quando ele for desnecessário
Em um corpus pequeno e bem estruturado (alguns dezenas de páginas bem divididas), o top-5 vetorial já contém frequentemente a resposta. Meça primeiro e mantenha apenas o reranker se o recall aumentar.

#Reranker e divisão: os dois ajustes interagem

Um cross-encoder avalia todo o trecho. Se o trecho mistura três temas, sua pontuação será média para as três perguntas correspondentes; se for muito curto, perde o contexto que permitiria reconhecê-lo como resposta. Dividir em trechos de tamanho médio, com leve sobreposição, dá ao reranker o conteúdo sem ultrapassar seu limite máximo de comprimento. Se você mudar o tamanho dos chunks, repita o teste de recall: o melhor k_retrieve e o ganho do reranker mudam com ele. O guia sobre estratégias de chunking detalha essas escolhas.

Outra interação: a pesquisa híbrida. Quando a pesquisa por palavras-chave (BM25) e a pesquisa vetorial são combinadas, o conjunto de candidatos é mais diversificado, o que dá ao reranker mais chances de encontrar uma boa resposta que cada método isoladamente teria deixado passar. O reranker é a última etapa, a pesquisa híbrida é a segunda: eles se complementam em vez de se substituírem.

#Medir o ganho em seus documentos

O ganho anunciado nos blogs varia de uma a cinco vezes conforme o corpus, e nenhum valor geral se aplica ao seu. Em um corpus muito estruturado (documentação técnica limpa), a busca vetorial por si só já é boa; em um corpus com ruído (e-mails, anotações, PDFs com extração de texto deficiente), a diferença é mais evidente. O único modo de saber é avaliar.

  1. 01
    Reunir 30 a 50 perguntas
    Use perguntas reais de usuários, cada uma acompanhada do trecho que contém a resposta (um identificador é suficiente).
  2. 02
    Medir o recall@5 sem reranker
    Para cada pergunta, verifique se o trecho correto está entre os 5 primeiros resultados da base vetorial.
  3. 03
    Medir o recall@5 com reranker
    Recupere 20 candidatos, reclassifique-os e conte novamente os trechos relevantes entre os 5 primeiros.
  4. 04
    Comparar também a latência
    Anote o tempo mediano de ponta a ponta. Uma melhora de alguns pontos de recall não justifica necessariamente um segundo adicional de espera.
  5. 05
    Ver os erros
    Para cada pergunta mal respondida, verifique se a resposta correta estava entre os 20 candidatos. Caso contrário, o problema está nas etapas anteriores: divisão em trechos, embeddings ou extração de texto.
Avaliar o recall
def rappel_a_k(pipeline, questions, cibles, k=5):
    ok = 0
    for q, cible in zip(questions, cibles):
        ok += cible in [p.id for p in pipeline(q)[:k]]
    return ok / len(questions)

sans = rappel_a_k(pipeline_sans_reranker, questions, cibles)
avec = rappel_a_k(pipeline_avec_reranker, questions, cibles)
print(f"Sans : {sans:.0%}   Avec : {avec:.0%}")
!
Limites do reranker
Não corrige um texto mal extraído de um PDF, nem um corte que divide a resposta ao meio, nem uma pergunta ambígua. Também pode desfavorecer trechos curtos cujo score é baixo, mesmo que contenham o número correto: verifique os erros em vez de se basear na média.

#Precisa de um reranker? Critérios de decisão

Quando adicionar um reranker
SituaçãoDecisão
Corpus de algumas dezenas de documentos limpos, top-5 vetorial já bomNão, meça primeiro
Boa resposta frequentemente entre o 6º e o 30º lugarSim: é o uso típico
Perguntas vagas, corpus com ruído ou muito heterogêneoSim, com 30 a 50 candidatos
Chat interativo em máquina sem GPUCuidado: meça a latência no CPU, reduza para 10 a 20 candidatos
Resposta correta ausente mesmo entre os 50 primeiros candidatosNão: corrija primeiro a divisão em trechos, os embeddings ou a extração

#Perguntas frequentes sobre reranking

FAQ
Um reranker substitui a busca vetorial?+
Não. Ele não percorre o corpus: reordena as poucas dezenas de candidatos que a busca vetorial lhe fornece. Sem uma primeira etapa rápida, seria necessário executá-lo em cada trecho da base, o que seria lento demais. As duas etapas se complementam: a busca vetorial garante o recall, e o reranker melhora a precisão no topo da classificação.
Qual reranker escolher para documentos em francês?+
BAAI/bge-reranker-v2-m3 é um ponto de partida razoável: multilíngue, sob licença Apache 2.0, com cerca de 0,6 bilhão de parâmetros, portanto utilizável em uma placa gráfica modesta. Evite mxbai-rerank-large-v1, cuja ficha indica o inglês. O modelo bge-reranker-v2-gemma, mais pesado, só se justifica se o primeiro não for suficiente para seu conjunto de perguntas.
Quantos candidatos devem ser reordenados?+
Comece com 20 candidatos e mantenha 5 trechos. Se, na avaliação, boas respostas permanecerem fora dos 20, aumente para 50. Cada candidato adicional exige um cálculo, portanto a latência cresce aproximadamente de forma linear. Acima de 100, os ganhos se tornam raros: muitas vezes, isso é sinal de um problema de segmentação ou de embeddings.
É necessário um GPU para um reranker?+
Não, mas ajuda. Na CPU, o modelo m3 funciona, com uma latência da ordem de um segundo ou mais para um lote de candidatos, dependendo da máquina: a medir na sua própria máquina. Isso continua sendo aceitável para uso interno com documentos. Para um chat fluido, uma GPU, mesmo modesta, ou um modelo mais leve muda a experiência de uso.
É possível usar um reranker com Ollama?+
Ollama serve o modelo de geração e os embeddings, mas o reranking é feito separadamente: com sentence-transformers ou FlagEmbedding em Python, ou com o servidor llama.cpp, que expõe um endpoint de reranking. O reranker é um modelo distinto, carregado em seu próprio processo, que coexiste com o modelo de geração se a memória permitir.
Como saber se o reranker realmente melhora meus resultados?+
Reúna 30 a 50 perguntas reais com o trecho esperado, depois compare o recall nos 5 primeiros resultados com e sem reranker, assim como a latência mediana. Em um corpus limpo, a diferença pode ser pequena; em um corpus com ruído, ela é mais evidente. Em seguida, analise as falhas para verificar se elas se originam em etapas anteriores.
Este guia ajudou você?

Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.