Trabajar con incrustaciones de vectores (vista previa)

En esta página se explica cómo puedes interactuar con Cloud SQL para crear aplicaciones que usen inserciones vectoriales.

Cloud SQL para MySQL admite el almacenamiento de inserciones vectoriales. Después, 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 almacenes en Cloud SQL.

Almacenamiento de incrustaciones de vectores

Puedes usar Cloud SQL para MySQL para almacenar inserciones de vectores creando una columna de inserción de vectores en una tabla. La columna de inserción de vector especial se asigna al tipo de datos VARBINARY. Al igual que otros datos relacionales de la tabla, puedes acceder a las incrustaciones de vectores de la tabla con las garantías de transacción que ya tienes. Una tabla que tiene una columna de inserción de vector es una tabla InnoDB normal y, por lo tanto, cumple las propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID). Las propiedades ACID solo se desvían en las búsquedas de índices de búsqueda vectorial.

Ten en cuenta lo siguiente al configurar una tabla para las inserciones vectoriales:

  • Puede crear un máximo de una columna de inserción de vector en una tabla y un índice de búsqueda de vector por tabla. Cada inserción de vector almacenada en la misma columna debe tener exactamente las mismas dimensiones que especificó al definir la columna. Una inserción vectorial tiene un límite máximo de 16.000 dimensiones. Si tienes suficiente almacenamiento y memoria disponibles, puedes tener tablas independientes con diferentes columnas de inserción de vectores e índices de búsqueda de vectores en la misma instancia.

  • Aunque no hay un límite estricto en cuanto al número de incrustaciones de vectores que puedes almacenar en una tabla, los índices de búsqueda de vectores requieren memoria. Por este motivo, le recomendamos que no almacene más de 10 millones de inserciones de vectores en una tabla.

  • Consulta también la lista de limitaciones.

La replicación funciona de la misma forma en la columna de incrustación de vectores que en otras columnas de InnoDB de MySQL.

Cloud SQL admite la búsqueda de similitud mediante consultas de vecinos más cercanos (KNN) y de vecinos más cercanos aproximados (ANN). Puedes usar ambos tipos de búsquedas de vectores en tus instancias de Cloud SQL. Solo puedes crear un índice de búsqueda vectorial para búsquedas de ANN.

Cloud SQL admite consultas mediante la búsqueda vectorial KNN, también denominada búsqueda de vecinos más cercanos exactos. Al realizar una búsqueda de vectores KNN, se obtiene una recuperación perfecta. Puedes realizar búsquedas de vecinos más cercanos sin tener que crear un índice de búsqueda de vectores. La búsqueda de vecinos más cercanos se basa en la ejecución de un algoritmo de análisis de tabla.

En el caso de la búsqueda de k-NN, Cloud SQL también admite las siguientes funciones de búsqueda de distancia de vectores:

  • Coseno
  • Producto escalar
  • Distancia al cuadrado L2

Para obtener más información sobre cómo usar las funciones de distancia de búsqueda vectorial, consulta Consultar la distancia de una incrustación vectorial.

Cloud SQL permite crear y consultar búsquedas de ANN mediante la creación de índices de búsqueda de vectores. Un índice de búsqueda vectorial de ANN te permite optimizar el rendimiento en lugar de la recuperación perfecta. En el caso de la búsqueda de ANN, Cloud SQL admite los siguientes tipos de índice:

  • BRUTE_FORCE: el tipo de índice de búsqueda vectorial predeterminado de una tabla base que tiene menos de 10.000 filas. Este tipo es el más adecuado para búsquedas en un subconjunto más pequeño de un conjunto de datos original. La memoria utilizada por 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 de índice de búsqueda vectorial predeterminado de una tabla base que tiene 10.000 filas o más. Este tipo usa la menor cantidad de memoria o aproximadamente el 25% del tamaño del conjunto de datos. Los índices TREE_SQ se conservan en el disco.
  • TREE_AH: un tipo de índice de búsqueda vectorial que proporciona un algoritmo de búsqueda de hash asimétrico. Tal como se implementa en Cloud SQL, este tipo de índice no está optimizado para la huella de memoria y no se conserva.

