Trabaja con incorporaciones vectoriales (versión preliminar)

En esta página, se detalla cómo puedes interactuar con Cloud SQL para crear aplicaciones que usen embeddings de vector.

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 de la tabla, puedes acceder a los embeddings de vector de la tabla con las garantías transaccionales existentes. Una tabla que tiene una columna de embeddings de vector 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 dejan de lado en las búsquedas en el índice de búsqueda de vectores.

Ten en cuenta lo siguiente cuando configures una tabla para los embeddings de vector:

  • Puedes crear un máximo de una columna de embeddings de vector en una tabla y un índice de búsqueda de vectores por tabla. Cada embedding de vector almacenado en la misma columna debe tener exactamente las mismas dimensiones que especificaste cuando definiste la columna. Un embedding de vector tiene un límite superior de 16,000 dimensiones. Si tienes suficiente almacenamiento y memoria disponibles, puedes tener tablas separadas con diferentes columnas de embeddings de vector 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 vector que puedes almacenar en una tabla, los índices de búsqueda de vectores requieren memoria. Por esta razón, te recomendamos que no almacenes más de 10 millones de embeddings de vector en una tabla.

  • Consulta también la lista de Limitaciones.

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

Cloud SQL admite la búsqueda de similitud empleando consultas KNN (de K vecino más cercano) y ANN (de vecino más cercano aproximado). Puedes usar ambos tipos de búsquedas de vectores en tus instancias de Cloud SQL. Solo puedes crear un índice de búsqueda de vectores para las búsquedas 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 L2 al cuadrado

Puedes obtener más información sobre el uso de las funciones de distancia de búsqueda de vectores en la sección Consulta la distancia de un embedding de vector.

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 ANN te permite optimizar el rendimiento en cuanto a velocidad de funcionamiento en lugar de apuntar a la recuperación perfecta. Para la búsqueda ANN, Cloud SQL admite los siguientes tipos de índices:

  • BRUTE_FORCE: 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: 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 vector

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

Habilita los embeddings de vector

Para activar la compatibilidad con embeddings de vector, 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 embeddings de vector.

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 vector y la compatibilidad de búsqueda. Puedes crear nuevos índices de búsqueda de vectores y columnas de embeddings de vector 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 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 cuánta memoria asignar, 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% del innodb_buffer_pool_size total.

    Si especificas un valor superior al 50% del 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 resultante 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 vector 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.

Inhabilita los embeddings de vector

Para inhabilitar los embeddings de vector, establece la marca cloudsql_vector en 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 cualquier búsqueda en estos índices muestra un error.
  • Continúa almacenando los embeddings de vector en las tablas base. Los embeddings de vector 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.

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 vector 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 vector, la réplica de lectura hereda la configuración de compatibilidad con embeddings de vector de la instancia principal. Debes habilitar la compatibilidad con embeddings de vector 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 ANN

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 búsqueda de vectores. 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 vector de Cloud SQL. Sin embargo, debes usar la misma API de embedding de texto para la generación de vectores de cadenas 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 vector 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()

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, lo cual implica ceder recuperación para ganar 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 realizar ajustes 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, obtendrás mejores resultados en la creación de particiones y entrenamiento del índice.
  • Monitorea 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 límite, Cloud SQL agrega advertencias al registro de errores de MySQL de forma periódica. Puedes ver el uso de memoria en la tabla information_schema.innodb_vector_indexes.
  • Si se realizaron cambios importantes en la tabla base subyacente mediante 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 que la cantidad de particiones se calcule 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 abrupto, Cloud SQL debe volver a compilar los índices de búsqueda de vectores. Por ejemplo, cada vez que tu instancia experimenta una falla, recuperación desde la 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.
  • La recompilación automática falla si no puede bloquear la tabla en un período de tiempo de espera específico. Es posible que debas volver a compilar el índice de forma manual.

El tiempo necesario para volver a compilar un índice puede aumentar el que se requiere para el cierre, que a su vez puede incrementar el tiempo para el mantenimiento y actualización de una instancia.

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 determina 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: Es 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 vector y la dimensionalidad de los embeddings. Debes tener en cuenta dos requisitos de memoria:

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

Para un índice determinado, su tamaño de conjunto de datos es la memoria necesaria para leer todos los embeddings de vector 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 un millón de embeddings de 768 dimensiones, tu dataset_size es de 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 monitorear el tamaño del índice de búsqueda de vectores, consulta Monitorea los índices de búsqueda de vectores.

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 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 especificas una cadena vacía o NULL, se asignan 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 la configuración predeterminada.
  • num_neighbors: Es la cantidad de vecinos que se devolverán de una consulta 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 la cantidad de clústeres K-means que 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:

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

Todos los parámetros para 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 cadena vacía o NULL cuando vuelves a compilar el índice, este se vuelve a compilar según los parámetros especificados al crearse el í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 alter_vector_index. Aún puedes realizar búsquedas en el índice.

Descarta un índice de búsqueda de vectores

No puedes realizar una operación de 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 vector

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 establecido cuando se creó el índice de búsqueda de vectores.

Filtra embeddings de vector

Usa columnas adicionales como predicados para ajustar el filtrado de los resultados de la consulta de embeddings de vector. 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 vector

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;

Distancia del producto punto

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

Obtén la distancia de L2 al cuadrado

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;

A continuación se incluye un ejemplo de resultado posible:

*************************** 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 el avance del proceso de creación del índice de búsqueda de vectores.
  • 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 las operaciones de 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 búsqueda de vectores 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 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 embeddings de vector.
  5. Si la instancia se reinicia tras un cierre abrupto, 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 bloquear 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 embeddings de vector, 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 en una tabla, no se permiten operaciones de DDL. El índice de búsqueda de vectores debe descartarse antes de realizar operaciones de DDL en la tabla base.
  8. Los embeddings de vector no son compatibles con tablas que no son de InnoDB ni con tablas temporales.
  9. La columna de embeddings de vector no puede ser una columna generada.
  10. El predicado NEAREST..TO se puede combinar con otros predicados “escalares” usando OR o AND. Los predicados escalares en la tabla se evalúan después de aplicar los predicados vectoriales.
  11. Solo se admite el predicado NEAREST..TO en una sentencia SELECT. Otras sentencias DML no admiten NEAREST..TO.
  12. No se admiten las subconsultas 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 a través de funciones de distancia y usando 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 el 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
    

    Se admite el filtrado posterior con NEAREST..TO y las funciones de distancia.

Solución de 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 compilar el índice, las consultas ANN en los índices existentes fallan.

¿Qué sigue?