Cuando desarrollas aplicaciones de IA generativa, típicamente introduces tres componentes adicionales a tu infraestructura: un incrustador, un LLM y una base de datos vectorial.
Sin embargo, si estás utilizando MariaDB, no necesitas introducir una base de datos adicional junto con su propio dialecto SQL, o incluso peor, su propia API propietaria. Desde la versión 11.7 de MariaDB (y Servidor Empresarial de MariaDB 11.4) simplemente puedes almacenar tus incrustaciones (o vectores) en cualquier columna de cualquier tabla, sin necesidad de hacer que tus aplicaciones sean políglotas en bases de datos.
“Después de anunciar la vista previa de la búsqueda de vectores en el Servidor MariaDB, la capacidad de búsqueda de vectores ahora se ha agregado al lanzamiento de la Comunidad de Servidores MariaDB 11.7,” escribe Ralf Gebhardt, Gerente de Producto para el Servidor MariaDB en MariaDB. Esto incluye un nuevo tipo de dato (VECTOR
), índice de vector y un conjunto de funciones para la manipulación de vectores.
¿Por qué se necesitan los vectores en las aplicaciones de IA generativa?
Los vectores son necesarios en aplicaciones de inteligencia artificial generativa porque incrustan significados complejos en un conjunto compacto de números de longitud fija (un vector). Esto es más claro en el contexto de la generación aumentada por recuperación (o RAG). Esta técnica te permite obtener datos relevantes de tus fuentes (APIs, archivos, bases de datos) para mejorar la entrada de un modelo de IA con los datos obtenidos, a menudo privados para el negocio.
Dado que tus fuentes de datos pueden ser vastas, necesitas una forma de encontrar las piezas relevantes, dado que los modelos de IA actuales tienen una ventana de contexto finita, no puedes simplemente agregar todos tus datos a una solicitud. Al crear fragmentos de datos y ejecutar estos fragmentos de datos a través de un modelo de IA especial llamado incrustador, puedes generar vectores y utilizar técnicas de búsqueda de proximidad para encontrar información relevante que se añadirá a una solicitud.
Por ejemplo, toma la siguiente entrada de un usuario en un chatbot de recomendaciones:
I need a good case for my iPhone 15 pro.
Dado que tu modelo de IA no fue entrenado con los datos exactos que contienen la información del producto en tu tienda en línea, necesitas recuperar los productos más relevantes y su información antes de enviar la solicitud al modelo.
Para esto, envías la entrada original del usuario a un incrustador y obtienes un vector que luego puedes utilizar para obtener los 10 productos más cercanos a la entrada del usuario. Una vez que obtengas esta información (y veremos cómo hacerlo con MariaDB más adelante), puedes enviar la solicitud mejorada a tu modelo de IA:
I need a good case for my iPhone 15 pro. Which of the following products better suit my needs?
1. ProShield Ultra Case for iPhone 15 Pro - $29.99: A slim, shock-absorbing case with raised edges for screen protection and a sleek matte finish.
2. EcoGuard Bio-Friendly Case for iPhone 15 Pro - $24.99: Made from 100% recycled materials, offering moderate drop protection with an eco-conscious design.
3. ArmorFlex Max Case for iPhone 15 Pro - $39.99: Heavy-duty protection with military-grade durability, including a built-in kickstand for hands-free use.
4. CrystalClear Slim Case for iPhone 15 Pro - $19.99: Ultra-thin and transparent, showcasing the phone's design while providing basic scratch protection.
5. LeatherTouch Luxe Case for iPhone 15 Pro - $49.99: Premium genuine leather construction with a soft-touch feel and an integrated cardholder for convenience.
Esto resulta en predicciones de IA que utilizan tus propios datos.
Creación de tablas para almacenamiento de vectores
Para almacenar vectores en MariaDB, utiliza el nuevo tipo de datos VECTOR
. Por ejemplo:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
En este ejemplo, la columna embedding
puede contener un vector de 2048 dimensiones. Debes hacer coincidir el número de dimensiones que genere tu embedder.
Creación de Índices de Vectores
Para mejorar el rendimiento de lectura, es importante agregar un índice a tu columna de vector. Esto acelera las búsquedas de similitud. Puedes definir el índice al crear la tabla de la siguiente manera:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
Para tener un mayor control, puedes especificar la función de distancia que utilizará el servidor de la base de datos para construir el índice, así como el valor del algoritmo de M valor de los Mundos Pequeños Navegables Jerárquicamente (HNSW) utilizado por MariaDB. Por ejemplo:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
Consulta la documentación para obtener más información sobre estas configuraciones.
Inserción de Vectores
Cuando pasas datos (texto, imagen, audio) a través de un embedder, obtienes un vector. Normalmente, este es una serie de números en un array en formato JSON. Para insertar este vector en una tabla de MariaDB, puedes utilizar la función VEC_FromText
. Por ejemplo:
INSERT INTO products (name, embedding)
VALUES
("Alarm clock", VEC_FromText("[0.001, 0, ...]")),
("Cow figure", VEC_FromText("[1.0, 0.05, ...]")),
("Bicycle", VEC_FromText("[0.2, 0.156, ...]"));
Recuerda que los vectores insertados deben tener el número correcto de dimensiones definido en la declaración CREATE TABLE
.
Búsqueda de Similitud (Comparación de Vectores)
En las aplicaciones RAG, envías la entrada del usuario a un embebido para obtener un vector. Luego puedes consultar los registros en tu base de datos que están más cerca de ese vector. Vectores más cercanos representan datos que son semánticamente similares. En el momento de escribir esto, MariaDB tiene dos funciones de distancia que puedes usar para buscar similitudes o proximidad:
VEC_DISTANCE_EUCLIDEAN
: calcula la distancia en línea recta entre dos vectores. Es más adecuado para vectores derivados de datos crudos, no normalizados o escenarios donde la separación espacial se correlaciona directamente con la similitud, como comparar características posicionales o numéricas. Sin embargo, es menos efectivo para embebidos de alta dimensión o normalizados ya que es sensible a las diferencias en la magnitud del vector.VEC_DISTANCE_COSINE
: mide la diferencia angular entre vectores. Bueno para comparar embebidos normalizados, especialmente en aplicaciones semánticas como recuperación de texto o documentos. Sobresale en capturar similitud en significado o contexto.
Ten en cuenta que la búsqueda de similitud utilizando las funciones anteriores es solo aproximada y depende en gran medida de la calidad de los vectores calculados y, por lo tanto, de la calidad del embebido utilizado.
El siguiente ejemplo encuentra los 10 productos más similares a un vector dado ($user_input_vector
debe ser reemplazado con el vector real devuelto por el embebido sobre la entrada del usuario):
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
Las funciones VEC_DISTANCE_COSINE
y VEC_DISTANCE_EUCLIDEAN
toman dos vectores. En el ejemplo anterior, uno de los vectores es el vector calculado sobre la entrada del usuario, y el otro es el vector correspondiente para cada registro en la tabla productos
.
Un Ejemplo Práctico
He preparado un ejemplo práctico utilizando Java y sin marcos de IA para que realmente comprendas el proceso de creación de aplicaciones de IA generativa aprovechando las capacidades de búsqueda de vectores de MariaDB. Puedes encontrar el código en GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb