Ir al contenido

BestRAG - Almacenamiento y recuperación de RAG híbrido

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étodoComando
pippip install bestrag
RequerimientosUna instancia de Qdrant (Docker local o Qdrant Cloud)
IncrustacionesUsa FastEmbed bajo el capó
Verificarpython -c "import bestrag; print('ok')"

Por qué híbrido

Tipo de recuperaciónFuerte enDébil en
Densa (vector)Significado, paráfrasisIDs exactos, números, términos raros
Dispersa (BM25)Términos exactos, identificadoresSinónimos, paráfrasis
Interacción tardíaCoincidencia de token de grano finoCosto
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étodoDescripció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

PasoDetalle
AnalizarExtrae texto (por ejemplo, de PDF)
FragmentoDivide en pasajes
IncrustarVectores densos + dispersos + interacción tardía por fragmento
UpsertAlmacena todos los vectores + carga en Qdrant

Qué sucede en la búsqueda

PasoDetalle
Incrustar consultaDensa + dispersa (+ interacción tardía)
Consulta QdrantRecupera candidatos por representación
FusionarCombina rankings (estilo RRF) en una lista
DevolverPasajes 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

PalancaEfecto
Tamaño/superposición de fragmentoGranularidad de recuperación
Modelo densoCalidad semántica (a través de FastEmbed)
Modelo dispersoCoincidencia de término exacto (BM25)
limit (k)Recuerdo vs tamaño de aviso
Filtros de metadatosRestringir ámbito de búsqueda / control de acceso

BestRAG vs hacer uno mismo

AspectoBestRAGManual (LangChain/LlamaIndex)
Configuración híbridaIncorporado (densa+dispersa+LI)Cableado manual
AlmacenarQdrant, opinadoCualquiera, flexible
ControlMás simple, menos perillasControl total
Mejor paraInicio de RAG híbrido rápidoCanalizaciones personalizadas

Construido sobre FastEmbed y Qdrant; usa LangChain o LlamaIndex cuando necesites control completo de canalización.

Recursos