Actualizar índices de búsqueda vectorial

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

Si revierte una transacción, los cambios de reversión correspondientes también se producen en el índice de búsqueda vectorial.

Replicación de índices de búsqueda vectorial

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

Configurar una instancia para que admita incrustaciones de vectores

En esta sección se describe cómo configurar tu instancia de Cloud SQL para que admita el almacenamiento, la indexación y las consultas de inserciones vectoriales.

Las instancias de las ediciones Enterprise y Enterprise Plus de Cloud SQL admiten inserciones vectoriales.

Antes de empezar

Habilitar las inserciones de vectores

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

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

Sustituye INSTANCE_NAME por el nombre de la instancia en la que quieras habilitar la compatibilidad con la inserción de vectores.

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

  • cloudsql_vector: define esta marca en on para habilitar el almacenamiento de inserciones de vectores y la compatibilidad con la búsqueda. Puedes crear columnas de inserciones vectoriales e índices de búsqueda vectorial en la instancia.
  • cloudsql_vector_max_mem_size: opcional. Especifica la asignación de memoria máxima en bytes para todos los índices de búsqueda vectorial de la instancia. Si no especificas esta marca, la asignación de memoria predeterminada será de 1 GB, que es la asignación de memoria mínima. Para obtener más información sobre cómo calcular la cantidad que debe especificar, consulte Configurar la asignación de memoria para índices de búsqueda de vectores.

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

    Si especifica un valor superior al 50% de su 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, el comando puede tener un aspecto 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 inserciones vectoriales en Cloud SQL para MySQL son estáticas. Después de actualizar la instancia con las marcas, esta se reiniciará automáticamente para que los cambios de configuración surtan efecto.

Para obtener más información sobre cómo configurar marcas de bases de datos para MySQL, consulta el artículo Configurar marcas de bases de datos.

Inhabilitar incrustaciones de vectores

Para inhabilitar las inserciones de vectores, asigna el valor off a la marca cloudsql_vector.

Por ejemplo:

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

Sustituye INSTANCE_NAME por el nombre de la instancia en la que vas a desactivar la compatibilidad con la inserción de vectores.

Si asignas el valor cloudsql_vector a off, no podrás crear columnas de inserción de vectores ni índices de búsqueda de vectores. Después de configurar este flag estático, la instancia se reiniciará automáticamente para que el cambio de configuración surta efecto.

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

  • Elimina todos los índices de búsqueda de vectores TREE_SQ persistentes del disco persistente.
  • Mantiene las entradas de la tabla del diccionario de datos de los índices de búsqueda vectorial que se han creado. Sin embargo, Cloud SQL para MySQL no reconstruye los índices y las consultas de búsqueda a estos índices devuelven un error.
  • Sigue almacenando las incrustaciones de vectores en las tablas base. Los vector embeddings siguen estando accesibles.

Si más adelante vuelves a habilitar la marca cloudsql_vector en la instancia, Cloud SQL intentará volver a generar los índices mientras se reinicia la instancia en función de las entradas de la tabla del diccionario de datos.

Configuración de réplicas de lectura

Si la instancia cumple los criterios de versión de mantenimiento y habilitación de la marca, Cloud SQL admite totalmente las inserciones de vectores en una réplica de lectura.

Si creas una réplica a partir de una instancia principal que tenga habilitada la compatibilidad con la incrustación de vectores, la réplica de lectura heredará los ajustes de compatibilidad con la incrustación de vectores de la instancia principal. Debes habilitar la compatibilidad con la inserción de vectores de forma individual en las instancias de réplica de lectura que ya tengas.

En cuanto al impacto en el retraso de la replicación, la creación y el mantenimiento de los índices de búsqueda vectorial funcionan de la misma forma que los índices de MySQL normales.

