Búsquedas Híbridas en Qdrant: BM25/TF-IDF y Vectores Dispersos

Las búsquedas híbridas en Qdrant combinan búsqueda semántica (vectores densos) con búsqueda léxica (BM25/TF-IDF) para mejorar la precisión. Aquí te explico cómo funciona:
1. Cómo Qdrant maneja BM25/TF-IDF
Qdrant no tiene un motor BM25/TF-IDF integrado directamente, pero ofrece dos enfoques:
A. Vectores Dispersos (Sparse Vectors) – Enfoque Nativo
- Los modelos como SPLADE generan representaciones vectoriales dispersas que capturan la importancia de términos específicos similar a TF-IDF
- Se configuran como vectores adicionales en las colecciones:
from qdrant_client import QdrantClient
from qdrant_client.http import models
client.create_collection(
collection_name="hybrid_collection",
vectors_config=models.VectorParams(
size=384, # Vector denso
distance=models.Distance.COSINE
),
sparse_vectors_config={
"text-sparse": models.SparseVectorParams() # Vector disperso
}
)
B. Integración con Motores Externos
- Puedes usar Elasticsearch, Meilisearch u otros para búsqueda léxica
- Luego fusionas los resultados con los de Qdrant
2. Enfoques para Combinar Resultados
Fusión (Fusion) – Método Recomendado
- Reciprocal Rank Fusion (RRF): Estándar del sector, soportado por Qdrant
- Combina listas de resultados basándose en sus rankings
# Búsqueda por lotes para vectores densos y dispersos
search_requests = [
models.SearchRequest(
vector=models.NamedVector(
name="text-dense",
vector=dense_query_vector
),
limit=10
),
models.SearchRequest(
vector=models.NamedSparseVector(
name="text-sparse",
vector=sparse_query_vector
),
limit=10
)
]
results = client.search_batch(
collection_name="hybrid_collection",
requests=search_requests
)
# Luego fusionas los resultados con RRF
Reordenamiento (Reranking) – Para Mayor Precisión
- Toma candidatos iniciales y los reordena con modelos más precisos
- Ejemplo: Cross-Encoders o ColBERT para análisis de contenido
3. ⚠️ Advertencia Crítica: NO uses Combinación Lineal
No hagas esto:
# ❌ MAL: Esto no funciona bien
final_score = 0.7 * vector_score + 0.3 * bm25_score
Por qué no funciona:
- Las distribuciones de relevancia de BM25 y similitud vectorial no son linealmente separables
- Los puntos relevantes y no relevantes no se pueden distinguir con una combinación lineal simple
- (RAG: Documento 1) «La evidencia visual muestra que los puntos relevantes y no relevantes no son linealmente separables en el espacio definido por las puntuaciones de BM25 y similitud de vectores»
4. Pipeline Completo Recomendado
# 1. Búsqueda inicial híbrida
dense_results = client.search(
collection_name="docs",
query_vector=dense_embedding,
limit=50
)
sparse_results = client.search(
collection_name="docs",
sparse_vector=sparse_embedding,
limit=50
)
# 2. Fusión con RRF
fused_results = reciprocal_rank_fusion(
[dense_results, sparse_results],
k=60 # Parámetro de suavizado
)
# 3. Reordenamiento opcional (si necesitas máxima precisión)
reranked = cross_encoder_rerank(
query=user_query,
candidates=fused_results[:20]
)
5. Configuración de Vectores Dispersos
# Configuración de colección híbrida
sparse_vectors_config:
text-sparse:
# Configuración específica para vectores dispersos
# Se almacenan eficientemente con compresión
6. Casos de Uso y Recomendaciones
Para colecciones pequeñas/medianas:
- Usa fusión RRF con vectores densos + dispersos
- Es simple y efectivo
Para colecciones grandes o máxima precisión:
- Implementa pipeline de dos etapas:
- Recuperación rápida con búsqueda híbrida
- Reordenamiento con Cross-Encoder
Para documentos técnicos/legales:
- Los vectores dispersos son especialmente útiles para términos específicos
- La búsqueda híbrida captura tanto significado como palabras clave exactas
7. Métricas a Monitorear
- Precision@K: Precisión en los primeros K resultados
- Recall@K: Capacidad de recuperar documentos relevantes
- MRR (Mean Reciprocal Rank): Calidad del ranking
- Tiempo de respuesta: Latencia del pipeline completo
Conclusión
Las búsquedas híbridas en Qdrant se implementan mejor mediante:
- Vectores dispersos para capturar aspectos léxicos tipo BM25
- Fusión RRF para combinar resultados de búsquedas densas y dispersas
- Reordenamiento opcional con modelos más complejos para casos críticos
Recuerda: La combinación lineal simple de puntuaciones es inefectiva. Prefiere métodos de fusión basados en ranking como RRF o pipelines de reordenamiento multietapa.





