Trabaja con embeddings de vectores mediante Cloud SQL para MySQL

En esta página, se detalla cómo puedes interactuar con Cloud SQL para compilar aplicaciones que usan embeddings de vectores.

Cloud SQL para MySQL admite el almacenamiento de embeddings de vectores. Luego, puedes crear índices de búsqueda de vectores y realizar búsquedas de similitud en estos embeddings de vectores junto con el resto de los datos que almacenas en Cloud SQL.

Almacenamiento de embeddings de vectores

Puedes usar Cloud SQL para MySQL para almacenar embeddings de vectores mediante la creación de una columna de embeddings de vectores en una tabla. La columna de embedding de vectores especial se asigna al tipo de datos VARBINARY. Al igual que otros datos relacionales en la tabla, puedes acceder a los embeddings de vectores en la tabla con garantías transaccionales existentes. Una tabla que tiene una columna de embedding de vectores es una tabla de InnoDB normal y, por lo tanto, cumple con las propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID). Las propiedades ACID solo se desvían de las búsquedas en el índice de búsqueda de vectores.

Puedes crear hasta una columna de embedding de vectores en una tabla y un índice de búsqueda de vectores por tabla. Cada embedding de vectores almacenada en la misma columna debe tener exactamente las mismas dimensiones que especificaste cuando definiste la columna. Un embedding de vectores tiene un límite superior de 16,000 dimensiones. Si tienes suficiente almacenamiento y memoria disponibles, puedes tener tablas separadas con diferentes columnas de embedding de vectores y diferentes índices de búsqueda de vectores en la misma instancia.

Si bien no existe un límite estricto para la cantidad de embeddings de vectores que puedes almacenar en una tabla, los índices de búsqueda de vectores requieren memoria. Por esta razón, te recomendamos que almacenes no más de 10 millones de embeddings de vectores en una tabla.

La replicación funciona de la misma manera para la columna de embedding de vectores que para otras columnas de MySQL InnoDB.

Cloud SQL admite la búsqueda de similitud mediante consultas de búsqueda de vecino más cercano (KNN) y vecino más cercano (ANN) Puedes usar ambos tipos de búsquedas de vectores en las instancias de Cloud SQL. Puedes crear un índice de búsqueda de vectores para las búsquedas de ANN.

Cloud SQL admite la consulta mediante la búsqueda de vectores de KNN, también conocida como búsqueda de vecino más cercano exacto. Realizar una búsqueda de vectores de KNN proporciona una recuperación perfecta. Puedes realizar búsquedas de KNN sin tener que crear un índice de búsqueda de vectores. La búsqueda de KNN se basa en la realización de un algoritmo de análisis de tabla.

Para la búsqueda de KNN, Cloud SQL también admite las siguientes funciones de búsqueda de distancia vectorial:

  • Coseno
  • Producto punto
  • Distancia de L2 al cuadrado

Para obtener más información sobre el uso de las funciones de distancia de búsqueda de vectores, consulta Consulta la distancia de un embedding de vectores.

Cloud SQL admite la creación y consulta de búsquedas ANN a través de la creación de índices de búsqueda de vectores. Un índice de búsqueda de vectores de ANN te permite optimizar un rendimiento rápido en lugar de una recuperación perfecta. Para la búsqueda ANN, Cloud SQL admite los siguientes tipos de índices:

  • BRUTE_FORCE: el tipo predeterminado de índice de búsqueda de vectores para una tabla base que tiene menos de 10,000 filas. Este tipo es más adecuado para búsquedas dentro de un subconjunto más pequeño de un conjunto de datos original. La memoria que usa el índice es igual al tamaño del conjunto de datos. Este tipo de índice no se conserva en el disco.
  • TREE_SQ: el tipo predeterminado de índice de búsqueda de vectores para una tabla base que tiene 10,000 filas o más. Este tipo usa la menor cantidad de memoria o alrededor del 25% del tamaño del conjunto de datos. Los índices TREE_SQ se conservan en el disco.
  • TREE_AH: es un tipo de índice de búsqueda de vectores que proporciona un algoritmo de tipo de búsqueda de hash asimétrico. Como se implementa en Cloud SQL, este tipo de índice no está optimizado para el alcance de memoria y no se conserva.

