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éthode | Commande |
|---|
| pip | pip install bestrag |
| Exigences | Une instance Qdrant (Docker local ou Qdrant Cloud) |
| Embeddings | Utilise FastEmbed sous le capot |
| Vérifier | python -c "import bestrag; print('ok')" |
Pourquoi hybride
| Type de récupération | Fort en | Faible en |
|---|
| Dense (vectoriel) | Sens, paraphrase | IDs exacts, nombres, termes rares |
| Creux (BM25) | Termes exacts, identifiants | Synonymes, paraphrase |
| Late interaction | Correspondance de jetons fine | Coû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éthode | Description |
|---|
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
| Étape | Détail |
|---|
| Parse | Extraire le texte (par ex. d’un PDF) |
| Chunk | Diviser en passages |
| Embed | Vecteurs denses + creux + late-interaction par segment |
| Upsert | Stocker tous les vecteurs + charge utile dans Qdrant |
Ce qui se passe lors de la recherche
| Étape | Détail |
|---|
| Embed query | Vecteurs denses + creux (+ late interaction) |
| Query Qdrant | Récupérer les candidats par représentation |
| Fuse | Combiner les classements (style RRF) en une liste |
| Return | Top-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
| Levier | Effet |
|---|
| Taille/chevauchement des segments | Granularité de récupération |
| Modèle dense | Qualité sémantique (via FastEmbed) |
| Modèle creux | Correspondance de termes exacts (BM25) |
limit (k) | Rappel vs taille de prompt |
| Filtres de métadonnées | Restreindre la portée de recherche / contrôle d’accès |
BestRAG vs rouler le vôtre
| Aspect | BestRAG | Manuel (LangChain/LlamaIndex) |
|---|
| Configuration hybride | Intégré (dense+creux+LI) | Câblage manuel |
| Stocker | Qdrant, opinioné | Tout, flexible |
| Contrôle | Plus simple, moins de boutons | Contrôle total |
| Meilleur pour | Démarrage RAG hybride rapide | Pipelines personnalisés |
Construit sur FastEmbed et Qdrant ; atteindre LangChain ou LlamaIndex quand vous avez besoin du contrôle total du pipeline.
Ressources