Aller au contenu

BestRAG - Stockage et récupération RAG hybride

BestRAG - Stockage et récupération RAG hybride

BestRAG (Best Retrieval Augmented Generation) est une bibliothèque Python pour construire des pipelines RAG hybride. Elle combine les embeddings denses, creux et late-interaction pour stocker et rechercher efficacement les documents, en utilisant Qdrant comme magasin vectoriel et FastEmbed pour les embeddings. L’idée : stocker chaque segment une fois avec plusieurs représentations, puis récupérer avec une pertinence fusionnée pour que vous obteniez à la fois le rappel sémantique des vecteurs denses et la précision des termes exacts de la recherche creux (style BM25).

Installation

MéthodeCommande
pippip install bestrag
ExigencesUne instance Qdrant (Docker local ou Qdrant Cloud)
EmbeddingsUtilise FastEmbed sous le capot
Vérifierpython -c "import bestrag; print('ok')"

Pourquoi hybride

Type de récupérationFort enFaible en
Dense (vectoriel)Sens, paraphraseIDs exacts, nombres, termes rares
Creux (BM25)Termes exacts, identifiantsSynonymes, paraphrase
Late interactionCorrespondance de jetons fineCoût
Fusionné (hybride)Meilleur des deux

BestRAG stocke toutes les représentations afin qu’une requête unique bénéficie de toutes.

Utilisation basique

from bestrag import BestRAG

rag = BestRAG(
    url="http://localhost:6333",     # Qdrant
    api_key="...",                   # if using Qdrant Cloud
    collection_name="docs",
)

# Ingest documents (embeds dense + sparse + late-interaction, upserts to Qdrant)
rag.store_pdf("handbook.pdf")
rag.store_text("Nick prefers concise answers.", metadata={"source": "prefs"})

# Retrieve with fused hybrid relevance
results = rag.search("what does the refund policy say?", limit=5)
for r in results:
    print(r.score, r.text)
MéthodeDescription
BestRAG(url, collection_name, ...)Se connecter à Qdrant, choisir une collection
store_pdf(path)Analyser + segmenter + intégrer + insérer un PDF
store_text(text, metadata=...)Ingérer du texte brut
search(query, limit=k)Récupération hybride (fusionnée)
delete(...)Supprimer les documents

Ce qui se passe lors de l’ingestion

ÉtapeDétail
ParseExtraire le texte (par ex. d’un PDF)
ChunkDiviser en passages
EmbedVecteurs denses + creux + late-interaction par segment
UpsertStocker tous les vecteurs + charge utile dans Qdrant

Ce qui se passe lors de la recherche

ÉtapeDétail
Embed queryVecteurs denses + creux (+ late interaction)
Query QdrantRécupérer les candidats par représentation
FuseCombiner les classements (style RRF) en une liste
ReturnTop-k passages avec scores + métadonnées

Alimentation des résultats à un LLM

# Retrieve, then build a grounded prompt
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}"
# → send prompt to your LLM

Réglage

LevierEffet
Taille/chevauchement des segmentsGranularité de récupération
Modèle denseQualité sémantique (via FastEmbed)
Modèle creuxCorrespondance de termes exacts (BM25)
limit (k)Rappel vs taille de prompt
Filtres de métadonnéesRestreindre la portée de recherche / contrôle d’accès

BestRAG vs rouler le vôtre

AspectBestRAGManuel (LangChain/LlamaIndex)
Configuration hybrideIntégré (dense+creux+LI)Câblage manuel
StockerQdrant, opinionéTout, flexible
ContrôlePlus simple, moins de boutonsContrôle total
Meilleur pourDémarrage RAG hybride rapidePipelines personnalisés

Construit sur FastEmbed et Qdrant ; atteindre LangChain ou LlamaIndex quand vous avez besoin du contrôle total du pipeline.

Ressources