Actualiza los índices de búsqueda de vectores

Cloud SQL para MySQL actualiza los índices de búsqueda de vectores en tiempo real. Cualquier transacción que realice operaciones de lenguaje de manipulación de datos (DML) en la tabla base también propaga los cambios a los índices de búsqueda de vectores asociados. Los cambios en un índice de búsqueda de vectores son visibles de inmediato para todas las demás transacciones, lo que significa un nivel de aislamiento de READ_UNCOMMITTED.

Si reviertes una transacción, los cambios de reversión correspondientes también se producirán en el índice de búsqueda de vectores.

Replicación de índices de búsqueda de vectores

Cloud SQL para MySQL replica los índices de búsqueda de vectores en todas las réplicas de lectura. No se admiten los filtros de replicación ni la replicación de los índices de búsqueda de vectores en réplicas en cascada.

Configura una instancia para que admita embeddings de vectores

En esta sección, se describe cómo configurar tu instancia de Cloud SQL para admitir el almacenamiento, la indexación y las consultas de embeddings de vectores.

Las instancias de Cloud SQL Enterprise y Cloud SQL Enterprise Plus admiten embeddings de vectores.

Antes de comenzar

  • Tu instancia debe ejecutar la versión 8.0.36.R20240401.03_00 de MySQL de Cloud SQL para MySQL o una posterior.
  • Tu instancia debe tener suficiente espacio en el disco y memoria para asignar memoria a la cantidad total de embeddings de vectores en la instancia.

Activa la compatibilidad con embeddings de vectores

Para activar la compatibilidad con los embeddings de vectores, debes configurar las marcas de la base de datos de MySQL.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=FLAGS

Reemplaza INSTANCE_NAME por el nombre de la instancia en la que deseas habilitar la compatibilidad con el embedding de vectores.

En FLAGS, configura las siguientes marcas de MySQL en tu instancia:

  • cloudsql_vector: Configura esta marca en on para habilitar el almacenamiento de embeddings de vectores y la compatibilidad de búsqueda. Puedes crear nuevos índices de búsqueda de vectores y columnas de embedding de vectores en la instancia.
  • cloudsql_vector_max_mem_size: es opcional. Especifica la asignación de memoria máxima en bytes para todos los índices de búsqueda de vectores de la instancia. Si no especificas esta marca, la asignación de memoria predeterminada es de 1 GB, que es la asignación de memoria mínima. Si quieres obtener más información para calcular la cantidad que se debe especificar, consulta Configura la asignación de memoria para los índices de búsqueda de vectores.

    Esta memoria dedicada proviene de la memoria asignada a tu innodb_buffer_pool_size. Tu grupo de búferes disponible se reduce en la misma cantidad. El valor máximo permitido para esta marca es del 50% de tu innodb_buffer_pool_size total.

    Si especificas un valor superior al 50% de tu innodb_buffer_pool_size total, Cloud SQL reduce el valor efectivo al 50% del tamaño disponible y registra un mensaje de advertencia para la instancia.

Después de configurar las marcas, tu comando puede ser similar al siguiente:

gcloud sql instances patch my-instance \
  --database-flags=cloudsql_vector=on,cloudsql_vector_max_mem_size=4294967296

Las marcas para configurar la compatibilidad con embeddings de vectores en Cloud SQL para MySQL son marcas estáticas. Después de actualizar la instancia con las marcas, tu instancia se reinicia de forma automática para que se apliquen los cambios de configuración.

Si deseas obtener más información sobre cómo configurar marcas de base de datos para MySQL, consulta Configura marcas de base de datos.

Desactiva la compatibilidad con embeddings de vectores

Para desactivar la compatibilidad con los embeddings de vectores, configura la marca cloudsql_vector como off.

Por ejemplo:

gcloud sql instances patch INSTANCE_NAME \
  --database-flags=cloudsql_vector=off

Reemplaza INSTANCE_NAME por el nombre de la instancia en la que desactivas la compatibilidad con el embedding de vectores.

