Valores vectoriales

Los vectores son representaciones matemáticas de datos de entrada estructurados y no estructurados que resultan vitales para las aplicaciones modernas de inteligencia artificial (IA) y las capacidades de búsqueda semántica. Db2 ahora puede importar datos vectoriales y convertirlos a un formato que pueda consultarse con sentencias SQL.

Nota: La compatibilidad con el tipo de datos VECTOR está disponible en Db2® 12.1.2 y posteriores.

¿Por qué son importantes los datos vectoriales?

Muchas aplicaciones de IA que emplean modelos de aprendizaje automático y técnicas de aprendizaje profundo generan vectores en forma de incrustaciones vectoriales de alta dimensión. Un vector de alta dimensión describe cantidades de objetos distintos. Estas aplicaciones utilizan técnicas de búsqueda de similitudes para identificar vectores con similitudes dentro de un conjunto de datos para su uso en un vector de referencia. La similitud suele medirse como una función de distancia entre dos vectores, como la distancia euclídea o la similitud coseno.

Muchas empresas están adoptando tecnologías de IA y GenAI y buscan una solución rentable, segura y simplificada para el almacenamiento de vectores. Para satisfacer estas necesidades, una aplicación debe disponer de capacidades eficientes de búsqueda de similitudes en un conjunto de incrustaciones vectoriales de alta dimensión. Normalmente, el número de dimensiones necesarias para estas aplicaciones oscila entre cientos y miles. El número de vectores almacenados en las bases de datos de estas aplicaciones suele ser muy grande, ya que los vectores se utilizan para representar pequeñas porciones de cada objeto. Estas aplicaciones necesitan ejecutar un gran número de consultas de búsqueda de similitudes para que una sola petición del usuario produzca una respuesta. El tiempo de respuesta previsto para este tipo de consultas oscila entre fracciones de segundo y milisegundos. Las incrustaciones vectoriales suelen mantener metadatos que pueden incluirse en las consultas de búsqueda de similitud.

¿Por qué elegir Db2 para almacenar y trabajar con datos vectoriales?

En el mercado existen bases de datos dedicadas al almacenamiento de vectores y a la búsqueda eficaz de similitudes. Sin embargo, estas soluciones tienen limitaciones:
  • Se basan en repositorios de datos externos. Al combinar vectores con la entrada original, los usuarios tienen que trabajar con múltiples repositorios de datos, lo que aumenta los costes, la latencia y la complejidad.
  • Tienen poca o ninguna capacidad para mejorar las consultas con otras capacidades de filtrado utilizando los metadatos asociados a las incrustaciones vectoriales.
  • Su capacidad en otros ámbitos de la gestión de datos es limitada.
Muchos clientes de Db2 ya tienen la entrada original a partir de la cual se crean los vectores directamente en sus bases de datos Db2, por lo que su solución de almacenamiento de vectores se simplifica enormemente.

Las capacidades de consulta de Db2 son incomparables, y la adición de la búsqueda de similitud vectorial mejora estas capacidades.

Db2 ha desarrollado durante muchos años una funcionalidad líder en el sector en áreas como la escalabilidad, la seguridad, la auditabilidad, el rendimiento y la supervisión. La mayoría de las soluciones específicas para vectores no pueden ofrecer eso.

Para ver ejemplos de aplicaciones prácticas del uso de Db2 para gestionar datos vectoriales, consulte Casos prácticos.

El tipo de datos VECTOR

El tipo de datos VECTOR admite actualmente los tipos de coordenadas INT8 y REAL/FLOAT32. El tipo de datos VECTOR es un tipo de longitud fija, donde el número de coordenadas siempre es igual a la dimensión. A diferencia de los tipos fijos CHAR y BINARY, no hay relleno, y todas las coordenadas deben proporcionarse a la función constructora. Un vector sólo es compatible con otro vector de la misma dimensión y tipo de coordenadas.
Sintaxis
VECTOR (<dimension> ,<coordinate-type>)
where
  • dimension es un literal entero que especifica la dimensión del vector. Para tablas organizadas por filas, el valor debe ser de 1 a 8168 para FLOAT32 y de 1 a 32672 para INT8 (SQLSTATE 42611). Para tablas organizadas por columnas, el valor debe ser de 1 a 8148 para FLOAT32 y de 1 a 32592 para INT8 (SQLSTATE 42611).
  • coordinate-type es un valor de coma flotante de 4 bytes de precisión simple REAL o FLOAT32, o un entero de 1 byte INT8.
