Căutare Hibridă: BM25Retriever & QueryFusionRetriever în LlamaIndex & Data RAG

Interogare & RAG Avansat Nivel: avansat

Combină căutarea semantică vectorială cu căutarea lexicală exactă (BM25) prin Reciprocal Rank Fusion, garantând găsirea atât a ideilor, cât și a codurilor exacte de produs.

Sintaxă & invocare Python
from llama_index.retrievers.bm25 import BM25Retriever
from llama_index.core.retrievers import QueryFusionRetriever

vector_retriever = index.as_retriever(similarity_top_k=5)
bm25_retriever = BM25Retriever.from_defaults(docstore=index.docstore, similarity_top_k=5)
hybrid_retriever = QueryFusionRetriever(
    [vector_retriever, bm25_retriever],
    mode='reciprocal_rerank', num_queries=1, similarity_top_k=5
)

Descriere & Utilizare

Căutarea pur vectorială are un punct slab cunoscut: înțelege excelent sensul general al cuvintelor, dar se descurcă slab la coduri exacte de produs (ex: SKU-9941-B), numere de articole de lege (Art. 415 alin. 2), acronime sau nume proprii rare.

Pe de altă parte, algoritmul clasic BM25 (Best Matching 25 – folosit în Elasticsearch) este imbatabil la potrivirea exactă a cuvintelor cheie, dar nu înțelege sinonimele.

QueryFusionRetriever le unește pe amândouă într-un sistem de Hybrid Search: interoghează simultan ambii retrieveri și combină clasamentele folosind formula matematică Reciprocal Rank Fusion (RRF), promovând în top documentele confirmate de ambele metode.

Cum să o reții ușor

💡 Ca o echipă de căutare formată dintr-un detectiv intuitiv care înțelege contextul poveștii (Vector Search) și un arhivar pedant care verifică la literă fiecare serie de buletin și număr de dosar (BM25).

Opțiuni și parametri tehnici

  • Execută în paralel căutarea în spațiul de embedding-uri și căutarea TF-IDF/BM25 peste docstore.
  • Dacă num_queries > 1, folosește LLM-ul pentru a genera automat și 3-4 reformulări ale întrebării utilizatorului.
  • Unifică și deduplică nodurile aplicând algoritmul reciprocal_rerank.

Exemple practice și cazuri de utilizare

  • Construire QueryEngine hibrid: from llama_index.core.query_engine import RetrieverQueryEngine
    qe = RetrieverQueryEngine.from_args(hybrid_retriever)
  • Activare multi-query expansion (4 variante ale întrebării): QueryFusionRetriever([vector_retriever, bm25_retriever], num_queries=4)

Sfaturi de configurare & capcane

Setează num_queries=1 în QueryFusionRetriever dacă vrei viteză maximă fără niciun apel suplimentar la LLM înainte de căutare (pur BM25 + Vectori).

Comenzi și ghiduri înrudite