Veni AI
Tecnologías de Bases de Datos

Bases de Datos Vectoriales y Sistemas de Búsqueda por Embeddings

Una guía completa sobre la arquitectura técnica de las bases de datos vectoriales, algoritmos de búsqueda por embeddings, HNSW, indexación IVF y aplicaciones empresariales de búsqueda semántica.

Veni AI Technical Team12 Ocak 20256 dk okuma
Bases de Datos Vectoriales y Sistemas de Búsqueda por Embeddings

Bases de Datos Vectoriales y Sistemas de Búsqueda por Embeddings

Las bases de datos vectoriales son bases de datos especializadas y optimizadas para almacenar y realizar búsquedas de similitud en vectores de alta dimensionalidad. Son el componente fundamental de las aplicaciones modernas de IA, particularmente los sistemas RAG (Retrieval-Augmented Generation).

¿Qué es una Base de Datos Vectorial?

Mientras que las bases de datos tradicionales están optimizadas para consultas de coincidencia exacta, las bases de datos vectoriales se enfocan en búsquedas de Approximate Nearest Neighbor (ANN).

Conceptos Fundamentales

Embedding: Una representación numérica en forma de vector de datos (texto, imagen, audio).

"Artificial intelligence" → [0.12, -0.45, 0.89, ..., 0.34] (e.g., 1536 dimensions)

Búsqueda de Similitud: Encontrar los vectores más cercanos a un vector de consulta.

query_vector → Top-K most similar vectors

Métricas de Distancia:

  • Similitud del Coseno: Similitud direccional.
  • Distancia Euclidiana (L2): Distancia geométrica.
  • Producto Punto: Producto interno de vectores.

Métricas de Similitud: Análisis Detallado

Similitud del Coseno

cos(A, B) = (A · B) / (||A|| × ||B||)

Rango de Valores: [-1, 1]

  • 1: Misma dirección (idénticos).
  • 0: Ortogonales (no relacionados).
  • -1: Direcciones opuestas.

Caso de Uso: Similitud de texto, búsqueda semántica.

Distancia Euclidiana (L2)

d(A, B) = √(Σ(Aᵢ - Bᵢ)²)

Rango de Valores: [0, ∞) Caso de Uso: Similitud de imágenes, clustering.

Producto Punto

A · B = Σ(Aᵢ × Bᵢ)

Caso de Uso: Equivalente al coseno para embeddings normalizados.

Algoritmos de Indexación

1. Brute Force (Flat Index)

Comparar la consulta contra cada vector en la base de datos.

Complejidad: O(n × d)

  • n: Número de vectores.
  • d: Dimensión.

Ventaja: 100% de precisión. Desventaja: Muy lento para grandes conjuntos de datos.

2. IVF (Inverted File Index)

Reduce el espacio de búsqueda dividiendo los vectores en clusters.

Algoritmo:

  1. Crear centroides usando K-means.
  2. Asignar cada vector a su centroide más cercano.
  3. Durante la búsqueda, mirar solo dentro de los nprobe clusters más cercanos.
1Parameters: 2- nlist: Number of clusters (typically √n) 3- nprobe: Number of clusters to search 4 5Trade-off: Higher nprobe → higher accuracy, lower speed.

3. HNSW (Hierarchical Navigable Small World)

Un enfoque basado en grafos y el método más popular hoy en día.

Estructura:

1Layer 2: o-------o-------o (sparse) 2 | | | 3Layer 1: o-o-o---o-o-o---o-o-o (medium) 4 | | | | | | | | | 5Layer 0: o-o-o-o-o-o-o-o-o-o-o-o (dense)

Parámetros:

  • M: Número máximo de conexiones por nodo.
  • ef_construction: Número de candidatos durante la construcción del índice.
  • ef_search: Número de candidatos durante la consulta.

Ventajas:

  • Búsqueda extremadamente rápida: O(log n).
  • Altas tasas de recall.
  • Soporta inserción/eliminación dinámica.

4. Product Quantization (PQ)

Reduce el uso de memoria comprimiendo vectores.

Método:

  1. Dividir el vector en M sub-vectores.
  2. Mapear cada sub-vector a uno de K centroides.
  3. Almacenar los IDs de los centroides en lugar de los componentes originales.
1Original: 1536 dim × 4 bytes = 6KB 2PQ (M=96, K=256): 96 × 1 byte = 96 bytes 3Compression: ~64x

5. Scalar Quantization (SQ)

Convertir representaciones Float32 a Int8.

