Skip to content

RAG · BM25 hybrid search + RRF fusion #81

@lucaosti

Description

@lucaosti

Context

La ricerca densa (QVAC) fallisce su query con termini tecnici esatti ("SegWit", "UTXO", "P2SH", "Lightning Network") perché gli embedding catturano similarità semantica, non corrispondenza lessicale. BM25 è esattamente ciò che manca: cattura perfettamente i termini esatti. La fusione dei due con Reciprocal Rank Fusion (RRF) è lo standard de facto per l'hybrid search.

File coinvolti

  • services/ai/app/workers/pipeline.py — costruzione indice BM25 all'ingest
  • services/ai/app/services/chat_service.py — merge RRF al retrieval
  • services/ai/requirements.txt — aggiungere rank_bm25

Azioni richieste

Ingestion (pipeline.py)

  1. pip install rank_bm25
  2. Al termine dell'ingest di un workspace, costruire un indice BM25 sui testi dei chunk
  3. Serializzare l'indice su disco (pickle) nella directory del workspace: {workspace_path}/bm25_index.pkl
  4. Salvare anche la lista dei chunk corrispondenti (con metadati) per il lookup

Retrieval (chat_service.py)

  1. Caricare l'indice BM25 del workspace (lazy load + cache in memoria)
  2. Eseguire query BM25 in parallelo alla query QVAC
  3. Merge con RRF (k=60):
    rrf_score = sum(1 / (rank + 60) for rank in [dense_rank, sparse_rank])
  4. Ordinare per RRF score, passare i top-20 al reranker (issue RAG · Integrare reranker in chat_service (top-20 → rerank → top-5) #80)

Fallback

  • Se l'indice BM25 non esiste per un workspace (es. ingestito prima di questa feature): usare solo risultati QVAC

Acceptance criteria

  • Query con termini tecnici esatti restituiscono chunk rilevanti che prima non apparivano
  • L'indice BM25 viene aggiornato ad ogni re-ingest del workspace
  • La latenza BM25 è trascurabile rispetto a QVAC (<50ms su corpus di 5000 chunk)
  • I test esistenti passano; aggiungere test per la fusione RRF

Riferimenti

  • [rag-sota-2026.md §2.5 — Hybrid Search + Reranking]
  • rank_bm25 — libreria Python BM25

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestragRAG pipeline improvements

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions