Ce este Re-ranking și Cross-Encoders?

A doua etapă a regăsirii: un cross-encoder sau un API de reranking punctează fiecare pereche întrebare–fragment și păstrează doar fragmentele cele mai relevante.

Denumire completă

Re-ranking – reordonarea candidaților din prima etapă cu un model care evaluează întrebarea și fragmentul împreună (cross-encoder)

Modelele de embedding folosite la căutare sunt bi-encodere: întrebarea și documentul se codifică separat, deci vectorii documentelor se pot calcula dinainte. Un cross-encoder primește întrebarea și documentul împreună și întoarce un singur scor de relevanță. Documentația Sentence Transformers spune că cross-encoderele au, în general, performanță mai bună, dar sunt mai lente, pentru că fac un calcul pentru fiecare pereche și nu produc embeddings care se pot indexa.

De aceea se folosesc în două etape: prima etapă (BM25, vectori sau hibrid) aduce un set de candidați, de exemplu 100, iar re-rankerul îi reordonează și se păstrează primii câțiva. În experimentul Anthropic (Contextual Retrieval) s-au luat primii 150 de candidați, s-au reordonat cu reranker-ul Cohere și s-au păstrat 20; cu reranking, reducerea ratei de eșec a regăsirii top-20 a crescut de la 49% la 67%.

Variante: modele deschise rulate local cu Sentence Transformers (de exemplu cross-encoder/ms-marco-MiniLM-L6-v2, BAAI/bge-reranker-v2-m3, jinaai/jina-reranker-v2-base-multilingual) sau API-uri, ca Cohere Rerank.

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
Bi-encoder Codifică separat; potrivit pentru indexare și căutare în colecții mari.
Cross-encoder Codifică perechea; mai precis, dar costul crește cu numărul de candidați.
top-N (candidați) Câți candidați intră în reranker. Mai mulți: recall mai bun, latență mai mare.
top-K (păstrați) Câte fragmente ajung în prompt după reordonare.
Scor Modelele MS MARCO întorc logit-uri; cu activation_fn=torch.nn.Sigmoid() obții valori între 0 și 1, fără să se schimbe ordinea.

Exemple practice și scenarii reale

Exemplul 1: Re-ranking local cu Sentence Transformers

CrossEncoder.rank întoarce candidații ordonați după scor.

from sentence_transformers import CrossEncoder

model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L6-v2")
intrebare = "How many people live in Berlin?"
candidati = [
    "Berlin had a population of 3,520,031 registered inhabitants in an area of 891.82 square kilometers.",
    "Berlin is well known for its museums.",
]
clasament = model.rank(intrebare, candidati, top_k=1, return_documents=True)

Exemplul 2: Re-ranking cu Cohere Rerank

import cohere

co = cohere.ClientV2()
rezultate = co.rerank(
    model="rerank-v5.0-pro", query=intrebare, documents=candidati, top_n=5
)

Greșeli frecvente și capcane

  • Să rulezi cross-encoderul pe toată colecția. Este gândit pentru candidații aduși de prima etapă, nu pentru milioane de documente.
  • Să tratezi scorul brut ca probabilitate. La modelele MS MARCO scorul este un logit; contează ordinea, nu valoarea, dacă nu aplici sigmoid.
  • Să nu măsori latența. Fiecare candidat în plus înseamnă încă o trecere prin model; alege top-N după un buget de timp.

Noțiuni și module înrudite