Los índices de búsqueda vectorial no se admiten en réplicas en cascada.

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

En el siguiente ejemplo, se explica cómo crear un índice de búsqueda de vectores basado en ANN y cómo hacer una consulta en Cloud SQL.

  1. Generar incrustaciones de vectores. Puedes crear inserciones vectoriales manualmente o usar la API de inserciones de texto que prefieras. Para ver un ejemplo que usa Vertex AI, consulta Generar inserciones de vectores basadas en datos de filas.

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

    CREATE TABLE books (
    id   INTEGER PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(60),
    embedding VECTOR(3) USING VARBINARY
    );
    
  3. Inserta una inserción de vector 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 búsqueda vectorial. Si vas a crear un índice TREE_SQ o TREE_AH, la tabla debe tener al menos 1000 filas.

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

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

Generar incrustaciones de vectores a partir de datos de filas

Puedes generar una inserción de vector para los datos de una fila determinada mediante una API de inserción de texto, como Vertex AI o OpenAI. Puedes usar cualquier API de incrustaciones de texto con las incrustaciones de vectores de Cloud SQL. Sin embargo, debes usar la misma API de inserciones de texto para generar el vector de la cadena de consulta. No puedes combinar diferentes APIs para los datos de origen y la vectorización de consultas.

Por ejemplo, puedes generar una incrustación vectorial desde Vertex AI:

from vertexai.language_models import TextEmbeddingModel

def text_embedding() -> list:
    """Text embedding with a Large Language Model."""
    model = TextEmbeddingModel.from_pretrained("text-embedding-004")
    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()

Almacenar incrustaciones de vectores

En esta sección se proporcionan ejemplos de instrucciones para almacenar inserciones vectoriales en Cloud SQL.

Crear una tabla con una columna de inserción de vector

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

Añadir una columna de inserciones vectoriales a una tabla

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

Insertar una incrustación de vector

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

Insertar varias incrustaciones de vectores

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

Insertar o actualizar una incrustación de vector

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]');

Actualizar una incrustación de vector

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

Eliminar una incrustación de vector

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

Trabajar con índices de búsqueda vectorial

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

Recomendaciones

En esta sección se describen las prácticas recomendadas para trabajar con índices de búsqueda vectorial. Cada carga de trabajo es diferente, por lo que es posible que tengas que hacer ajustes.

  • Antes de crear un índice de búsqueda vectorial, debes cargar datos en la tabla. Tu tabla base debe tener al menos 1000 filas. Estos requisitos solo se aplican a los tipos de índice de búsqueda TREE_SQ y TREE_AH. Si tienes más puntos de datos disponibles, tendrás una mejor partición y entrenamiento del índice.
  • Monitoriza el uso de memoria de los índices. Si la instancia se queda sin memoria, no podrás crear ni compilar ningún índice. En el caso de los índices que ya existen, cuando se alcanza el umbral, Cloud SQL escribe periódicamente advertencias en el registro de errores de MySQL. Puedes ver el uso de memoria en la tabla information_schema.innodb_vector_indexes.
  • Si la tabla base subyacente ha sufrido cambios importantes en el lenguaje de manipulación de datos, vuelve a compilar los índices de búsqueda de vectores. Para obtener el tamaño inicial del índice en tiempo de compilación y el tamaño actual del índice, consulta la tabla information_schema.innodb_vector_indexes.
  • Por lo general, se puede dejar que el número de particiones se calcule internamente. Si quieres especificar el número de particiones, debes tener al menos 100 puntos de datos por partición.

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

Durante las tres operaciones del índice de búsqueda vectorial (crear, modificar y eliminar), la tabla base se pone en modo de solo lectura. Durante estas operaciones, no se permiten DMLs en la tabla base.

Persistencia, cierre e impacto en el mantenimiento

