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.