BestRAG - Hybrid RAG Storage & Retrieval Cheatsheet
BestRAG (Best Retrieval Augmented Generation) ist eine Python-Bibliothek zum Erstellen von Hybrid RAG Pipelines. Sie kombiniert Dense-, Sparse- und Late-Interaction-Embeddings zum effizienten Speichern und Durchsuchen von Dokumenten mit Qdrant als Vektor-Store und FastEmbed für die Embeddings. Die Idee: Speichere jeden Chunk einmal mit mehreren Darstellungen, dann hole mit kombinierter Relevanz ab, damit du beide die semantische Erinnerung von Dense Vektoren und die Exakt-Term-Präzision von Sparse (BM25-Stil) Suche erhältst.
Installation
| Method | Command |
|---|
| pip | pip install bestrag |
| Requirements | Eine Qdrant-Instanz (Local Docker oder Qdrant Cloud) |
| Embeddings | Verwendet FastEmbed unter der Haube |
| Verify | python -c "import bestrag; print('ok')" |
Why Hybrid
| Retrieval type | Stark bei | Schwach bei |
|---|
| Dense (vector) | Bedeutung, Umformulierung | Exakte IDs, Zahlen, seltene Begriffe |
| Sparse (BM25) | Exakte Begriffe, Identifikatoren | Synonyme, Umformulierung |
| Late interaction | Feines Token-Matching | Kosten |
| Fused (hybrid) | Bestes von Dense + Sparse | — |
BestRAG speichert alle Darstellungen, damit eine einzelne Abfrage von all ihnen profitiert.
Basic Usage
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)
| Method | Beschreibung |
|---|
BestRAG(url, collection_name, ...) | Verbinde mit Qdrant, wähle eine Collection |
store_pdf(path) | Parse + Chunk + Embedde + Upsert eine PDF |
store_text(text, metadata=...) | Absorbiere Rohtext |
search(query, limit=k) | Hybrid (Fused) Retrieval |
delete(...) | Entferne Dokumente |
What Happens on Ingest
| Step | Detail |
|---|
| Parse | Extrahiere Text (z.B. aus PDF) |
| Chunk | Teile in Passagen |
| Embed | Dense + Sparse + Late-Interaction-Vektoren pro Chunk |
| Upsert | Speichere alle Vektoren + Payload in Qdrant |
What Happens on Search
| Step | Detail |
|---|
| Embed query | Dense + Sparse (+ Late Interaction) |
| Query Qdrant | Abrufen von Kandidaten pro Darstellung |
| Fuse | Kombiniere Rankings (RRF-Stil) in eine Liste |
| Return | Top-K Passagen mit Scores + Metadaten |
Feeding Results to an 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
Tuning
| Lever | Effekt |
|---|
| Chunk size/overlap | Retrieval Granularität |
| Dense model | Semantische Qualität (über FastEmbed) |
| Sparse model | Exact-Term Matching (BM25) |
limit (k) | Erinnerung vs Prompt Size |
| Metadata filters | Restrict Search Scope / Access Control |
BestRAG vs Rolling Your Own
| Aspect | BestRAG | Manual (LangChain/LlamaIndex) |
|---|
| Hybrid setup | Built-in (Dense+Sparse+LI) | Manual Wiring |
| Store | Qdrant, Opinionated | Any, Flexible |
| Control | Simpler, Fewer Knobs | Vollständige Kontrolle |
| Best for | Fast Hybrid RAG Start | Custom Pipelines |
Gebaut auf FastEmbed und Qdrant; greife zu LangChain oder LlamaIndex wenn du vollständige Pipeline-Kontrolle brauchst.
Resources