Ejemplo
El siguiente ejemplo muestra la sintaxis del comando para crear una tabla, VTABLE, que contiene dos columnas de diferentes tipos de datos vectoriales:
CREATE TABLE VTABLE (RV VECTOR(100, REAL), -- Coordinates are single-precision (4-byte) floating point
                     IV VECTOR(300, INT8)) -- Coordinates are 1-byte integers
Este comando genera la siguiente tabla:
$ db2 describe table VTABLE

                                Data type                     Column
Column name                     schema    Data type name      Length     Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
RV                              SYSIBM    VECTOR(FLOAT32)            100     0 Yes
IV                              SYSIBM    VECTOR(INT8)               300     0 Yes

  1 record(s) selected.

Funciones vectoriales y sus usos

Existen varias funciones escalares específicas de vectores que puede utilizar para crear y gestionar vectores dentro de Db2:
  • VECTOR : Construye un vector a partir de una cadena de entrada.
  • VECTOR_SERIALIZE : Convierte un vector en una cadena.
  • VECTOR_DISTANCIA : Calcula la distancia entre dos vectores utilizando la métrica especificada.
  • VECTOR_NORM : Calcula la distancia entre un vector y el vector cero utilizando la métrica especificada.
  • VECTOR_DIMENSION_COUNT : Devuelve la dimensión de la definición del tipo vector, incluso si el valor es nulo.

Operaciones UPDATE e INSERT con vectores

La columna VECTOR almacena los vectores en formato binario. Db2 utiliza la forma de cadena del vector cuando interactúa con las aplicaciones.

Por ejemplo, la nueva función VECTOR convierte una representación de cadena de un vector en su forma binaria. El siguiente ejemplo muestra la sintaxis del comando para actualizar un valor de vector existente utilizando una variable de host y la forma de cadena de un vector:

C++
EXEC SQL BEGIN DECLARE SECTION;
  // Generated by db2dclgn
  sqlint32 id;

  struct
  {
    short length;
    char  data[50];
  } f32_3;
EXEC SQL END DECLARE SECTION;

id = 1;
sprintf(f32_3, "[0.123, -0.456, 0.789]");

EXEC SQL UPDATE VECTOR_TB SET F32_3 = VECTOR(:f32_3, 3, FLOAT32) WHERE ID = :id;

Operaciones de EXPORTACIÓN, IMPORTACIÓN y CARGA con vectores

Los comandos Db2 EXPORTAR, IMPORTAR y CARGAR admiten el tipo de datos VECTOR:
  • Los comandos EXPORTAR e IMPORTAR admiten el tipo de datos VECTOR en Db2 12.1.2 y posteriores. El comando LOAD soporta el tipo de datos VECTOR en Db2 12.1.3 y posteriores.
  • El comando EXPORTAR escribe los valores del vector como cadenas de caracteres. Los comandos IMPORTAR y CARGAR esperan que los valores de los datos vectoriales de entrada estén en forma de cadena.
  • El comando EXPORTAR da salida a formas de cadena de valores vectoriales sin espacios en blanco innecesarios.
  • Un tipo VECTOR INT8 de tamaño pequeño es aquel que tiene hasta 6534 dimensiones, mientras que un tipo VECTOR FLOAT32/REAL de tamaño pequeño tiene hasta 2041 dimensiones. Para estos tipos de VECTOR, la forma de cadena de un valor de vector que se genera mediante una operación de EXPORTACIÓN no supera los 32672 bytes.
  • Los comandos EXPORT, IMPORT y LOAD manejan estos tipos VECTOR pequeños de forma similar a como manejan el tipo VARCHAR.
  • Si un tipo VECTOR grande tiene más de 6534 dimensiones para vectores INT8, o más de 2041 dimensiones para vectores FLOAT32/REAL, entonces la forma de cadena de estos vectores, cuando es generada por una operación EXPORT, puede exceder los 32672 bytes de longitud.
  • Los comandos EXPORTAR, IMPORTAR y CARGAR manejan los tipos VECTOR grandes de forma similar a como manejan los datos de tipo CLOB, con escenarios de uso y restricciones similares a como los comandos EXPORTAR, IMPORTAR y CARGAR manejan los tipos CLOB reales.