Solo los índices de búsqueda vectorial que usan el tipo TREE_SQ se conservan en el disco cuando se cierra una instancia de forma correcta. Los índices de búsqueda vectorial que usan los tipos TREE_AH y BRUTE_FORCE solo se almacenan en la memoria.

Después de un cierre limpio de una instancia, Cloud SQL vuelve a cargar los índices de búsqueda de vectores cuando se reinicia la instancia. Sin embargo, después de un fallo o un apagado incorrecto, Cloud SQL debe volver a generar los índices de búsqueda de vectores. Por ejemplo, cada vez que tu instancia sufra un fallo y se recupere mediante una copia de seguridad y una restauración, una recuperación a un momento dado o una conmutación por error de alta disponibilidad, Cloud SQL volverá a compilar tus índices de búsqueda vectorial. En estos casos, ocurre lo siguiente:

  • La recompilación se realiza automáticamente en segundo plano.
  • Durante la reconstrucción, la tabla base está en modo de solo lectura.
  • Si la recompilación automática no puede bloquear la tabla en un periodo de tiempo específico, se produce un error. Es posible que tengas que volver a crear el índice manualmente.

El tiempo necesario para reconstruir un índice puede aumentar el tiempo necesario para apagar una instancia, lo que también puede aumentar el tiempo de mantenimiento y actualización necesario para una instancia.

Configurar la asignación de memoria para los índices de Vector Search

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

Para asegurarse de que Cloud SQL tiene suficiente memoria disponible para mantener todos los índices de búsqueda vectorial en la memoria, configure la instancia de Cloud SQL con una cloudsql_vector_max_mem_size. cloudsql_vector_max_mem_size determina la cantidad de memoria que la instancia de Cloud SQL dedica a los índices de búsqueda vectorial. Cuando configures el valor de la marca, ten en cuenta lo siguiente:

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

Para actualizar la memoria asignada a los índices de búsqueda vectorial de 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

Haz los cambios siguientes:

  • INSTANCE_NAME: el nombre de la instancia en la que vas a cambiar la asignación de memoria.
  • NEW_MEMORY_VALUE: la asignación de memoria actualizada, en bytes, de tus índices de búsqueda vectorial.

Este cambio reinicia la instancia automáticamente para que se aplique.

Calcular la memoria necesaria

La cantidad de memoria que requiere un índice depende del tipo de índice, del número de inserciones de vectores y de la dimensionalidad de las inserciones. Hay dos requisitos de memoria que debes tener en cuenta:

  • Memoria de tiempo de compilación: la memoria necesaria durante la compilación del índice.
  • Memoria del índice: la memoria que ocupa el índice después de crearse.

En un índice determinado, el tamaño del conjunto de datos es la memoria necesaria para leer todas las incrustaciones de vectores en la memoria. Dado que cada dimensión se representa mediante un número de coma flotante que usa 4 bytes de memoria, puede determinar el tamaño del conjunto de datos de la siguiente manera:

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

Por ejemplo, si tienes un millón de inserciones de 768 dimensiones, tu dataset_size será de 3 GB.

Según el ejemplo anterior, los requisitos de memoria de los diferentes tipos de índice 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 TREE_SQ índices de búsqueda de vectores, también debes tener en cuenta la memoria necesaria para la persistencia en el tiempo de ejecución. A la cantidad total de memoria de tu configuración, añade la cantidad de memoria de índice que usa el índice de búsqueda de vectores TREE_SQ activo más grande.

Cada vez que se realizan operaciones de DML en la tabla base en la que se almacenan las incrustaciones de vectores, el índice de búsqueda de vectores se actualiza en tiempo real. Estos cambios modifican el espacio de memoria del índice, que puede reducirse o ampliarse en función de la operación DML. Puedes monitorizar el espacio de memoria de un índice consultando la tabla information_schema.innodb_vector_indexes. Para obtener información sobre cómo monitorizar el tamaño de tu índice de búsqueda vectorial, consulta Monitorizar índices de búsqueda vectorial.