Configurar cloudsql_vector como off te impide crear nuevos índices de búsqueda de vectores y columnas de embeddings de vectores. Después de configurar esta marca estática, la instancia se reinicia de forma automática para que se aplique el cambio de configuración.

Después del reinicio de la instancia, Cloud SQL para MySQL hace lo siguiente:

  • Quita todos los índices de búsqueda de vectores TREE_SQ persistentes del disco persistente.
  • Conserva las entradas de la tabla del diccionario de datos para los índices de búsqueda de vectores que se compilaron. Sin embargo, Cloud SQL para MySQL no vuelve a compilar los índices y ninguna consulta de búsqueda de estos índices muestra un error.
  • Continúa almacenando los embeddings de vectores en las tablas base. Los embeddings de vectores permanecen accesibles.

Si luego vuelves a habilitar la marca cloudsql_vector para la instancia, Cloud SQL intenta volver a compilar los índices mientras la instancia se reinicia según las entradas de la tabla del diccionario de datos.

Configura la asignación de memoria para índices de búsqueda de vectores

Cloud SQL compila y mantiene índices de búsqueda de vectores en la memoria. El tipo de índice TREE_SQ persiste en un cierre ordenado y se vuelve a cargar después de que se reinicia la instancia. Durante el tiempo de ejecución, todos los índices de búsqueda de vectores deben permanecer en la memoria.

Para asegurarte de que Cloud SQL tenga suficiente memoria disponible para mantener todos los índices de búsqueda de vectores en la memoria, configura la instancia de Cloud SQL con una marca de base de datos cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size rige la cantidad de memoria que la instancia de Cloud SQL dedica a los índices de búsqueda de vectores Cuando configures el valor para la marca, ten en cuenta lo siguiente:

  • El valor predeterminado y mínimo es 1 GB. El límite superior es del 50% del tamaño del grupo de búferes.
  • Después de configurar esta marca, tu instancia se reinicia de forma automática para que se aplique el cambio de configuración.
  • Si tu instancia usó toda la memoria configurada, no puedes crear ni modificar ningún índice de búsqueda de vectores.

Para actualizar la memoria asignada a los índices de búsqueda de vectores en la instancia, cambia el valor de la marca cloudsql_vector_max_mem_size.

gcloud sql instances patch INSTANCE_NAME \
  --database-flags= cloudsql_vector_max_mem_size=NEW_MEMORY_VALUE

Reemplaza lo siguiente:

  • INSTANCE_NAME: el nombre de la instancia en la que cambias la asignación de memoria.
  • NEW_MEMORY_VALUE: la asignación de memoria actualizada, en bytes, para tus índices de búsqueda de vectores

Este cambio reinicia la instancia de forma automática para que se aplique.

Calcula la memoria requerida

La cantidad de memoria que requiere un índice depende del tipo de índice, la cantidad de embeddings de vectores y la dimensionalidad de los embeddings. Debes tener en cuenta dos requisitos de memoria:

  • Memoria de tiempo de compilación: la memoria requerida durante la compilación del índice
  • Memoria de índice: la memoria que ocupa el índice después de que se compila el índice

Para un índice determinado, su tamaño de conjunto de datos es la memoria necesaria para leer todos los embeddings de vectores en la memoria. Dado que cada dimensión está representada por un número de punto flotante que usa 4 bytes de memoria, puedes determinar el dataset_size de la siguiente manera:

dataset_size = <num_embeddings> * (4 * <dimensions>)

Por ejemplo, si tienes 1 millón de embeddings ede 768 dimensiones, tu dataset_size es 3 GB.

Según el ejemplo anterior, los requisitos de memoria para los diferentes tipos de índices son los siguientes:

Tipo de índice Memoria de tiempo de compilación Memoria de índice
TREE_SQ 4 GB 1 GB
TREE_AH 3.5 GB 3.5 GB
BRUTE_FORCE 3 GB 3 GB

Si usas los índices de búsqueda de vectores TREE_SQ, también debes tener en cuenta la memoria requerida para la persistencia en el entorno de ejecución. A la cantidad total de memoria en tu configuración, agrega la cantidad de memoria de índice que usa el índice de búsqueda de vectores TREE_SQ activo más grande.

