Reclassificação (Reranking)

O que é reordenação?

Reordenação (reranking) é uma técnica de recuperação que melhora a precisão dos resultados de busca ao aplicar um modelo mais forte (geralmente mais lento) para reordenar uma lista curta de candidatos produzida por um recuperador rápido.

Em sistemas modernos de recuperação — especialmente em Geração Aumentada por Recuperação (retrieval-augmented generation, RAG) — o padrão típico é:

  1. Recuperação rápida (alta revocação): Use busca esparsa, densa ou busca híbrida (hybrid search) para buscar os N principais trechos/documentos candidatos.
  2. Reordenação (alta precisão): Use um modelo mais expressivo (frequentemente um codificador cruzado (cross-encoder)) para pontuar esses candidatos em relação à consulta e reordená-los.
  3. Uso a jusante: Envie os K principais resultados reordenados para um modelo de linguagem grande (large language model, LLM), mostre-os a um usuário ou use-os para citações.

A reordenação é valiosa porque muitos recuperadores de primeira etapa são otimizados para velocidade e similaridade aproximada, não para uma interação profunda entre consulta e documento. Um reordenador pode “ler” a consulta e o candidato juntos e fazer julgamentos mais refinados.

Por que a reordenação importa na prática

A recuperação de primeira etapa (BM25 ou representações vetoriais (embeddings)) muitas vezes retorna resultados relacionados ao tema, mas não necessariamente relevantes para a intenção do usuário. Isso é particularmente problemático em:

  • Perguntas e respostas / RAG: Um LLM só consegue responder corretamente se a evidência certa estiver na janela de contexto. A reordenação aumenta a chance de que a melhor evidência entre no top K.
  • Busca corporativa: Pequenas diferenças de redação (exceções de política, datas, versões de produto) importam; a reordenação ajuda a distinguir “parece similar” de “responde à pergunta”.
  • Busca em e-commerce: “tênis de corrida para pés planos” vs “tênis de corrida” exige entender restrições; a reordenação pode incorporar semântica mais rica do que a correspondência por palavras-chave.

Em resumo: a recuperação traz candidatos; a reordenação traz correção.

Onde a reordenação se encaixa em um pipeline de recuperação

Um pipeline comum em um sistema baseado em Busca Vetorial e Representações Vetoriais (Vector Search & Embeddings):

  • Ingestão: analisar documentos, segmentar em trechos, gerar representações vetoriais, indexar (veja Ingestão e Segmentação em Trechos)
  • Em tempo de consulta:
    1. Gerar representação vetorial da consulta
    2. Busca de vizinhos mais próximos aproximada (approximate nearest neighbor, ANN) para obter o top N (ex.: 50–500)
    3. Reordenar esses N usando um codificador cruzado
    4. Retornar o top K (ex.: 5–20) para a aplicação/LLM

Com busca híbrida, frequentemente você recupera candidatos via BM25 e busca densa, mescla os resultados e então reordena a união.

Ideia central: codificadores duplos vs codificadores cruzados

Codificadores duplos (dual encoders) para recuperação rápida

Recuperadores densos normalmente usam uma arquitetura de codificador duplo (bi-encoder):

  • Codificar consulta: ( \mathbf{q} = f(q) )
  • Codificar documento: ( \mathbf{d} = g(d) )
  • Pontuar via produto escalar / similaridade do cosseno:
    [ s(q, d) = \mathbf{q} \cdot \mathbf{d} ]

Isso é eficiente porque as representações vetoriais de documentos podem ser pré-computadas e indexadas. A desvantagem é que o modelo precisa comprimir todo o significado em vetores fixos de forma independente, então ele pode perder interações finas (negação, restrições, correspondência de entidades).

Codificadores cruzados para reordenação precisa

Um codificador cruzado codifica a consulta e o documento juntos, tipicamente concatenando-os e executando um Transformer (Transformer) sobre a sequência combinada:

  • Entrada: [CLS] query [SEP] document [SEP]
  • Saída: um escalar de relevância (classificação ou regressão)

Conceitualmente: [ s(q, d) = h([q; d]) ]

Como a atenção se estende por tokens tanto da consulta quanto do documento, codificadores cruzados podem modelar alinhamento detalhado:

  • “esta cláusula é uma exceção?”
  • “a passagem menciona a mesma versão do produto?”
  • “ela responde à pergunta diretamente?”