Reglas para ejecutar comandos EXPORT con datos vectoriales
Existen opciones que pueden incluirse en una sentencia EXPORT cuando se trabaja con datos de objetos grandes (LOB):
  • LOB para
  • ARCHIVOLOB
  • MODIFIED BY LOBSINFILE
  • MODIFIED BY lobsinsepfiles
Si se especifica una opción LOB en una sentencia EXPORT, los valores de cadena vectorial de las columnas VECTOR grandes se escriben en archivos de datos LOB separados, y los Especificadores de Ubicación LOB (LLS ) se escriben en el archivo de datos de salida principal para apuntar a los valores de cadena vectorial. Si no se especifica la opción LOB, los valores de las cadenas vectoriales se escriben en el archivo de datos de salida principal, y se truncan hasta un máximo de 32700 bytes, si superan la longitud. No se emiten avisos para filas de datos específicas si un valor está truncado,.
Nota: El comando IMPORTAR no inserta filas de datos con cadenas vectoriales truncadas en columnas VECTOR ( SQL0420N ). Especifique una opción LOB en el comando EXPORT, a menos que tenga otras formas de evitar o mitigar el problema de las cadenas de vectores truncadas.
Reglas para ejecutar los comandos IMPORT y LOAD con datos vectoriales
  • Cuando se ejecuta una sentencia IMPORT o LOAD contra una tabla que tiene una columna VECTOR pequeña, los valores de la cadena vectorial deben residir en el archivo de datos de entrada principal, los valores no deben estar truncados y los valores no deben superar los 32672 bytes de tamaño.
  • Si la columna VECTOR es grande y no se especifica la opción LOB, los valores de la cadena vectorial deben residir en el archivo de datos de entrada principal. Algunos ejemplos de opciones LOB son LOBS FROM y MODIFIED BY LOBSINFILE. De nuevo, los valores de la cadena vectorial no deben estar truncados y no deben superar los 32700 bytes de tamaño.
  • Si la columna VECTOR es grande y se especifica una opción LOB, el archivo de datos de entrada principal debe contener LLS que apunten a los valores de la cadena vectorial en archivos de datos LOB separados. En este caso, el comando LOAD admite valores de cadena vectorial de hasta 1MB (1048576 bytes) de tamaño. El comando EXPORTAR no genera valores de cadenas vectoriales superiores a 1MB. Para el comando LOAD, los archivos de datos LOB separados deben ser accesibles desde el Db2 servidor, tanto cuando el comando LOAD se envía desde un cliente remoto como cuando el comando LOAD utiliza el parámetro CLIENT.
  • Cuando se ejecuta el comando LOAD desde un Db2 remoto, tanto el Db2 cliente como el Db2 servidor deben ser de la versión 12.1.3 o posterior.
    Nota: A veces los datos vectoriales de entrada no son generados por el comando EXPORTAR: Pueden ser construidos manualmente o por otras herramientas o aplicaciones. La importación de estos datos de cadenas vectoriales en tipos de columna VECTOR sigue las mismas reglas que la importación o carga de datos generados por el comando EXPORTAR.
Reglas aplicables a las operaciones de EXPORTACIÓN, IMPORTACIÓN y CARGA con datos vectoriales
  • Para garantizar que los valores vectoriales se insertan correctamente en columnas VECTOR grandes, tanto el comando EXPORT como el comando IMPORT o LOAD correspondiente deben utilizar una opción LOB o no utilizarla. No utilizar una opción LOB conlleva el riesgo de tener valores de cadena vectorial truncados.
  • Los comandos EXPORTAR, IMPORTAR y CARGAR tratan los valores de las cadenas vectoriales como cadenas y no como números. Los modificadores de tipo de archivo que se aplican a los valores numéricos no son aplicables a los valores vectoriales de cadena. Los modificadores de tipo de archivo afectados son los siguientes:
    • decplusblank.
    • decptx.
    • implieddecimalsólo para IMPORTAR y CARGAR.
    • striplzerossólo para EXPORTACIÓN.
  • No es posible exportar valores vectoriales de una columna VECTOR y, a continuación, importarlos a una columna VECTOR de otro tipo. Ejemplos de tipos diferentes son los vectores con diferentes dimensiones o diferentes tipos de coordenadas.
    Nota:

    Los comandos EXPORTAR e IMPORTAR son funciones del lado del cliente. Al ejecutar los comandos EXPORTAR e IMPORTAR desde un cliente Db2 remoto, el Db2 cliente y el Db2 servidor deben estar ejecutando Db2 12.1.2 o posterior, para garantizar que ambos soportan columnas de tipo de datos VECTOR.

    El comando LOAD tiene componentes tanto del lado del cliente como del lado del servidor. Al ejecutar el comando LOAD desde un cliente Db2 cliente, las instancias cliente y servidor de Db2 Db2 servidor deben estar ejecutando Db2 12.1.3 o posterior, para garantizar que ambos soportan columnas de tipo de datos VECTOR.