Cada vez que la tabla base en la que se almacenan los embeddings de vectores se somete a operaciones DML, el índice de búsqueda de vectores se actualiza en tiempo real. Estas actualizaciones cambian el alcance de memoria del índice, que puede reducirse o expandirse según la operación DML. Puedes supervisar el alcance de memoria de un índice si consultas la tabla information_schema.innodb_vector_indexes. Para obtener información sobre cómo supervisar el tamaño del índice de búsqueda de vectores, consulta Supervisa los índices de búsqueda de vectores.

Configuración de réplica de lectura

Si la instancia cumple con los criterios de habilitación de marcas y versión de mantenimiento, Cloud SQL es compatible por completo con los embeddings de vectores en una réplica de lectura.

Si creas una réplica a partir de una instancia principal que tiene habilitada la compatibilidad con embeddings de vectores, la réplica de lectura hereda la configuración de compatibilidad con embedding de vectores de la instancia principal. Debes habilitar la compatibilidad con el embedding de vectores de forma individual en instancias de réplica de lectura existentes.

En términos del impacto en el retraso de replicación, la creación y el mantenimiento de los índices de búsqueda de vectores funciona de la misma manera que los índices de MySQL normales.

Los índices de búsqueda de vectores no son compatibles con las réplicas en cascada.

Ejemplo: una consulta y un índice de búsqueda de vectores de ANN simple

En la siguiente explicación de ejemplo, se proporcionan pasos para crear un índice de búsqueda de vectores basado en ANN y una consulta en Cloud SQL.

  1. Genera embeddings de vectores. Puedes crear embeddings de vectores de forma manual o usar una API de embedding de texto que elijas. Para ver un ejemplo que usa Vertex AI, consulta Genera embeddings de vectores según los datos de la fila.

  2. Crea una tabla en Cloud SQL para MySQL que contenga una columna de embedding de vectores con tres dimensiones.

    CREATE TABLE books (
    id   INTEGER PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(60),
    embedding VECTOR(3) USING VARBINARY
    );
    
  3. Inserta un embedding de vectores en la columna.

    INSERT INTO books VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
    );
    
  4. Confirma los cambios.

    commit;
    
  5. Crea el índice de la búsqueda del vector. Si creas un índice TREE_SQ o TREE_AH, tu tabla debe tener al menos 1,000 filas.

    CALL mysql.create_vector_index('vectorIndex',
                                   'dbname.books',
                                   'embedding',
                                   'index_type=BRUTE_FORCE, distance_measure=L2_SQUARED'
                                   );
    
  6. Obtén los vecinos más cercanos.

    SELECT title FROM books
    WHERE
    NEAREST(embedding) TO (string_to_vector('[1,2,3]'));
    

Genera embeddings de vectores según los datos de las filas

Puedes generar un embedding de vectores para los datos de una fila determinada mediante una API de embedding de texto, como OpenAI o Vertex AI. Puedes usar cualquier API de embedding de texto con embeddings de vectores de Cloud SQL. Sin embargo, debes usar la misma API de embedding de texto para la generación de vectores de string de consulta. No puedes combinar diferentes APIs para los datos de origen y la vectorización de consultas.

Por ejemplo, puedes generar un embedding de vectores desde Vertex AI:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("textembedding-gecko@001")
    embeddings = model.get_embeddings(["What is life?"])
    for embedding in embeddings:
        vector = embedding.values
        print(f"Length of Embedding Vector: {len(vector)}")
    return vector

if __name__ == "__main__":
    text_embedding()

Almacena embeddings de vectores

En esta sección, se proporcionan instrucciones de ejemplo para almacenar embeddings de vectores en Cloud SQL.

Crea una tabla nueva con una columna de embeddings de vectores

CREATE TABLE books (
  id INTEGER PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(60),
  embedding VECTOR(3) USING VARBINARY
  );

Agrega una columna de embeddings de vectores a una tabla existente

ALTER TABLE books
ADD COLUMN embedding
VECTOR(3) USING VARBINARY;

