BestRAG - Cheatsheet de Recuperação e Armazenamento de RAG Híbrido
BestRAG (Best Retrieval Augmented Generation) é uma biblioteca Python para construir pipelines de RAG híbrido. Combina embeddings densos, esparsos e de interação tardia para armazenar e buscar documentos com eficiência, usando Qdrant como armazenamento de vetor e FastEmbed para os embeddings. A ideia: armazenar cada pedaço uma vez com múltiplas representações, depois recuperar com relevância fundida para que você obtenha tanto o recall semântico de vetores densos quanto a precisão de termos exatos da busca esparsa (estilo BM25).
Instalação
| Método | Comando |
|---|
| pip | pip install bestrag |
| Requirements | Uma instância Qdrant (Docker local ou Qdrant Cloud) |
| Embeddings | Usa FastEmbed sob o capuz |
| Verify | python -c "import bestrag; print('ok')" |
Por Que Híbrido
| Tipo de Recuperação | Forte em | Fraco em |
|---|
| Dense (vector) | Significado, paráfrase | IDs exatos, números, termos raros |
| Sparse (BM25) | Termos exatos, identificadores | Sinônimos, paráfrase |
| Late interaction | Correspondência de token de grana fina | Custo |
| Fused (hybrid) | Melhor de denso + esparso | — |
BestRAG armazena todas as representações para que uma única consulta se beneficie de todas elas.
Uso Básico
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étodo | Descrição |
|---|
BestRAG(url, collection_name, ...) | Conecte a Qdrant, escolha uma coleção |
store_pdf(path) | Parse + chunk + embed + upsert um PDF |
store_text(text, metadata=...) | Ingira texto bruto |
search(query, limit=k) | Recuperação híbrida (fundida) |
delete(...) | Remover documentos |
O Que Acontece na Ingestão
| Passo | Detalhe |
|---|
| Parse | Extraia texto (ex. de PDF) |
| Chunk | Divida em passagens |
| Embed | Vetores densos + esparsos + de interação tardia por chunk |
| Upsert | Armazene todos os vetores + payload em Qdrant |
O Que Acontece na Busca
| Passo | Detalhe |
|---|
| Embed query | Denso + esparso (+ interação tardia) |
| Query Qdrant | Recupere candidatos por representação |
| Fuse | Combine classificações (estilo RRF) em uma lista |
| Return | Top-k passagens com pontuações + metadados |
Alimentando Resultados em um 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
Ajuste
| Alavanca | Efeito |
|---|
| Chunk size/overlap | Granularidade de recuperação |
| Dense model | Qualidade semântica (via FastEmbed) |
| Sparse model | Correspondência de termo exato (BM25) |
limit (k) | Recall vs tamanho de prompt |
| Metadata filters | Restringir escopo de busca / controle de acesso |
BestRAG vs Fazendo Você Mesmo
| Aspecto | BestRAG | Manual (LangChain/LlamaIndex) |
|---|
| Hybrid setup | Integrado (denso+esparso+LI) | Fiação manual |
| Store | Qdrant, opinado | Qualquer, flexível |
| Control | Mais simples, menos botões | Controle total |
| Melhor para | Início rápido de RAG híbrido | Pipelines personalizados |
Construído em FastEmbed e Qdrant; alcance LangChain ou LlamaIndex quando você precisa de controle total de pipeline.
Recursos