Crear un índice de búsqueda vectorial

La instrucción para crear un índice de búsqueda vectorial utiliza 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 especifique debe ser único en la base de datos.

Parámetros del índice de búsqueda vectorial

Las funciones mysql.create_vector_index y mysql.alter_vector_index admiten varios parámetros que puedes especificar con pares clave-valor separados por comas. Todos los parámetros de la función mysql.create_vector_index son opcionales. Si especifica una cadena vacía o NULL, se configurarán los valores de los parámetros predeterminados para el índice.

  • distance_measure: los valores admitidos son L2_SQUARED, COSINE y DOT_PRODUCT. L2_SQUARED es el valor predeterminado.
  • num_neighbors: el número de vecinos que se devolverán de una consulta de ANN. También puedes anular este parámetro al realizar la consulta de búsqueda. El valor predeterminado es 10.
  • index_type: especifica el tipo de índice que se va a crear. Los valores válidos son: BRUTE_FORCE, TREE_SQ y TREE_AH.

    • BRUTE_FORCE es el valor predeterminado de una tabla que tiene menos de 10.000 filas.
    • TREE_SQ es el valor predeterminado de 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 superior a 1000 filas.

  • num_parititions: especifica el número de clústeres de k-means que se van a crear. Este parámetro solo se permite si ha configurado un index_type. Esta opción no se aplica a BRUTE_FORCE. Si especifica 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.

Modificar un índice de búsqueda vectorial

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

La función alter_vector_index se usa explícitamente para volver a compilar un índice de búsqueda vectorial. Para usar esta función, el índice ya debe existir. Puede que quieras recompilar un índice en los siguientes casos:

  • Para volver a crear el índice con otras opciones. Por ejemplo, puede que quieras usar otro tipo de índice u otra medida de distancia.
  • Para volver a crear el índice porque la tabla base ha sufrido cambios importantes en el lenguaje de manipulación de datos. Por ejemplo, debes volver a entrenar el índice de búsqueda de vectores en función de los datos de la tabla base.

Todos los parámetros para volver a compilar el índice son idénticos a los que se pueden usar para crear el índice y también son opcionales. Si especifica una cadena vacía o NULL al volver a compilar el índice, este se volverá a compilar en función de los parámetros especificados en el momento de la creación del índice. Si no se proporcionan parámetros al crear el índice, se usarán los valores predeterminados.

El índice de búsqueda de vectores ya creado está disponible durante la operación alter_vector_index. Puedes seguir realizando consultas de búsqueda en el índice.

Eliminar un índice de búsqueda vectorial

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 DDL en la tabla, debe eliminar el índice de búsqueda vectorial.

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

Consultar incrustaciones de vectores

En esta sección se proporcionan ejemplos de las diferentes formas en las que puede consultar las inserciones de vectores.

Ver las incrustaciones de vectores

SELECT vector_to_string(embedding) FROM books;

Obtener la búsqueda exacta de vecinos de una incrustación de vector

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

Obtener la búsqueda de vecinos aproximada de una incrustación de vector

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

Para realizar una búsqueda de ANN, se admiten dos parámetros. Ambos son opcionales.

  • num_partitions: especifica el número de particiones que se van a sondear para una búsqueda de vectores ANN. Si no especifica el número de particiones, la búsqueda usará un valor generado en función del tamaño de la tabla, el número de particiones del índice de búsqueda vectorial y otros factores.
  • num_neighbors: especifica el número de vecinos que se van a devolver. Este valor anula el valor definido en el momento de la creación del índice de búsqueda vectorial.

Filtrar incrustaciones de vectores

Usa columnas adicionales como predicados para ajustar el filtrado de los resultados de las consultas de inserciones de vectores. Por ejemplo, si añade una columna printyear, puede añadir un año específico como filtro a su consulta.

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

Consultar la distancia de una incrustación de vector

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

Obtener la distancia del coseno

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

Obtener la distancia del producto escalar

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