Inserta un embedding de vectores

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')
);

Inserta varios embeddings de vectores

INSERT INTO books (
  title,
  embedding
  ) VALUES (
    'book title',
    string_to_vector('[1,2,3]')),
     ('book title', string_to_vector('[4,5,6]')
);

Inserta y actualiza un embedding de vectores

INSERT INTO books (
  id,
  title,
  embedding
  ) VALUES (
    1,
    'book title',
     string_to_vector('[1,2,3]')
     )
ON DUPLICATE KEY UPDATE embedding = string_to_vector('[1,2,3]');

Actualiza un embedding de vectores

UPDATE books
SET embedding = string_to_vector('[1,2,3]')
WHERE id = 1;

Borra un embedding de vectores

DELETE FROM books
WHERE embedding = string_to_vector('[1,2,3]');

Trabaja con índices de búsqueda de vectores

De forma predeterminada, puedes realizar la búsqueda de vecino más cercano exacta, lo que proporciona una recuperación perfecta. También puedes agregar un índice para usar la búsqueda ANN, que intercambia cierta recuperación por velocidad. A diferencia de los índices típicos, después de agregar un índice aproximado, verás resultados diferentes para las consultas.

Recomendaciones

En esta sección, se proporcionan prácticas recomendadas para trabajar con índices de búsqueda de vectores. Cada carga de trabajo es diferente y es posible que debas ajustarla en consecuencia.

  • Antes de crear un índice de búsqueda de vectores, debes cargar datos en la tabla. Tu tabla base debe tener al menos 1,000 filas. Estos requisitos se aplican solo a los tipos de índice de búsqueda TREE_SQ y TREE_AH. Si tienes más datos disponibles, tendrás una mejor partición y un mejor entrenamiento del índice.
  • Supervisa el uso de memoria de los índices. Si la instancia se queda sin memoria, no puedes crear ni compilar ningún índice. En el caso de los índices existentes, después de alcanzar el umbral, Cloud SQL escribe advertencias en el registro de errores de MySQL de forma periódica. Puedes ver el uso de memoria en la tabla information_schema.innodb_vector_indexes.
  • Si la tabla base subyacente se sometió a cambios importantes en el DML, vuelve a compilar los índices de búsqueda de vectores Para obtener el tamaño inicial del índice en el momento de la compilación y el tamaño actual del índice, consulta la tabla information_schema.innodb_vector_indexes.
  • Por lo general, es aceptable dejar la cantidad de particiones que se procesarán de forma interna. Si tienes un caso de uso en el que deseas especificar la cantidad de particiones, debes tener al menos 100 datos por partición.

Tabla base de solo lectura durante las operaciones de índice de búsqueda de vectores

Durante las tres operaciones de índice de búsqueda de vectores (crear, modificar y descartar), la tabla base se coloca en un modo de solo lectura. Durante estas operaciones, no se permiten DML en la tabla base.

Persistencia, cierre e impacto en el mantenimiento

Solo los índices de búsqueda de vectores que usan el tipo TREE_SQ persisten en el disco cuando se cierra una instancia de forma correcta. Los índices de búsqueda de vectores que usan los tipos TREE_AH y BRUTE_FORCE solo están en la memoria.

Después de un cierre ordenado de una instancia, Cloud SQL vuelve a cargar los índices de búsqueda de vectores a medida que se reinicia la instancia. Sin embargo, después de una falla o un cierre poco claro, Cloud SQL debe volver a compilar los índices de búsqueda de vectores. Por ejemplo, cada vez que tu instancia experimenta una falla o recuperación de copia de seguridad y restablecimiento, recuperación de un momento determinado (PITR) o conmutación por error de alta disponibilidad (HA), Cloud SQL vuelve a compilar tus índices de búsqueda de vectores. En estos eventos, ocurre lo siguiente:

  • La recompilación se realiza en segundo plano de forma automática.
  • Durante la nueva compilación, la tabla base está en modo de solo lectura.
  • Si la recompilación automática no puede obtener un bloqueo en la tabla dentro de un período de tiempo de espera específico, la recompilación falla. Es posible que debas volver a compilar el índice de forma manual.