A troca (trade-off): codificadores cruzados são muito mais lentos do que codificadores duplos, porque você precisa executar o modelo uma vez por par (consulta, candidato).

Fundamentos de aprendizado para ranqueamento (como reordenadores são treinados)

Modelos de reordenação frequentemente são treinados usando objetivos de aprendizado para ranqueamento (learning-to-rank):

  • Pontual (pointwise): prever um rótulo/pontuação de relevância para cada par (consulta, documento)
    Exemplo de perda: entropia cruzada binária em relevante vs não relevante.
  • Pareado (pairwise): aprender que um documento relevante deve pontuar mais alto do que um não relevante
    Exemplo de perda: hinge loss ou perda logística pareada em (doc_pos, doc_neg).
  • Por lista (listwise): otimizar métricas de ranqueamento em uma lista inteira de candidatos
    Exemplos de métodos: entropia cruzada softmax sobre uma lista, variantes diferenciáveis de NDCG.

Na prática:

  • Muitos reordenadores populares com codificador cruzado são treinados com perdas pareadas ou pontuais usando negativos minerados (negativos difíceis (hard negatives) de BM25/ANN).
  • Alguns sistemas usam destilação (distillation): um professor (teacher) forte porém caro (codificador cruzado) treina um aluno (student) mais rápido (codificador duplo).

Tipos de reordenadores que você vai encontrar

1) Reordenadores Transformer de codificador cruzado (mais comum)

São reordenadores clássicos “no estilo BERT (BERT-style)” que produzem uma pontuação de relevância.

Prós:

  • Alta acurácia
  • Direto ao ponto para usar
  • Funciona bem para reordenação de top-N

Contras:

  • A latência escala com N
  • Limitado pelo comprimento máximo da sequência (documentos longos exigem segmentação em trechos)

Uso típico: reordenar os 50–200 principais candidatos para obter um top 10.

2) Modelos de interação tardia (meio-termo)

Modelos como abordagens no estilo ColBERT mantêm mais informação no nível de tokens do que uma única representação vetorial, permitindo melhor correspondência do que codificadores duplos puros, enquanto são mais rápidos do que codificadores cruzados completos.

Prós:

  • Melhor trade-off de revocação/precisão do que codificadores duplos
  • Mais escalável do que codificadores cruzados em algumas configurações

Contras:

  • Indexação e pontuação mais complexas
  • Ainda mais pesado do que a busca vetorial padrão

3) Reordenadores baseados em LLM

Alguns sistemas usam um LLM para ranquear passagens (às vezes com cadeia de pensamento (chain-of-thought) oculta, às vezes com pontuação estruturada).

Prós:

  • Pode incorporar instruções (“prefira documentos de política em vez de posts de blog”)
  • Pode considerar critérios nuances além de relevância tópica

Contras:

  • Custo e latência
  • Potencial inconsistência e sensibilidade ao formato do prompt
  • Mais difícil de avaliar e depurar do que um codificador cruzado determinístico

Se você seguir por esse caminho, considere combinar com Saídas Estruturadas (Structured Outputs) para impor um esquema estável (pontuações, justificativa, IDs escolhidos).

Exemplo prático: reordenando resultados top-N com um codificador cruzado (Python)

Abaixo está um padrão comum usando sentence-transformers para reordenação após qualquer recuperação de primeira etapa. A primeira etapa pode ser BM25, FAISS, Elasticsearch, um banco de dados vetorial, ou uma abordagem híbrida.

from sentence_transformers import CrossEncoder

# A typical cross-encoder reranker (pick a model appropriate for your domain/language)
reranker = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")

def rerank(query: str, candidates: list[dict], top_k: int = 10):
    """
    candidates: list of dicts like:
      {"id": "...", "text": "...", "metadata": {...}, "retrieval_score": float}
    """
    pairs = [(query, c["text"]) for c in candidates]
    scores = reranker.predict(pairs)  # vector of floats

    for c, s in zip(candidates, scores):
        c["rerank_score"] = float(s)

    candidates.sort(key=lambda x: x["rerank_score"], reverse=True)
    return candidates[:top_k]

# Example usage
query = "What is our parental leave policy for contractors?"
candidates = [
    {"id": "a", "text": "Parental leave applies to full-time employees ..."},
    {"id": "b", "text": "Contractor terms: time off is governed by the contract ..."},
    {"id": "c", "text": "Vacation policy for employees ..."},
]