Limitaciones de los vectores

El tipo de datos VECTOR no se admite en los siguientes tipos de objetos y operaciones:
  • Tipos definidos por el usuario:
    • Diferenciado.
    • Matriz.
    • Tipo de fila.
    • Tipo estructurado.
  • Tipo de dato anclado.
  • Cree el apodo.
  • CREAR MAPEO DE TIPOS.

Además:

  • La replicación no admite una tabla con una columna VECTOR.
  • Los vectores no pueden compararse.
  • LOAD y INGEST no admiten vectores.
  • db2dart no admite el volcado de columnas VECTOR con la opción /DDEL.
  • Las operaciones de copia de seguridad y restauración lógicas no admiten el tipo VECTOR .
  • ALTOBJ no admite tablas con una columna VECTOR .
  • No se puede modificar una columna existente para convertirla en un VECTOR.
  • Una columna VECTOR existente no puede modificarse a un tipo de datos diferente, ni a un tipo de coordenada diferente.
  • Una dimensión de columna VECTOR existente no puede modificarse.
  • El único valor DEFAULT permitido es NULL, por lo que no se puede añadir una columna vectorial NOT NULL a una tabla existente.
  • No se admite una expresión VECTOR en la lista de selección de una tabla de consulta materializada REFRESCAR INMEDIATA.
  • Dado que no existe el concepto de mayor-que o menor-que cuando se trabaja con vectores, una columna VECTOR, o una expresión con un tipo de dato resultado VECTOR, no puede utilizarse de las siguientes maneras:
    • Como clave primaria.
    • Como clave externa.
    • Como clave única.
    • Como clave CREATE INDEX.
    • Como clave de ordenación ORDER BY.
    • Como clave de distribución DPF.
    • Como clave de partición de rango.
    • Como una llave MDC.
    • Como clave del ECA.
    • Como expresión GROUP BY.
    • En una condición de unión distinta de IS (NOT) NULL.
    • Como expresión SELECT DISTINCT.
    • Como expresión COUNT DISTINCT.
    • En un operador de conjunto distinto de UNION ALL.

Casos de uso

