Ce este Dense Retrieval vs. Sparse Retrieval?

Diferența dintre căutarea după sens, cu embeddings, și căutarea după cuvinte exacte, cu BM25, și de ce sistemele RAG le combină des.

Denumire completă

Dense vs. Sparse – căutare după vectori de sens (embeddings) versus căutare după potrivirea cuvintelor (BM25, TF-IDF)

Sparse retrieval reprezintă textul prin cuvintele lui: un vector cu câte o dimensiune pentru fiecare termen din vocabular, aproape toate zero. BM25 este funcția de ranking lexicală clasică: ține cont de frecvența termenului în document, de raritatea lui în colecție și de lungimea documentului. Anthropic dă exemplul interogării „Error code TS-999”: un model de embedding poate aduce texte despre coduri de eroare în general, iar BM25 găsește exact șirul „TS-999”.

Dense retrieval codifică întrebarea și documentele în vectori denși cu un model neural (bi-encoder) și caută vecinii cei mai apropiați. Lucrarea DPR (Karpukhin et al., EMNLP 2020) a arătat că un retriever dens antrenat pe perechi întrebare–pasaj depășește un sistem Lucene-BM25 cu 9–19 puncte procentuale absolute la acuratețea top-20, pe mai multe seturi de întrebări open-domain.

Documentația Sentence Transformers rezumă diferența: căutarea lexicală caută potriviri literale și nu recunoaște sinonime, acronime sau variații de scriere, pe care căutarea semantică le prinde. În schimb, embeddings pot rata potrivirile exacte. De aceea multe sisteme combină cele două semnale (căutare hibridă).

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
BM25 Funcție de ranking lexicală; o folosesc motoare ca Elasticsearch și OpenSearch.
Vector sparse Câte o dimensiune pentru fiecare termen, majoritatea zero. pgvector are tipul sparsevec pentru astfel de vectori.
Vector dens Sute sau mii de valori reale (de exemplu 1.536 la text-embedding-3-small).
Bi-encoder Întrebarea și documentul se codifică separat; vectorii documentelor se calculează dinainte și se indexează.

Exemple practice și scenarii reale

Exemplul 1: Ce prinde fiecare metodă

Exemplu ilustrativ.

Întrebare: "Cum îmi schimb parola dacă am uitat-o?"
  dense:  găsește și "Resetarea accesului la cont" (alt vocabular, același sens)
  sparse: găsește textele care conțin "parola", "uitat"

Întrebare: "Error code TS-999"
  sparse: potrivire exactă pe "TS-999"
  dense:  poate aduce alte coduri de eroare cu descriere asemănătoare

Greșeli frecvente și capcane

  • Să presupui că dense e mereu mai bun. DPR a câștigat față de BM25 pe seturile lui, dar căutarea lexicală rămâne utilă pentru coduri, nume și termeni rari; măsoară pe datele tale.
  • Să folosești un model de embedding fără să-l testezi pe limba și domeniul tău. Pentru texte în română alege un model multilingv și verifică recall-ul.
  • Să aduni direct scorurile BM25 cu similaritatea cosinus. Au scale diferite; pentru combinare se folosesc ranguri (RRF) sau normalizare.

Noțiuni și module înrudite