BestRAG - Almacenamiento y recuperación de RAG híbrido
BestRAG (Best Retrieval Augmented Generation) es una biblioteca de Python para construir canalizaciones de RAG híbrido. Combina incrustaciones densas, dispersas e de interacción tardía para almacenar y buscar documentos de manera eficiente, usando Qdrant como almacén de vectores y FastEmbed para las incrustaciones. La idea: almacena cada fragmento una sola vez con múltiples representaciones, luego recupera con relevancia fusionada para que obtengas tanto el recuerdo semántico de vectores densos como la precisión de término exacto de búsqueda dispersa (estilo BM25).
Instalación
| Método | Comando |
|---|
| pip | pip install bestrag |
| Requerimientos | Una instancia de Qdrant (Docker local o Qdrant Cloud) |
| Incrustaciones | Usa FastEmbed bajo el capó |
| Verificar | python -c "import bestrag; print('ok')" |
Por qué híbrido
| Tipo de recuperación | Fuerte en | Débil en |
|---|
| Densa (vector) | Significado, paráfrasis | IDs exactos, números, términos raros |
| Dispersa (BM25) | Términos exactos, identificadores | Sinónimos, paráfrasis |
| Interacción tardía | Coincidencia de token de grano fino | Costo |
| Fusionado (híbrido) | Lo mejor de densa + dispersa | — |
BestRAG almacena todas las representaciones para que una sola consulta se beneficie de todas ellas.
Uso básico
from bestrag import BestRAG
rag = BestRAG(
url="http://localhost:6333", # Qdrant
api_key="...", # si usas Qdrant Cloud
collection_name="docs",
)
# Ingiere documentos (incrusta densa + dispersa + interacción tardía, upsert a Qdrant)
rag.store_pdf("handbook.pdf")
rag.store_text("Nick prefers concise answers.", metadata={"source": "prefs"})
# Recuperar con relevancia híbrida fusionada
results = rag.search("what does the refund policy say?", limit=5)
for r in results:
print(r.score, r.text)
| Método | Descripción |
|---|
BestRAG(url, collection_name, ...) | Conecta a Qdrant, elige una colección |
store_pdf(path) | Analiza + fragmenta + incrusta + upsert un PDF |
store_text(text, metadata=...) | Ingiere texto crudo |
search(query, limit=k) | Recuperación híbrida (fusionada) |
delete(...) | Elimina documentos |
Qué sucede en la ingesta
| Paso | Detalle |
|---|
| Analizar | Extrae texto (por ejemplo, de PDF) |
| Fragmento | Divide en pasajes |
| Incrustar | Vectores densos + dispersos + interacción tardía por fragmento |
| Upsert | Almacena todos los vectores + carga en Qdrant |
Qué sucede en la búsqueda
| Paso | Detalle |
|---|
| Incrustar consulta | Densa + dispersa (+ interacción tardía) |
| Consulta Qdrant | Recupera candidatos por representación |
| Fusionar | Combina rankings (estilo RRF) en una lista |
| Devolver | Pasajes top-k con puntuaciones + metadatos |
Alimentar resultados a un LLM
# Recupera, luego construye un aviso fundamentado
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}"
# → envía el aviso a tu LLM
Ajuste
| Palanca | Efecto |
|---|
| Tamaño/superposición de fragmento | Granularidad de recuperación |
| Modelo denso | Calidad semántica (a través de FastEmbed) |
| Modelo disperso | Coincidencia de término exacto (BM25) |
limit (k) | Recuerdo vs tamaño de aviso |
| Filtros de metadatos | Restringir ámbito de búsqueda / control de acceso |
BestRAG vs hacer uno mismo
| Aspecto | BestRAG | Manual (LangChain/LlamaIndex) |
|---|
| Configuración híbrida | Incorporado (densa+dispersa+LI) | Cableado manual |
| Almacenar | Qdrant, opinado | Cualquiera, flexible |
| Control | Más simple, menos perillas | Control total |
| Mejor para | Inicio de RAG híbrido rápido | Canalizaciones personalizadas |
Construido sobre FastEmbed y Qdrant; usa LangChain o LlamaIndex cuando necesites control completo de canalización.
Recursos