Bases De Datos Vectoriales
Por Nicolás Ildefonso Sirvent Orts
¿Qué es una base de datos vectorial?
Una base de datos vectorial es un sistema de almacenamiento diseñado para guardar y buscar información basándose en su significado profundo y no solo en palabras clave exactas. En lugar de tablas tradicionales, organiza los datos (como texto, imágenes o audio) como coordenadas matemáticas en un espacio de miles de dimensiones. Su utilidad principal reside en la búsqueda semántica: permite que las aplicaciones entiendan el contexto, conecten ideas similares y sirvan como una memoria externa ultra rápida para modelos de inteligencia artificial, siendo la pieza clave detrás de los buscadores inteligentes, sistemas de recomendación y asistentes como ChatGPT.
Para entender como es que funcionan estas bases de datos con esteroides primero tenemos que entender el valor con el que trabajan.
¿Qué es un embedding?
Un embedding es un vector (lista de numeros) que sirve para representar a un objeto, como una palabra o un texto, de forma que un modelo pueda entenderlo. Estos números no se eligen al azar, funcionan como una "firma numérica" o una dirección en un mapa gigante. Lo más importante de un embedding es que, si dos objetos se parecen en el mundo real, sus listas de números también serán numéricamente parecidas.
Bueno ya sabemos que un embedding es un vector númerico, pero, ¿que criterio se usa en su creación para que sean capaces de calificar?
La respuesta corta es, ninguno. Un embedding es el resultado de las neuronas de la última capa oculta de una red neuronal ya entrenada. Los modelos que emplean este tipo de bases de datos, se caraterizan por ser capaces de clusterizar (agrupar) datos teniendo en cuenta el contexto en el que se encuentran. No es lo mismo decir que: "estoy sentado en un banco" a "voy a robar un banco". Aunque cabe la posibilidad de que la segunda se refiera a un banco de un parque, en los entrenamientos no se suele dar este significado, por lo que los embeddings de estos sinonimos serán completamente diferentes.
Trade-off
Este vector nos ayuda mucho al representar las palabras de forma numérica. No obstante, depende completamente del clustering que haga el modelo, esto implica que este embedding será compatible únicamente con un modelo equivalente entrenado por el mismo dataset. Por lo que un embedding realmente es, una interpretación de información de un agente en concreto impulsada por un entrenamiento posterior.
Sabemos que és un embedding, pero que puedo hacer con una secuencia de números que a simple vista parecen puestos por un randomizer.
Similitud entre vectores
En una base de datos vectorial, la similitud entre dos objetos se define por la proximidad geométrica de sus embeddings. Debido a que la red neuronal asigna coordenadas basadas en la relación semántica, los conceptos con significados o características análogas generan vectores que se agrupan en regiones cercanas del espacio latente. Para cuantificar esta semejanza, se emplean diferentes métricas matemáticas que determinan qué tan cerca está un vector de otro:
Similitud del Coseno (\(\cos \theta\))
Esta métrica calcula el coseno del ángulo formado por dos vectores. A diferencia de otras medidas, no considera la longitud (magnitud) de los vectores, sino únicamente su dirección. - Uso principal: Procesamiento de Lenguaje Natural (NLP) y búsqueda semántica. - Conveniencia: Es ideal cuando el contenido es lo importante y no su extensión. Por ejemplo, permite que un artículo largo y un resumen corto sobre el mismo tema sean considerados similares. - Ecuación:$\(\text{sim}(\mathbf{A}, \mathbf{B}) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \|\mathbf{B}\|}\)$
Distancia Euclídea (\(L2\))
Mide la distancia física en línea recta entre dos puntos en el espacio multidimensional. Es la métrica más intuitiva, pero es muy sensible a la magnitud de los datos. - Uso principal: Visión artificial, biometría y detección de duplicados exactos. - Conveniencia: Es preferible cuando las diferencias exactas en los valores de las dimensiones son críticas, como en el reconocimiento facial, donde pequeños cambios en las coordenadas representan rasgos distintos. - Ecuación:$\(d(\mathbf{A}, \mathbf{B}) = \sqrt{\sum_{i=1}^{n} (a_i - b_i)^2}\)$
Producto Escalar (Dot Product)
Multiplica las magnitudes de dos vectores por el coseno del ángulo que los separa. A diferencia del coseno, esta métrica sí se ve afectada por la longitud de los vectores. - Uso principal: Sistemas de recomendación y algoritmos de ranking. - Conveniencia: Se utiliza cuando tanto la dirección del interés como la "intensidad" o relevancia del objeto son importantes. Por ejemplo, en una tienda online, puede priorizar productos que tienen más interacciones (magnitud alta). - Ecuación:$\(\mathbf{A} \cdot \mathbf{B} = \sum_{i=1}^{n} a_i b_i\)$
Enlace de Interés
https://projector.tensorflow.org/
Indexación: Algoritmo HNSW
Si tenemos 10 millones de vectores de 1536 dimensiones, compararlos uno por uno contra una consulta (búsqueda por fuerza bruta o Flat Search) requeriría un tiempo de procesamiento inasumible para aplicaciones en tiempo real. Necesitamos una estructura que permita encontrar los "vecinos más cercanos" sin tener que evaluarlos todos.
HNSW (Hierarchical Navigable Small Worlds) es un algoritmo basado en grafos jerárquicos. Su estrategia consiste en crear una red de caminos donde cualquier nodo puede alcanzar a otro en muy pocos pasos. Combina dos conceptos clave:
-
Small Worlds: Grafos donde la mayoría de los nodos no son vecinos, pero se puede llegar de uno a otro mediante un número pequeño de saltos.
-
Jerarquía: Una estructura de capas similar a una Skip List, donde las capas superiores son "vías rápidas" y las inferiores contienen el detalle total.
El Proceso de Inserción
Cuando un nuevo vector llega a la base de datos, el algoritmo debe decidir dónde colocarlo y con quién conectarlo: 1. Asignación de Capa: Mediante un cálculo probabilístico, se le asigna al vector una "capa máxima". La mayoría de los vectores se quedan en la Capa 0 (la base), y solo unos pocos llegan a las capas superiores. 2. Búsqueda de Vecinos: Empezando desde la capa más alta, el algoritmo busca el punto más cercano al nuevo vector. 3. Establecimiento de Vínculos (\(M\)): En cada capa donde el vector debe existir, se conecta con sus \(M\) vecinos más cercanos. 4. Heurística de Selección: El algoritmo no siempre elige a los más cercanos "puros", a veces prefiere vecinos que ayuden a "expandir" la red en diferentes direcciones para asegurar que el grafo sea navegable y no queden zonas aisladas.
Cuantización de Producto (PQ)
Un embedding estándar (por ejemplo, de 1536 dimensiones en formato float32) ocupa unos 6 KB. Aunque parece poco, una base de datos con 100 millones de vectores requeriría más de 600 GB de memoria RAM solo para almacenar los vectores, sin contar la estructura del grafo HNSW. La Cuantización de Producto (PQ) reduce este consumo drásticamente transformando vectores pesados en códigos compactos.
Proceso de Compresión
La técnica PQ descompone el problema de la compresión en tres pasos fundamentales: 1. Segmentación (Splitting): El vector original se divide en \(M\) trozos o sub-vectores iguales. Por ejemplo, un vector de 1024 dimensiones se puede dividir en 8 trozos de 128 dimensiones cada uno. 2. Cuantización por Sub-espacio: Para cada uno de los 8 trozos, el sistema ya ha entrenado previamente un "catálogo" (llamado Codebook) con 256 variantes típicas (centroides). 3. Asignación de IDs: Cada trozo del vector original se compara con los 256 candidatos de su catálogo correspondiente. En lugar de guardar los 128 números decimales del trozo, solo guardamos el ID (un solo byte, de 0 a 255) del candidato que más se le parece.
Resultado: El vector original de 1024 números decimales se convierte en una combinación de los identificadores.
Cálculo de Distancia
Una de las mayores ventajas de PQ es que permite calcular distancias sin necesidad de descomprimir los vectores a su estado original. Este proceso se conoce como ADC (Asymmetric Distance Computation):
- Pre-cálculo: Cuando el usuario realiza una consulta, el sistema compara el vector de búsqueda (que está completo, sin comprimir) contra los 256 candidatos de cada uno de los 8 catálogos.
- Tabla de Distancias: Se genera una pequeña tabla con estos resultados.
- Suma de IDs: Para saber la distancia entre la consulta y cualquier vector de la base de datos, el sistema solo tiene que mirar los 8 IDs del vector guardado, buscar sus valores en la tabla de pre-cálculo y sumarlos.
Este método es extremadamente rápido, ya que sustituye cálculos matemáticos complejos por simples consultas a una tabla y sumas de enteros.
Filtrado por metadatos: Búsqueda Híbrida
La búsqueda híbrida combina la similitud semántica (vectores) con filtros de atributos tradicionales (metadatos). El reto técnico es integrar estos filtros sin degradar la eficiencia del algoritmo HNSW. Estrategias de Filtrado: - Post-filtering: Se realiza la búsqueda vectorial y luego se descartan los resultados que no cumplen los metadatos. - Riesgo: Puede devolver menos resultados de los solicitados (\(K\)) si los vecinos más cercanos no cumplen el filtro. - Pre-filtering: Se filtran los datos primero y luego se busca entre los supervivientes. - Riesgo: Si el filtro es muy estricto, el grafo HNSW se fragmenta, obligando al sistema a realizar una búsqueda lineal lenta. - In-search Filtering: El filtro se aplica en tiempo real mientras el HNSW navega por el grafo. - Ventaja: Es la opción más eficiente; garantiza encontrar los \(K\) resultados exactos manteniendo la velocidad logarítmica del grafo.
Una vez entendidas las bases de datos vectoriales vemos la función más extendida de estas.
RAG: Retrieval-Augmented Generation
El RAG es una arquitectura que permite a un Modelo de Lenguaje (LLM), como GPT-4 o Claude, consultar una base de datos externa en tiempo real antes de responder. En lugar de confiar solo en lo que aprendió durante su entrenamiento, la IA consulta sus embeddings almacenados para la generación de promps con memoria.
Workflow
-
Recuperación (Retrieval): Cuando el usuario hace una pregunta, esta se convierte en un embedding. El sistema usa el HNSW (para navegar rápido) y el PQ (para ahorrar memoria) para encontrar los fragmentos de texto más parecidos en la base de datos.
-
Aumentación (Augmentation): Los fragmentos encontrados (párrafos de manuales, PDFs, chats) se extraen del disco y se pegan junto a la pregunta original del usuario.
-
Generación (Generation): El LLM recibe un "super-prompt" que dice: "Basándote exclusivamente en este contexto que te paso, responde a la pregunta", generando así prompts mejorados a la vez que consigue un mayor contexto en su base de datos.
Recomenendaciones bases de datos vectoriales
- Pinecone (Recomendada)
pip install pinecone-client
- ChromaDB (Recomendada)
pip install chromadb
- Weaviate
docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.36.6
- PostgreSQL (con extension pgvector)
sudo apt-get install postgresql-server-dev-all git clone https://github.com/pgvector/pgvector.git cd pgvector make sudo make install