top = rerank(query, candidates, top_k=2)
for item in top:
    print(item["id"], item["rerank_score"])

Notas:

  • Codificadores cruzados não precisam de representações vetoriais; eles pontuam diretamente pares de texto.
  • Você pode passar campos adicionais (título, cabeçalho de seção) concatenando-os em text.
  • Mantenha candidatos curtos o suficiente para caber no máximo de tokens do modelo (segmentação em trechos geralmente é necessária).

Escolhendo N e K: custo/latência vs qualidade

Dois hiperparâmetros dominam o design de reordenação:

  • N (candidatos recuperados): um N maior aumenta a revocação, mas aumenta o custo de reordenação.
  • K (resultados mantidos): um K pequeno melhora a precisão e reduz o tamanho do contexto a jusante para RAG.

Pontos de partida comuns:

  • N = 50–200, K = 5–20 para RAG
  • N = 100–1000, K = 10–50 para interface de busca (depende do orçamento de latência)

Um fluxo de trabalho útil:

  1. Comece com N=100, K=10.
  2. Avalie casos de falha.
  3. Aumente N se você estiver perdendo documentos relevantes (problema de revocação).
  4. Melhore o modelo reordenador ou a formatação de entrada se documentos relevantes estiverem presentes mas ranqueados baixo (problema de ranqueamento).

Como a reordenação melhora o RAG especificamente

Em RAG, a reordenação frequentemente melhora:

  • Acurácia da resposta: o LLM vê mais contexto realmente relevante.
  • Qualidade de fundamentação: citações se alinham melhor com a pergunta (veja Fundamentação e Citações).
  • Menor taxa de alucinação: menos passagens “quase relevantes” que enganam o gerador.

Um fluxo típico de RAG:

  1. Recuperar N trechos (denso/híbrido)
  2. Reordenar para os K principais trechos
  3. Montar uma janela de contexto com esses K trechos
  4. Gerar resposta com citações

Como a etapa de geração é sensível aos poucos trechos do topo, precisão@K frequentemente importa mais do que a revocação total quando N já é razoavelmente alto.

Formatação de entrada: pequenas escolhas que importam

Reordenadores são sensíveis a como você apresenta o texto. Boas práticas:

  • Incluir títulos e cabeçalhos:
    text = f"Title: {title}\nSection: {header}\n\n{chunk_text}"
  • Manter trechos coesos: evite cortar frases no meio (veja Ingestão e Segmentação em Trechos).
  • Adicionar metadados leves (com cuidado): “Tipo de documento: política” pode ajudar, mas ruído demais pode atrapalhar.
  • Normalizar boilerplate: rodapés/menus repetidos podem dominar os sinais de relevância.

Para codificadores cruzados, lembre-se dos limites de tokens:

  • Se seus trechos forem longos, trunque com cuidado (frequentemente pelo final, mas às vezes você quer manter introduções).
  • Considere truncamento “focado na consulta” para documentos longos (ex.: manter os parágrafos mais relevantes usando uma heurística mais barata antes do codificador cruzado).

Avaliação: como saber se a reordenação ajuda

A avaliação offline tipicamente usa conjuntos de dados rotulados (ou proxies como logs de cliques) e métricas de ranqueamento:

  • RRM (Mean Reciprocal Rank, MRR): recompensa colocar uma resposta correta perto do topo.
  • GCDN@K (Normalized Discounted Cumulative Gain, NDCG@K): considera relevância graduada e posição.
  • Precisão@K / Revocação@K: simples e diretamente ligado à seleção de contexto em RAG.

A avaliação online frequentemente usa:

  • Satisfação de busca, taxa de cliques, tempo até a resposta
  • Correção de respostas de RAG por revisão humana
  • Benchmarks automáticos de QA (cuidado: podem não refletir seu domínio)

Uma armadilha comum: medir métricas de recuperação, mas não a qualidade de RAG ponta a ponta. A reordenação pode melhorar a acurácia da resposta mesmo que altere apenas modestamente NDCG, porque ela muda qual evidência entra no prompt.

Considerações de implantação (latência, batching e escalabilidade)

Latência e vazão

O custo de codificador cruzado é aproximadamente proporcional a N:

  • Você executa uma passagem forward por par candidato.
  • Batching em GPU ajuda substancialmente.

