Bases de datos vectoriales: buscar por parecido a escala
Comparar un vector con un millón de vectores uno a uno es lento. Los índices vectoriales aproximan la búsqueda del vecino más cercano para que tarde milisegundos, a cambio de perder un poco de exactitud.
- #vectores
- #rag
- #infraestructura
El problema de escala
Si tienes mil embeddings, encontrar los más parecidos a una consulta es trivial: calculas mil similitudes coseno y ordenas. Con diez millones, ya no: diez millones de productos escalares por consulta, y cada vector tiene cientos o miles de dimensiones.
Una base de datos vectorial resuelve exactamente eso: responder "los k más cercanos" sin mirar todos los vectores.
La idea: búsqueda aproximada
No existe atajo exacto para el vecino más cercano en alta dimensión. Lo que existe son índices que aproximan la respuesta: devuelven casi siempre los mismos vecinos que la búsqueda exhaustiva, en una fracción del tiempo. Se llama ANN (Approximate Nearest Neighbor), y el intercambio es explícito:
más velocidad ⇄ algo menos de exactitud (recall)
Un recall del 95 % significa que, de los 10 vecinos verdaderos, el índice encontró 9 o 10. Para RAG es más que suficiente; para deduplicación exacta, puede que no.
Dos familias de índices
| Índice | Cómo funciona | Cuándo |
|---|---|---|
| HNSW | Un grafo de capas: arriba, pocos nodos y saltos largos; abajo, todos los nodos y saltos cortos. La búsqueda desciende afinando. | El estándar hoy. Rápido, buen recall, más memoria. |
| IVF | Agrupa los vectores en celdas (clusters). Solo se buscan las celdas más cercanas a la consulta. | Colecciones enormes donde la memoria manda. |
Ambos tienen perillas (cuántos vecinos por nodo, cuántas celdas visitar) que mueven el punto en la balanza velocidad/recall. No hay valores universales: se miden con tus datos.
Lo que de verdad importa al elegir
- Filtrado por metadatos. "Los 5 más parecidos entre los documentos del cliente X". Filtrar antes de buscar reduce el recall; filtrar después puede dejarte sin resultados. Cómo lo resuelve cada motor es la diferencia práctica más grande.
- Actualizaciones. Algunos índices se degradan al insertar y borrar mucho; otros se reconstruyen por lotes.
- ¿Necesitas una base nueva? Postgres con
pgvector, SQLite con extensiones o incluso un archivo en memoria cubren hasta cientos de miles de vectores. Una base dedicada se justifica por volumen o por operaciones, no por moda.
Un cálculo honesto
Vectores: 100 000
Dimensión: 1 536 (float32 → 6 KB por vector)
Memoria: ~600 MB de vectores + índice
Cien mil documentos caben en la RAM de un portátil. Muchos proyectos que "necesitan una base vectorial" están muy por debajo de eso.
Para llevarte
Una base vectorial es un índice de vecinos aproximados con filtros. Elige por cómo filtra y cómo actualiza, no por el benchmark de velocidad. Y antes de desplegar una, mide si tu tamaño la necesita: el grafo de este hub se calcula entero en el build, sin ninguna.