Caso práctico 1: Buscar registros de pacientes similares en una tabla Db2
Puede utilizar las capacidades de soporte vectorial propuestas en Db2 para implementar una búsqueda de similitud vectorial sobre registros relacionales.
Considere una tabla de base de datos dentro de Db2 que almacena registros de pacientes. Cada fila de la tabla representa a un paciente e incluye diversos atributos e información sobre él, como su talla, marcadores de salud, afecciones médicas y sexo.
Recientemente, un paciente de la mesa informó de que había sufrido un infarto. El médico quiere identificar a otros pacientes que presenten características similares a las de este paciente. Esta información es importante porque permite al médico identificar a los pacientes que necesitan más pruebas médicas, como un angiograma. Sin embargo, es crucial tener en cuenta que el médico no quiere enviar a todos los pacientes a hacerse estas pruebas. Esto se debe a que estas pruebas pueden ser caras y quizá no sean necesarias para todos los pacientes.
Para apoyar este caso de uso, la secretaria del hospital necesita encontrar otros pacientes que sean los más parecidos al paciente del ejemplo, denominado paciente de consulta.
Figura 1. Utilización de un vector en una sentencia SQL
Los científicos de datos del hospital utilizan consultas SQL para recuperar registros de pacientes de una tabla Db2 e introducirlos en un programa Python. Utilizan el lenguaje SQL y sus propias vistas, así como las herramientas compatibles de Db2 para Python como IBM DB y Db2 Magic commands extension para Jupyter Notebook. Estas herramientas les permiten llevar todos los historiales de los pacientes a su cuaderno Python.
Para cada registro, los científicos de datos generan una frase concatenando los valores de cada columna junto con el nombre de la misma. Estas frases representan los historiales de los pacientes, que luego se envían a un modelo lingüístico como RoBerta para generar una incrustación vectorial de cada frase. Al final de este proceso, un único vector representa las características de cada paciente. Los científicos de datos modifican la tabla de pacientes añadiendo una columna VECTOR para almacenar estos vectores.
Utilizando sentencias UPDATE, almacenan los vectores en la columna VECTOR de la tabla de pacientes. Una vez almacenados los vectores en Db2, la secretaria del hospital escribe consultas SQL utilizando la función VECTOR_DISTANCE para encontrar los cinco pacientes más similares al paciente de la consulta.
Caso práctico 2: Almacenamiento de vectores para aplicaciones de IA generativa / GAR
Los grandes modelos lingüísticos (LLM) se han hecho cada vez más populares en los últimos años, pero tienen una limitación. Sólo pueden funcionar bien con los datos con los que han sido entrenados. Cuando se enfrentan a preguntas nuevas, suelen dar respuestas incorrectas o inventarse cosas. Para solucionarlo, se utiliza un método llamado generación aumentada de recuperación (RAG) para mejorar las respuestas LLM. El GAR utiliza un repositorio privado de conocimientos en el que se incluye una lista de documentos relevantes del repositorio en el aviso al LLM. A continuación, el LLM intenta generar una respuesta basada en estos documentos. La aplicación del GAR requiere bases de datos seguras para almacenar las incrustaciones vectoriales y un depósito seguro para el contenido confidencial de los conocimientos. Estos contenidos pueden proceder de PDF, documentos de Word o páginas wiki. Los conocimientos se convierten en incrustaciones vectoriales y se almacenan de forma segura en el repositorio.
Db2 permite almacenar contenido no estructurado en diferentes tipos de columnas como blob, clob y JSON. Los usuarios pueden almacenar sus activos de conocimiento privados en Db2. Cada activo de conocimiento puede tener incrustaciones vectoriales generadas para sus diferentes secciones, que se almacenan en Db2 utilizando columnas VECTOR. Un LLM preentrenado o personalizado, como llama 3, genera estas incrustaciones.
Para iniciar una búsqueda, el usuario envía una pregunta a la aplicación. La aplicación vectoriza la solicitud utilizando el mismo LLM que se utiliza para vectorizar los activos de conocimiento. Tras vectorizar la petición utilizando el mismo LLM, la aplicación genera un vector de consulta, que se utiliza para una búsqueda de similitud vectorial en Db2. Este método de búsqueda recupera una lista de los documentos más coincidentes, que se añaden a la consulta original. También se incluye una instrucción para que el LLM responda a la consulta del usuario basándose en la lista aumentada de documentos.
Figura 2. Ejecución de una búsqueda de similitud vectorial con Db2
He aquí un ejemplo de implementación de una aplicación RAG mediante el uso de Db2 vector support: Una empresa de desarrollo de software quiere implementar la búsqueda en lenguaje natural para sus artículos de desarrollo. Antes, los desarrolladores tenían que recurrir a búsquedas basadas en palabras clave, que tenían sus limitaciones. Fue todo un reto encontrar las palabras clave adecuadas, sobre todo para los principiantes. Los resultados de las búsquedas solían ser largas listas de documentos que los desarrolladores tenían que cribar, lo que consumía mucho tiempo y contenía información irrelevante. Para resolver estos problemas, el equipo de ciencia de datos de la empresa ha ideado un plan para utilizar tecnología de IA que permita a los usuarios hacer preguntas en lenguaje natural. Han almacenado el contenido como representaciones vectoriales en su base de datos Db2, con los artículos originales guardados como archivos de texto.
Cuando un desarrollador formula una pregunta, la aplicación la convierte en un vector utilizando el mismo método empleado para los activos de conocimiento de la empresa. A continuación, la aplicación busca los vectores en la base de datos Db2 y recupera los documentos más relevantes. Combina el texto original de estos documentos con la pregunta y lo envía al modelo de IA, ordenándole que responda a la pregunta del desarrollador utilizando únicamente estos documentos. El modelo lingüístico intenta dar una respuesta basada en los conocimientos privados de la empresa almacenados en Db2.