Dicas práticas:

  • Agrupe pares em batches (ex.: 16–128 pares por batch, dependendo da memória da GPU).
  • Use reordenadores menores (baseados em MiniLM (MiniLM-based)) para sistemas interativos.
  • Faça cache de resultados de reordenação para consultas repetidas (veja Cache).

Reordenação em duas etapas (opcional)

Para orçamentos rígidos de latência:

  1. Primeiro reordenador (barato): modelo leve reduz N→M
  2. Segundo reordenador (forte): codificador cruzado ou LLM reduz M→K

Escolha de modelo e adaptação ao domínio

Reordenadores prontos (out-of-the-box) podem ser fortes, mas incompatibilidade de domínio é comum em contextos corporativos/jurídicos/médicos.

Opções:

  • Ajustar finamente (fine-tune) com rótulos consulta–documento do seu domínio
  • Usar supervisão fraca (weak supervision) (cliques, pares de QA, rotulagem heurística)
  • Minerar negativos difíceis do seu recuperador existente para ensinar distinções sutis ao reordenador

Modos comuns de falha e mitigações

  • Documento relevante não está no top N: a reordenação não consegue recuperar o que não foi recuperado.
    Mitigação: melhorar a recuperação de primeira etapa (híbrida, melhores representações vetoriais, expansão de consulta, filtros por metadados).
  • Reordenador superajusta a padrões superficiais: por exemplo, prefere documentos com termos da consulta repetidos.
    Mitigação: melhores negativos, ajuste fino específico do domínio, avaliar em exemplos adversariais.
  • Artefatos de segmentação em trechos: o reordenador vê contexto incompleto e o ranqueia mal.
    Mitigação: ajustar tamanho/sobreposição de trechos, incluir títulos de seção, ou reordenar em níveis documento-then-passage.
  • Risco de injeção de prompt (prompt injection) (reordenadores com LLM): passagens maliciosas podem influenciar o ranqueamento se o reordenador “seguir” instruções no texto.
    Mitigação: preferir codificadores cruzados no estilo classificador para ranqueamento, sanitizar conteúdo, restringir saídas.

Reordenação com busca híbrida

A reordenação combina especialmente bem com Busca Híbrida (Esparsa + Densa) (Hybrid Search (Sparse + Dense)):

  • Recuperação esparsa (BM25) é boa em correspondência exata de termos (nomes, códigos, IDs).
  • Recuperação densa é boa em similaridade semântica e paráfrases.
  • O conjunto mesclado de candidatos é amplo (alta revocação).
  • O reordenador impõe uma única ordenação de alta precisão.

Em muitos sistemas reais, híbrida + reordenação é o “baseline forte padrão”.

Como a reordenação se relaciona com recuperação agêntica

Em RAG Agêntico (Agentic RAG), o sistema pode:

  • decompor a consulta,
  • recuperar iterativamente,
  • refinar buscas com base em resultados parciais.

A reordenação pode ser aplicada em cada iteração para garantir que o agente raciocine sobre a melhor evidência, e não apenas sobre os vizinhos mais próximos.

Checklist de boas práticas

  • Recupere de forma ampla (N=50–200) e então reordene de forma estreita (K=5–20).
  • Prefira codificadores cruzados para ranqueamento determinístico e de alta precisão.
  • Faça batching da inferência do reordenador; meça latência no pico de carga.
  • Trate a reordenação como um componente de tempo de consulta — otimize para latência real do usuário.
  • Avalie tanto métricas de recuperação (RRM/GCDN) quanto a correção de RAG ponta a ponta.
  • Se a relevância for específica do domínio, planeje ajuste fino e mineração de negativos difíceis.
  • Mantenha segmentação em trechos e metadados consistentes; a qualidade da reordenação é altamente sensível à qualidade do texto de entrada.

Resumo

A reordenação é uma técnica de recuperação de segunda etapa que aumenta significativamente a qualidade dos resultados ao usar modelos mais fortes — mais comumente codificadores cruzados — para reavaliar e reordenar documentos candidatos. É uma das melhorias de maior alavancagem que você pode fazer em um pipeline de recuperação, particularmente para RAG, porque aumenta diretamente a probabilidade de o modelo ver a evidência correta. Ao equilibrar o tamanho do conjunto de candidatos, a força do modelo e as restrições de latência, a reordenação oferece um caminho prático para alta precisão sem sacrificar revocação.