El tiempo necesario para que se vuelva a compilar un índice puede aumentar el tiempo requerido de apagado, lo que también puede aumentar el tiempo requerido de mantenimiento y actualización de una instancia.

Crea un índice de búsqueda de vectores

La instrucción para crear un índice de búsqueda de vectores usa la siguiente sintaxis:

CALL mysql.create_vector_index('INDEX_NAME',
                                'DB_NAME.TABLE_NAME',
                                'COLUMN_NAME',
                                'PARAMETERS'
                              );

Por ejemplo:

CALL mysql.create_vector_index('vectorIndex',
                                'db.books',
                                'embedding',
                                'index_type=TREE_SQ, distance_measure=l2_squared'
                               );

El nombre del índice que especifiques debe ser único dentro de la base de datos.

Parámetros del índice de búsqueda de vectores

Las funciones de creación de índice de búsqueda (y alterar índice de búsqueda) admiten varios parámetros que puedes especificar con pares clave-valor separados por comas. Todos los parámetros de función de creación de índices de búsqueda son opcionales. Si especificas una string vacía o NULL, los valores de los parámetros predeterminados se configuran para el índice.

  • distance_measure: los valores admitidos son L2_SQUARED, COSINE y DOT_PRODUCT. L2_SQUARED es la configuración predeterminada.
  • num_neighbors: es la cantidad de vecinos que se mostrarán de forma predeterminada durante las consultas ANN. También puedes anular este parámetro cuando realizas la búsqueda. El valor predeterminado es 10.
  • index_type: especifica el tipo de índice que se compilará. Los valores válidos son BRUTE_FORCE, TREE_SQ y TREE_AH.

    • BRUTE_FORCE es el valor predeterminado para una tabla que tiene menos de 10,000 filas.
    • TREE_SQ es el valor predeterminado para una tabla que tiene 10,000 filas o más.

    Para especificar el tipo de índice TREE_AH o TREE_SQ, el tamaño de la tabla base debe ser mayor a 1,000 filas.

  • num_parititions: especifica cuántos clústeres de K-means se deben compilar. Este parámetro solo está permitido si configuraste un index_type. Esta opción no se aplica a BRUTE_FORCE. Si especificas el tipo de índice TREE_SQ o TREE_AH, el tamaño de la tabla base debe ser mayor o igual que num_partitions * 100.

Altera un índice de búsqueda de vectores

CALL mysql.alter_vector_index('DB_NAME.INDEX_NAME', 'PARAMETERS');

La función alter_vector_index se usa de forma explícita para volver a compilar un índice de búsqueda de vectores. Para usar esta función, el índice ya debe existir. Te recomendamos volver a compilar un índice para los siguientes casos de uso:

  • Deseas volver a compilar el índice con diferentes opciones. Por ejemplo, es posible que desees usar un tipo de índice diferente o una medida de distancia diferente.
  • Deseas volver a compilar el índice porque la tabla base se sometió a cambios importantes en el DML. Por ejemplo, debes volver a entrenar el índice de búsqueda de vectores según los datos actuales en la tabla base.

Todos los parámetros que permiten volver a compilar el índice son idénticos a los que están disponibles para crear el índice y también son opcionales. Si especificas una string vacía o NULL cuando vuelves a compilar el índice, este se vuelve a compilar según los parámetros especificados en el momento de la creación del índice. Si no se proporcionan parámetros en el momento de la creación del índice, se usan los valores de parámetros predeterminados.

El índice de búsqueda de vectores existente está disponible durante la operación de modificación. Aún puedes realizar búsquedas en el índice.

Descarta un índice de búsqueda de vectores

No puedes realizar una operación DDL en una tabla que tenga un índice de búsqueda de vectores. Antes de realizar la operación de DDL en la tabla, debes descartar el índice de búsqueda de vectores.

CALL mysql.drop_vector_index('DB_NAME.INDEX_NAME');

Consulta embeddings de vectores

En esta sección, se proporcionan ejemplos de las diferentes formas en que puedes consultar los embeddings de vectores.

