Adicionar um reranker ao seu pipeline
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.
#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.
#Bi-encoder e cross-encoder: por que combinar os dois
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.
| Modelo | Idiomas | Tamanho anunciado | Licença | Veredito para o francês |
|---|---|---|---|---|
| BAAI/bge-reranker-v2-m3 | Multilíngue | 0,6 bilhão de parâmetros, pesos em F32 (aproximadamente 2,3 GB) | Apache 2.0 | Escolha padrão: multilíngue, leve, com bom suporte de ferramentas |
| BAAI/bge-reranker-v2-gemma | Multilíngue | 3 bilhões de parâmetros, pesos em F32 (aproximadamente 10 GB) | Apache 2.0 | Reservado para casos exigentes com GPU dedicada; reranker baseado em Gemma-2B |
| mixedbread-ai/mxbai-rerank-large-v1 | Inglês | 0,4 bilhão de parâmetros, pesos em F16 | Apache 2.0 | Evitar para um corpus francês: a ficha indica inglês |
| Cohere Rerank | Multilíngue | Serviço hospedado | Comercial | Nã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.
#O pipeline antes e depois do reranker
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).
#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.
#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.
#Com o LlamaIndex
#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.
#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.
- 01Reunir 30 a 50 perguntasUse perguntas reais de usuários, cada uma acompanhada do trecho que contém a resposta (um identificador é suficiente).
- 02Medir o recall@5 sem rerankerPara cada pergunta, verifique se o trecho correto está entre os 5 primeiros resultados da base vetorial.
- 03Medir o recall@5 com rerankerRecupere 20 candidatos, reclassifique-os e conte novamente os trechos relevantes entre os 5 primeiros.
- 04Comparar também a latênciaAnote o tempo mediano de ponta a ponta. Uma melhora de alguns pontos de recall não justifica necessariamente um segundo adicional de espera.
- 05Ver os errosPara 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.
#Precisa de um reranker? Critérios de decisão
| Situação | Decisão |
|---|---|
| Corpus de algumas dezenas de documentos limpos, top-5 vetorial já bom | Não, meça primeiro |
| Boa resposta frequentemente entre o 6º e o 30º lugar | Sim: é o uso típico |
| Perguntas vagas, corpus com ruído ou muito heterogêneo | Sim, com 30 a 50 candidatos |
| Chat interativo em máquina sem GPU | Cuidado: meça a latência no CPU, reduza para 10 a 20 candidatos |
| Resposta correta ausente mesmo entre os 50 primeiros candidatos | Não: corrija primeiro a divisão em trechos, os embeddings ou a extração |
#Perguntas frequentes sobre reranking
Um reranker substitui a busca vetorial?+
Qual reranker escolher para documentos em francês?+
Quantos candidatos devem ser reordenados?+
É necessário um GPU para um reranker?+
É possível usar um reranker com Ollama?+
Como saber se o reranker realmente melhora meus resultados?+
- Busca híbrida: BM25 + vetorial
- Estratégias de chunking
- Os melhores modelos de embeddings para francês
- Compreender a janela de contexto
- RAG local com ChromaDB e Ollama
- Fonte: ficha do Hugging Face de BAAI/bge-reranker-v2-m3
- Fonte: ficha do BAAI/bge-reranker-v2-gemma
- Fonte: Sentence Transformers, Retrieve & Re-Rank
- Fonte: documentação do servidor llama.cpp
Um comentário, um erro ou uma observação? Avise-nos; isso ajuda a melhorar o guia para todos.