Obtiene la distancia L2 al cuadrado.

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

Obtener 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;

Monitorizar índices de búsqueda vectorial

Para obtener información en tiempo real sobre todos los índices de búsqueda vectorial de 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;

La salida de ejemplo podría ser la siguiente:

*************************** 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, puede ver lo siguiente:

  • Las opciones que se pueden generar. Es decir, num_partitions o el número de particiones que se van a sondear en una consulta.
  • Las columnas STATE y STATUS indican el estado actual del índice. Durante la fase de compilación, la columna de estado proporciona información sobre el progreso de la fase de compilación del índice de búsqueda vectorial.
  • La columna INITIAL_SIZE indica el tamaño de la tabla durante la creación del índice. Puedes comparar este tamaño con CURRENT_SIZE para hacerte una idea de cuánto ha cambiado el índice desde su creación debido a las DMLs de la tabla base.
  • Las columnas QUERIES y MUTATIONS te ofrecen estadísticas en tiempo real sobre la carga del índice.
  • Las columnas INDEX_MEMORY y DATASET_MEMORY proporcionan información sobre el consumo de memoria del índice. INDEX_MEMORY indica la cantidad de memoria que consume el índice y DATASET_MEMORY indica la cantidad de memoria adicional que se consume durante el tiempo de compilación.

Para obtener una lista de los índices de vectores de búsqueda creados en la instancia, puede consultar la tabla del diccionario de datos mysql.vector_indexes.

Para ver la tabla, ejecuta el siguiente comando:

SELECT * FROM mysql.vector_indexes;

Ejemplo de salida:

*************************** 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 inserción de vector por tabla.
  2. Solo puede haber un índice de búsqueda vectorial por tabla.
  3. Una incrustación de vector puede tener hasta 16.000 dimensiones.
  4. No se admite la creación de particiones a nivel de tabla de InnoDB en tablas con columnas de inserción de vectores.
  5. Si la instancia se reinicia tras un apagado incorrecto, Cloud SQL volverá a compilar el índice de búsqueda de vectores automáticamente.
    1. Mientras se vuelve a crear el índice de búsqueda de vectores, la tabla base es de solo lectura.
    2. Si Cloud SQL no puede obtener un bloqueo en la tabla en el tiempo especificado, es posible que no se pueda volver a compilar el índice automáticamente.
    3. Si la recompilación automática del índice falla, debes recompilarlo manualmente.
  6. Para añadir una columna de inserciones vectoriales, la tabla debe tener una clave principal. Cloud SQL no admite claves principales de los tipos BIT, BINARY, VARBINARY, JSON, BLOB, TEXT ni de datos espaciales. Las claves primarias compuestas no pueden incluir ninguno de estos tipos.
  7. Si hay un índice de búsqueda vectorial en una tabla, no se permiten las operaciones DDL. El índice de búsqueda vectorial debe eliminarse antes de realizar operaciones DDL en la tabla base.
  8. Las incrustaciones de vectores no se admiten en tablas que no sean InnoDB ni en tablas temporales.
  9. La columna de inserción de vector 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 de la tabla se evalúan después de aplicar los predicados vectoriales.
  11. El predicado NEAREST..TO solo se admite en una instrucción SELECT. Otras instrucciones DML no admiten NEAREST..TO.
  12. NEAREST..TO no admite subconsultas. No se puede añadir una restricción a la clave principal de la tabla base si hay un índice de búsqueda vectorial.
  13. El prefiltrado solo se puede realizar mediante funciones de distancia y usando ORDER BY con LIMIT.

    Por ejemplo, si crea 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
    );
    

    A continuación, puedes usar la siguiente consulta para prefiltrar.

    //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 posfiltrado se admite con NEAREST..TO y funciones de distancia.

Solucionar problemas

En caso de fallo, el índice se vuelve a generar automáticamente. Cuando se está reconstruyendo, hay dos restricciones:

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

Siguientes pasos