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:
    1. Recuperación rápida con búsqueda híbrida
    2. 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:

  1. Vectores dispersos para capturar aspectos léxicos tipo BM25
  2. Fusión RRF para combinar resultados de búsquedas densas y dispersas
  3. 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.

Deja una respuesta

Your email address will not be published. Required fields are marked *.

*
*

Entradas recientes