Visualiza los embeddings de vectores

SELECT vector_to_string(embedding) FROM books;

Obtén la búsqueda de vecino exacto en un embedding de vectores

SELECT id,cosine_distance(embedding,
   string_to_vector('[1,2,3]')) dist
FROM books
ORDER BY dist
LIMIT 10;

Obtén la búsqueda de vecino aproximado a un embedding de vectores

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'), 'num_neighbors=10');

Realizar una búsqueda de ANN admite dos parámetros. Ambos son opcionales.

  • num_partitions: especifica la cantidad de particiones que se sondearán para una búsqueda de vectores de ANN. Si no especificas la cantidad de particiones, la búsqueda usa un valor generado según el tamaño de la tabla, la cantidad de particiones en el índice de búsqueda de vectores y otros factores.
  • num_neighbors: especifica la cantidad de vecinos que se mostrarán. Este valor anula el valor establecido en el momento de la creación del índice de búsqueda de vectores.

Filtra embeddings de vectores

Usa columnas adicionales como predicados para ajustar el filtrado de los resultados de la consulta de embedding de vectores. Por ejemplo, si agregas una columna printyear, puedes agregar un valor de año específico como filtro a tu consulta.

SELECT title FROM books
WHERE
NEAREST(embedding) TO (string_to_vector('[1,2,3]'))
AND printyear > 1991;

Consulta la distancia de un embedding de vectores

En esta sección, se proporcionan ejemplos de funciones de distancia vectorial que están disponibles para la búsqueda de KNN.

Obtén la distancia de coseno

SELECT cosine_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Obtén la distancia del producto de punto