1Original: 1536 × 4 bytes = 6KB 2SQ8: 1536 × 1 byte = 1.5KB 3Compression: 4x 4## Comparación de Bases de Datos Vectoriales Populares 5 6### Pinecone 7 8**Características:** 9- Servicio en la nube totalmente gestionado. 10- Escalado automático. 11- Filtrado por metadatos. 12- Aislamiento por namespace. 13 14**Uso:** 15```python 16import pinecone 17 18pinecone.init(api_key="xxx", environment="us-west1-gcp") 19index = pinecone.Index("my-index") 20 21# Upsert 22index.upsert(vectors=[ 23 {"id": "vec1", "values": [0.1, 0.2, ...], "metadata": {"category": "tech"}} 24]) 25 26# Query 27results = index.query(vector=[0.1, 0.2, ...], top_k=10, filter={"category": "tech"})

Weaviate

Características:

  • Open source.
  • Vectorización integrada.
  • Soporte para API GraphQL.
  • Búsqueda híbrida (vector + palabra clave).

Qdrant

Características:

  • Escrito en Rust para alto rendimiento.
  • Opciones de filtrado avanzadas.
  • Indexación de payload.
  • Soporte para despliegues distribuidos.

Milvus

Características:

  • Aceleración por GPU.
  • Búsqueda multivector.
  • Time travel (versionado).
  • Arquitectura nativa para Kubernetes.

ChromaDB

Características:

  • Fácil de usar para desarrolladores.
  • Modos en memoria + persistente.
  • Enfoque Python-first.
  • Ideal para prototipado.

Tabla de Comparación

CaracterísticaPineconeWeaviateQdrantMilvus
HostingCloudAmbosAmbosAmbos
EscalabilidadAutoManualManualAuto
Búsqueda Híbrida
Soporte GPU--
PrecioPor vectorGratis/PagoGratis/PagoGratis/Pago

Filtrado y Metadatos

Pre-filtrado vs Post-filtrado

Pre-filtrado:

  1. Aplicar primero el filtro por metadatos.
  2. Realizar la búsqueda vectorial dentro del conjunto filtrado.
  • Ventaja: Más rápido.
  • Desventaja: Posible pérdida de recall.

Post-filtrado:

  1. Encontrar resultados Top-K × multiplicador mediante búsqueda vectorial.
  2. Aplicar el filtro por metadatos a estos resultados.
  3. Devolver los K finales.
  • Ventaja: Mejor recall.
  • Desventaja: Rendimiento más lento.

Búsqueda Híbrida

Combinando búsqueda por palabra clave (BM25) + vector:

final_score = α × vector_score + (1-α) × keyword_score

Optimización de Rendimiento

Parámetros de Índice

Configuración óptima de HNSW:

1High Recall: M=32, ef=200 2High Speed: M=16, ef=50 3Balanced: M=24, ef=100

Procesamiento por Lotes

1# Poor: Singular insert 2for vec in vectors: 3 index.upsert([vec]) 4 5# Good: Batch insert 6index.upsert(vectors, batch_size=100)

Pooling de Conexiones

1from pinecone import Pinecone 2 3pc = Pinecone( 4 api_key="xxx", 5 pool_threads=30 # Parallel connections 6)

Ejemplo de Arquitectura Empresarial

1┌─────────────────────────────────────────────────────┐ 2│ Application │ 3└──────────────────────┬──────────────────────────────┘ 45┌──────────────────────▼──────────────────────────────┐ 6│ Vector Search Service │ 7│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ 8│ │ Query │ │ Reranker │ │ Cache │ │ 9│ │ Engine │ │ Service │ │ (Redis) │ │ 10│ └─────────────┘ └─────────────┘ └─────────────┘ │ 11└──────────────────────┬──────────────────────────────┘ 1213┌──────────────────────▼──────────────────────────────┐ 14│ Vector Database Cluster │ 15│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ 16│ │ Shard 1 │ │ Shard 2 │ │ Shard 3 │ │ 17│ └─────────┘ └─────────┘ └─────────┘ │ 18└─────────────────────────────────────────────────────┘

Monitoreo y Observabilidad

Métricas Clave

  • Latencia de Query (p50, p95, p99)
  • Tasa de Recall
  • QPS (Queries Per Second)
  • Tamaño del Índice
  • Uso de Memoria

Umbrales de Alertas

1alerts: 2 - name: high_latency 3 condition: p99_latency > 200ms 4 severity: warning 5 6 - name: low_recall 7 condition: recall < 0.9 8 severity: critical 9## Conclusión 10 11Las bases de datos vectoriales son componentes indispensables de las aplicaciones modernas de IA. Con la elección adecuada de la base de datos, la estrategia de indexación y las optimizaciones, puedes construir sistemas de búsqueda semántica de alto rendimiento. 12 13En Veni AI, ofrecemos soluciones empresariales de búsqueda vectorial. Contáctanos para tus requisitos.

İlgili Makaleler