Carregando
0x50Lição 6 de 11

Recupere, filtre e reordene as evidências

Jogue uma rede larga e depois reordene os candidatos com um cross-encoder, mantendo o conjunto diverso.

20 min Questionário com 6 perguntas 2 exercícios de código
Ao final desta lição, você saberá
  • Explicar o desenho em duas etapas: recuperar e depois reordenar
  • Comparar bi-encoders e cross-encoders
  • Remover quase-duplicatas com a relevância marginal máxima

Uma boa recuperação costuma ser um funil:

  1. Recuperar muitos candidatos rápido (digamos, 50-100) com BM25, embeddings ou os dois. Objetivo: recall alto - não perder a resposta.
  2. Reordenar (rerank) os candidatos com um modelo mais lento e mais inteligente e ficar com os melhores poucos (digamos, 5-20). Objetivo: precisão alta.

Por que duas etapas? Um modelo de embedding é um bi-encoder: ele codifica a consulta e cada chunk separadamente, então os vetores dos chunks podem ser calculados com antecedência - é rápido, mas o modelo nunca vê os dois textos juntos. Um reranker cross-encoder lê a consulta e um chunk juntos e produz uma pontuação de relevância. Ele entende muito melhor (“esta passagem responde mesmo à pergunta?”), mas precisa rodar uma vez por candidato na hora da consulta - lento demais para milhões de chunks, perfeito para 50.

Experimente

Até 15 XP

Recuperador ou reranker?

De qual etapa fala cada afirmação?

0 de 5 classificadosPontuação 0/0
  • “Precisa buscar em milhões de chunks em milissegundos”

  • “Lê a pergunta e a passagem juntas”

  • “Otimizado para recall: não perder a resposta”

  • “Pontua uns 50 candidatos por pergunta”

  • “Usa vetores calculados na indexação”

Diversidade: não mande cinco cópias

Os corpora estão cheios de quase-duplicatas: a mesma política em três páginas, chunks sobrepostos. Mandar cinco versões do mesmo fato desperdiça a janela de contexto e tira espaço de outras evidências.

A relevância marginal máxima (MMR, de maximal marginal relevance) escolhe os chunks um de cada vez, equilibrando a relevância com a similaridade em relação ao que já foi escolhido: score=λ⋅relevance−(1−λ)⋅max⁡similarity to selected\text{score} = \lambda \cdot \text{relevance} - (1 - \lambda) \cdot \max \text{similarity to selected}. Com λ=1\lambda = 1, é pura relevância; um λ\lambda menor favorece a variedade.

two_stage.py
1candidates = {"c1": 0.82, "c2": 0.80, "c3": 0.79}
2cross_scores = {"c1": 0.30, "c2": 0.91, "c3": 0.55}
3reranked = sorted(candidates, key=lambda chunk: cross_scores[chunk], reverse=True)
4print(reranked)
Saída
['c2', 'c3', 'c1']

Principais conclusões

  • Recupere de forma ampla para ter recall e depois reordene uma lista curta para ter precisão.

  • Os cross-encoders leem a consulta e a passagem juntas - são precisos, mas lentos, então use-os em poucos candidatos.

  • Use MMR ou remoção de duplicatas para que o contexto tenha evidências diversas.

Quiz da aula

6 perguntas · aprovação com 5 acertos · até 50 XP

Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.

Pratique: escreva código em Python

Escreva código Python no editor e execute os testes com exemplos. O Python roda localmente no navegador usando WebAssembly.

Exercício 1

Reordene e corte

+25 XP

A primeira linha é um limite. Cada linha seguinte é id first_stage_score reranker_score. Imprima os candidatos ordenados pela pontuação do reranker como id score (2 casas decimais), mantendo só os que estiverem no limite ou acima dele, e depois dropped: IDS (na ordem da entrada) ou dropped: none.

  • Quatro candidatos
main.py
Carregando editor…

O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.

Exercício 2

Escolha chunks diversos com MMR

+25 XP

Entrada: k lambda, depois um objeto JSON com as pontuações de relevância e depois um objeto JSON com as similaridades entre pares, com chaves "a b" (simétricas; pares ausentes valem 0).

Escolha repetidamente o chunk ainda não selecionado com o maior λ⋅relevance−(1−λ)⋅max⁡similarity to the selected chunks\lambda \cdot \text{relevance} - (1 - \lambda) \cdot \max \text{similarity to the selected chunks} (o máximo é 0 quando nenhum foi selecionado; empates vão para o primeiro id em ordem alfabética). Imprima as escolhas separadas por espaços.

  • Equilibrado (lambda 0.5)
  • Pura relevância (lambda 1)
main.py
Carregando editor…

O Python é executado em um ambiente isolado no navegador, com limite de 60 segundos. O runtime é carregado pelo CDN do Pyodide; seu código permanece neste navegador.

Dúvidas sobre esta lição

Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.

Carregando publicações…