SELECT dot_product(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Obtén la distancia cuadrada de L2

SELECT l2_squared_distance(embedding, string_to_vector('[3,1,2]'))
AS distance FROM books WHERE id=10;

Obtén filas a una distancia determinada

SELECT * FROM books
WHERE l2_squared_distance(embedding, string_to_vector('[1,2,3]')) < 10;

Puedes combinarlo con ORDER BY y LIMIT

SELECT id, vector_to_string(embedding),
       l2_squared_distance(embedding, string_to_vector('[1,2,3]')) dist
FROM books ORDER BY dist LIMIT 10;

Supervisa los índices de búsqueda de vectores

Para obtener información en tiempo real sobre todos los índices de búsqueda de vectores en la instancia, usa la tabla information_schema.innodb_vector_indexes.

Para ver la tabla, ejecuta el siguiente comando:

SELECT * FROM information_schema.innodb_vector_indexes;

El resultado de muestra podría verse de la siguiente manera:

*************************** 1. row ***************************
       INDEX_NAME: test.t4_index
       TABLE_NAME: test.t4_bf
       INDEX_TYPE: BRUTE_FORCE
     DIST_MEASURE: SquaredL2Distance
           STATUS: Ready
            STATE: INDEX_READY_TO_USE
       PARTITIONS: 0
SEARCH_PARTITIONS: 0
     INITIAL_SIZE: 40000
     CURRENT_SIZE: 40000
          QUERIES: 0
        MUTATIONS: 0
     INDEX_MEMORY: 160000
   DATASET_MEMORY: 0

En la tabla information_schema.innodb_vector_indexes, puedes ver lo siguiente:

  • Las opciones que se pueden generar. En otras palabras, num_partitions o la cantidad de particiones que se sondearán para una consulta.
  • Las columnas STATE y STATUS te indican el estado actual del índice. Durante la fase de compilación, la columna de estado proporciona información sobre qué tan lejos se encuentra el índice de búsqueda de vectores en la fase de compilación.
  • La columna INITIAL_SIZE proporciona el tamaño de la tabla durante la creación del índice. Puedes comparar este tamaño con CURRENT_SIZE para tener una idea de cuánto cambió el índice desde su creación debido a los DML en la tabla base.
  • Las columnas QUERIES y MUTATIONS te proporcionan estadísticas en tiempo real sobre qué tan ocupado está el índice.
  • Las columnas INDEX_MEMORY y DATASET_MEMORY proporcionan información sobre el consumo de memoria del índice. INDEX_MEMORY

    Indica cuánta memoria consume el índice y DATASET_MEMORY indica cuánta memoria adicional se consume durante el tiempo de compilación.

Para obtener una lista de los índices de vector de búsqueda creados en la instancia, puedes ver la tabla del diccionario de datos mysql.vector_indexes.

Para ver la tabla, ejecuta el siguiente comando:

SELECT * FROM mysql.vector_indexes;

Resultado de muestra:

*************************** 1. row ***************************
   index_name: test.index1
   table_name: test.t1
  column_name: j
index_options: index_type=BRUTE_FORCE, distance_measure=L2_SQUARED
       status: ACTIVE
  create_time: 2024-04-08 22:46:21
  update_time: 2024-04-08 22:46:21
1 row in set (0.00 sec)

Limitaciones

  1. Solo puede haber una columna de embedding de vectores por tabla.
  2. Solo puede haber un índice de búsqueda de vectores por tabla.
  3. Un embedding de vectores puede tener hasta 16,000 dimensiones.
  4. No se admite la partición a nivel de tabla de InnoDB en tablas con columnas de embedding de vectores.
  5. Si la instancia se reinicia desde un cierre poco claro, Cloud SQL vuelve a compilar el índice de búsqueda de vectores de manera automática.
    1. Cuando se vuelve a compilar el índice de búsqueda de vectores, la tabla base es de solo lectura.
    2. Si Cloud SQL no puede adquirir un bloqueo en la tabla dentro del tiempo especificado, la recompilación automática del índice podría fallar.
    3. Si la recompilación automática del índice falla, debes volver a compilar el índice de forma manual.
  6. Para agregar una columna de embedding de vectores, la tabla debe tener una clave primaria. Cloud SQL no admite claves primarias del tipo BIT, BINARY, VARBINARY, JSON, BLOB, TEXT o tipos de datos espaciales. Las claves primarias compuestas no pueden incluir ninguno de estos tipos.
  7. Si hay un índice de búsqueda de vectores presente en una tabla, no se permiten operaciones DDL. El índice de búsqueda de vectores debe descartarse antes de realizar operaciones DDL en la tabla base.
  8. los embeddings de vectores no son compatibles con tablas que no son de InnoDB ni con tablas temporales.
  9. La columna de embedding de vectores no puede ser una columna generada.
  10. El predicado NEAREST..TO se puede combinar con otros predicados “escalares” mediante AND o OR. Los predicados escalares en la tabla se evalúan después de aplicar los predicados vectoriales.
  11. El predicado NEAREST..TO solo es compatible con una declaración SELECT. Otras declaraciones DML no son compatibles con NEAREST..TO.
  12. Las subconsultas no son compatibles con NEAREST..TO. No se puede agregar una restricción a la clave primaria de la tabla base si hay un índice de búsqueda de vectores.
  13. El filtrado previo solo es posible mediante funciones de distancia y mediante el uso de ORDER BY con LIMIT.

    Por ejemplo, si creas la siguiente tabla:

    CREATE TABLE books
    (
    bookid          INT PRIMARY KEY,
    title           VARCHAR(1000),
    author          VARCHAR(100),
    printyear       int,
    country         VARCHAR(100),
    bvector         VECTOR(1536) USING VARBINARY
    //bvector is embedding vector of book's plot,genre,reviews etc
    );
    

    Luego, puedes usar la siguiente consulta para lograr un filtrado previo.

    //select query to obtain books by specific author and having similar plot-genre-reviews
    SELECT bookid, title, author,l2_squared_distance(bvector, qvector) dist
    FROM books where author='cloudsql' ORDER BY dist LIMIT 10
    

    El filtrado posterior es compatible con NEAREST..TO y las funciones de distancia.

Solucionar problemas

En el caso de una falla, el índice se vuelve a compilar de forma automática. Cuando hay una recompilación en curso, hay dos restricciones:

  1. Durante la creación de índices, la tabla base está en modo de solo lectura.
  2. Mientras se vuelve a crear el índice, las consultas de ANN en los índices existentes fallan.

¿Qué sigue?