BestRAG - Cheatsheet Archiviazione e Recupero RAG Ibrido
BestRAG (Best Retrieval Augmented Generation) è una libreria Python per la costruzione di pipeline RAG ibride. Combina embedding densi, sparse e late-interaction per l”archiviazione e la ricerca di documenti in modo efficiente, utilizzando Qdrant come archivio vettoriale e FastEmbed per gli embedding. L”idea: archivia ogni chunk una volta con più rappresentazioni, quindi recupera con rilevanza fusione in modo da ottenere sia il richiamo semantico dei vettori densi che la precisione esatta del termine di sparse (stile BM25).
Installazione
| Metodo | Comando |
|---|
| pip | pip install bestrag |
| Requisiti | Un”istanza Qdrant (Docker locale o Qdrant Cloud) |
| Embedding | Utilizza FastEmbed sotto il cofano |
| Verifica | python -c "import bestrag; print('ok')" |
Perché Ibrido
| Tipo di recupero | Forte con | Debole con |
|---|
| Denso (vettore) | Significato, parafrasi | ID esatti, numeri, termini rari |
| Sparse (BM25) | Termini esatti, identificatori | Sinonimi, parafrasi |
| Late interaction | Corrispondenza token fine-grained | Costo |
| Fuso (ibrido) | Meglio di denso + sparse | — |
BestRAG memorizza tutte le rappresentazioni in modo che una singola query tragga vantaggio da tutte loro.
Uso di Base
from bestrag import BestRAG
rag = BestRAG(
url="http://localhost:6333", # Qdrant
api_key="...", # se si utilizza Qdrant Cloud
collection_name="docs",
)
# Ingesta documenti (embed denso + sparse + late-interaction, upsert in Qdrant)
rag.store_pdf("handbook.pdf")
rag.store_text("Nick prefers concise answers.", metadata={"source": "prefs"})
# Recupera con rilevanza ibrida fusione
results = rag.search("what does the refund policy say?", limit=5)
for r in results:
print(r.score, r.text)
| Metodo | Descrizione |
|---|
BestRAG(url, collection_name, ...) | Connettiti a Qdrant, scegli una raccolta |
store_pdf(path) | Analizza + chunk + embed + upsert un PDF |
store_text(text, metadata=...) | Ingesta testo grezzo |
search(query, limit=k) | Recupero ibrido (fuso) |
delete(...) | Rimuovi documenti |
Cosa Succede su Ingesta
| Passaggio | Dettaglio |
|---|
| Analizza | Estrai testo (ad es. da PDF) |
| Chunk | Dividi in passaggi |
| Embed | Vettori densi + sparse + late-interaction per chunk |
| Upsert | Memorizza tutti i vettori + payload in Qdrant |
Cosa Succede su Ricerca
| Passaggio | Dettaglio |
|---|
| Embed query | Denso + sparse (+ late interaction) |
| Query Qdrant | Recupera candidati per rappresentazione |
| Fondi | Combina ranking (stile RRF) in un elenco |
| Ritorna | Top-k passaggi con punteggi + metadati |
Alimentare Risultati a un LLM
# Recupera, quindi costruisci un prompt fondato
hits = rag.search(user_question, limit=5)
context = "\n\n".join(h.text for h in hits)
prompt = f"Answer using only this context:\n{context}\n\nQ: {user_question}"
# → invia il prompt al tuo LLM
Accordatura
| Leva | Effetto |
|---|
| Dimensione chunk/sovrapposizione | Granularità del recupero |
| Modello denso | Qualità semantica (tramite FastEmbed) |
| Modello sparse | Corrispondenza esatta del termine (BM25) |
limit (k) | Richiamo vs dimensione prompt |
| Filtri metadati | Ambito di ricerca restrittivo / controllo di accesso |
BestRAG vs Rotolamento Proprio
| Aspetto | BestRAG | Manuale (LangChain/LlamaIndex) |
|---|
| Setup ibrido | Built-in (denso+sparse+LI) | Cablaggio manuale |
| Memorizza | Qdrant, opinionato | Qualsiasi, flessibile |
| Controllo | Più semplice, meno manopole | Controllo totale |
| Migliore per | Inizio RAG ibrido veloce | Pipeline personalizzate |
Costruito su FastEmbed e Qdrant; raggiungi LangChain o LlamaIndex quando hai bisogno di controllo della pipeline completa.
Risorse