Ce este Căutarea Hibridă (Hybrid Search & RRF)?

Combinarea căutării după cuvinte exacte cu căutarea după sens, prin fuziunea clasamentelor (RRF) sau a scorurilor normalizate.

Denumire completă

Hybrid Search – combinarea rezultatelor căutării lexicale (BM25) cu cele vectoriale, de exemplu prin Reciprocal Rank Fusion: score(d) = Σ 1 / (k + rank(d))

Căutarea hibridă rulează două interogări pe aceeași colecție, una lexicală (BM25 sau vectori sparse) și una vectorială (dense), și unește rezultatele într-un singur clasament. Scopul este să păstreze ce prinde fiecare: potrivirile exacte și potrivirile de sens.

Reciprocal Rank Fusion (Cormack, Clarke și Büttcher, SIGIR 2009) folosește doar pozițiile: pentru fiecare listă în care apare, un document primește 1 / (k + rang), cu rangul de la 1, iar valorile se adună. Nu trebuie normalizate scoruri cu scale diferite. În Elasticsearch, retriever-ul rrf are rank_constant implicit 60 și rank_window_size implicit egal cu size.

Nu toate produsele folosesc RRF implicit. Weaviate are relativeScoreFusion (implicită din v1.24, normalizează scorurile) și rankedFusion, plus alpha (0 = doar cuvinte cheie, 1 = doar vectori, implicit 0,75). Qdrant oferă fuziunile rrf și dbsf. Pinecone descrie trei variante: filtru text urmat de căutare densă, fuziune RRF pe client și un index comun dense–sparse ponderat cu alpha. În testele Anthropic (Contextual Retrieval), combinarea embeddings contextuale cu BM25 contextual a redus rata de eșec a regăsirii top-20 cu 49% (de la 5,7% la 2,9%).

Concepte cheie și caracteristici

Concept / Parametru Descriere practică
RRF score(d) = Σ 1 / (k + rank(d)), rangurile încep de la 1.
rank_constant (k) Elasticsearch: implicit 60, minimum 1. Un k mai mare dă mai multă greutate documentelor de pe poziții mai joase.
rank_window_size Elasticsearch: câte rezultate se iau din fiecare listă înainte de fuziune; implicit egal cu size.
alpha (Weaviate) Ponderea căutării vectoriale: 0 doar cuvinte cheie, 1 doar vectori; implicit 0,75.
relativeScoreFusion / rankedFusion Weaviate: fuziune pe scoruri normalizate (implicită din v1.24) sau pe ranguri.
rrf / dbsf (Qdrant) Fuziune pe ranguri sau Distribution-Based Score Fusion, care normalizează distribuția scorurilor (din v1.11.0).

Exemple practice și scenarii reale

Exemplul 1: RRF în Elasticsearch (exemplul din documentație)

Retriever-ul knn și cel standard rulează independent; rrf le combină.

GET example-index/_search
{
  "retriever": {
    "rrf": {
      "retrievers": [
        { "standard": { "query": { "term": { "text": "shoes" } } } },
        { "knn": { "field": "vector", "query_vector": [1.25, 2, 3.5], "k": 50, "num_candidates": 100 } }
      ],
      "rank_window_size": 50,
      "rank_constant": 20
    }
  }
}

Exemplul 2: Calculul RRF de mână, cu k = 60

Document A: locul 1 la BM25, locul 3 la vectori
  1/(60+1) + 1/(60+3) = 0,01639 + 0,01587 = 0,03227
Document B: locul 2 la vectori, lipsește din lista BM25
  1/(60+2) = 0,01613
=> A înaintea lui B

Greșeli frecvente și capcane

  • Să aduni direct scorul BM25 cu similaritatea cosinus. Scalele diferă; folosește RRF sau o normalizare (relativeScoreFusion, DBSF).
  • Să setezi o fereastră de candidați prea mică. Un document care apare doar pe locul 40 într-o listă nu intră în fuziune dacă fereastra este 20.
  • Să presupui că hibridul ajută mereu. Compară recall-ul cu și fără componenta lexicală pe un set de întrebări reale.

Noțiuni și module înrudite