Búsqueda de vectores

En esta página, se describe cómo se implementan las búsquedas vectoriales en las instancias de Cloud SQL para MySQL. Cloud SQL te permite almacenar incorporaciones de vectores, crear índices de vectores y realizar búsquedas de vectores junto con tus otros datos almacenados.

Almacenamiento de embeddings de vectores

Almacenas las incorporaciones de vectores en una tabla que cumple con las propiedades de atomicidad, coherencia, aislamiento y durabilidad (ACID). Al igual que otros datos relacionales en la tabla, puedes acceder a los embeddings de vectores en la tabla con semánticas transaccionales existentes.

Para establecer la asignación entre las filas de la tabla y las representaciones vectoriales, debes crear una columna en la tabla para almacenar tus embeddings vectoriales. La columna debe usar el tipo de datos VECTOR de Cloud SQL y debe indicar la cantidad de dimensiones que requiere la incorporación. La columna de vectores de embeddings solo puede almacenar vectores de embeddings que usen exactamente las mismas dimensiones que especificas cuando defines la columna.

Una tabla solo puede tener una columna de embedding de vectores. No hay restricciones para la cantidad de filas en la tabla.

Para distinguir la columna de embedding de vectores de otras columnas, Cloud SQL agrega COMMENT y CONSTRAINT especiales a la columna. La restricción es obligatoria para la validación de entrada y la anotación de la columna de embedding de vectores es visible como COMMENT. No puedes modificar ni borrar el comentario ni la restricción.

Si tienes suficiente almacenamiento y memoria disponibles en tu instancia de Cloud SQL, puedes tener varias tablas con sus propias columnas de incorporación de vectores.

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

Para obtener una lista de limitaciones y restricciones para las tablas, columnas y declaraciones DML de incorporación de vectores, consulta Limitaciones.

Índices vectoriales

Debes usar un índice vectorial para realizar búsquedas de similitud de ANN en tus incorporaciones de vectores. Cloud SQL crea índices de vectores con el algoritmo Scalable Nearest Neighbors (ScANN).

Los índices vectoriales tienen los siguientes requisitos:

  • Solo puedes crear un índice de vectores por tabla.
  • Si tienes varias tablas con incorporaciones de vectores en tu instancia, puedes crear índices vectoriales para cada una de ellas.
  • Si creas un índice vectorial, no puedes agregar una restricción a la clave primaria de la tabla indexada.

Para mejorar la calidad de la búsqueda, crea un índice vectorial solo después de cargar la mayor parte de tus datos en la tabla base. Si tienes menos de 1,000 incorporaciones en la tabla base, la creación del índice fallará.

Cuando decidas si crear un índice de vectores, si tienes una pequeña cantidad de filas, considera si puedes realizar una búsqueda de KNN en su lugar. La decisión de usar una búsqueda de KNN en lugar de una de ANN también depende de la cantidad de dimensiones en la incorporación de vectores. Una mayor cantidad de incorporaciones podría requerir un índice de vectores.

Para obtener una lista de las limitaciones y restricciones de los índices vectoriales, consulta Limitaciones. Si deseas obtener información para crear un índice vectorial, consulta Crea y administra índices vectoriales.

Actualizaciones del índice vectorial

Cloud SQL actualiza los índices 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 vectores asociados. Los índices vectoriales se comportan de la misma manera que cualquier otro índice secundario de la tabla. Los índices vectoriales son totalmente coherentes a nivel de las transacciones y cumplen con ACID. Si reviertes una transacción, los cambios de reversión correspondientes también se producirán en el índice de vectores.

Replicación de índices vectoriales

Cloud SQL replica los índices de vectores en todas las réplicas de lectura, incluida la replicación en cascada. Cuando creas una réplica de lectura nueva a partir de una instancia principal que tiene embeddings de vectores, la réplica de lectura hereda la configuración de embeddings de vectores de la instancia principal. En el caso de las réplicas de lectura existentes, debes habilitar la compatibilidad con el embedding de vectores en cada una.

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

Persistencia, cierre e impacto en el mantenimiento

Los índices vectoriales se conservan de la misma manera que las tablas base, con compatibilidad completa con ACID. Los índices vectoriales siempre están sincronizados con los datos de su tabla base y tienen la misma visibilidad, aislamiento y seguridad contra fallas. El índice de vectores no se ve afectado cuando se cierra la instancia o se le realiza mantenimiento.

Mantenimiento de índices

Después de realizar operaciones de DML extensas en la tabla base, es posible que el índice de vectores que entrenaste en los datos iniciales (en el momento de la creación del índice) no refleje el estado nuevo. Esto puede afectar la calidad de la búsqueda.

El índice tiene dos partes:

  • El árbol de índices Para ello, se entrena con datos existentes. No cambia durante la vida útil del índice.
  • El índice sale. Estas contienen todas las filas de datos. Las hojas del índice nunca se desincronizan.

El árbol de índices puede volverse menos eficiente después de que se ejecuta una gran cantidad de instrucciones DML porque las filas se mueven de una hoja a otra. Para actualizar el árbol de índices, debes volver a compilar el índice.

Operaciones DDL no admitidas en tablas con índices vectoriales

  • Operaciones de alteración de tablas que requieren un algoritmo de copia
  • Operaciones de alteración de tablas que requieren que se vuelva a compilar la tabla.
  • Quita o cambia la clave principal.
  • Mueve la tabla a un espacio de tabla general.

Búsqueda de vectores

Cloud SQL proporciona funciones de distancia vectorial que puedes usar para realizar búsquedas de similitud de vectores de vecino más cercano aproximado (ANN) y de K-vecinos más cercanos (KNN) en tu instancia. Cuando ejecutas una consulta, el vector de consulta se compara con los vectores de tu conjunto de datos. Las funciones de distancia calculan la distancia entre los vectores con una métrica de similitud, como el coseno. Los vectores con la distancia más corta entre ellos son los más similares y se muestran en los resultados de la búsqueda.

Cloud SQL usa las siguientes funciones para medir la distancia entre vectores en las búsquedas vectoriales cuando realizas búsquedas de vectores de ANN y KNN:

  • Cosine: mide el coseno del ángulo entre dos vectores. Un valor más bajo indica una mayor similitud entre los vectores.
  • Producto escalar: calcula el coseno del ángulo multiplicado por el producto de las magnitudes vectoriales correspondientes.
  • Distancia al cuadrado de L2: mide la distancia euclidiana entre dos vectores sumando la distancia al cuadrado en cada dimensión.

Una búsqueda vectorial de KNN es el método de búsqueda preferido cuando necesitas resultados exactos o deseas agregar un filtrado selectivo. La búsqueda de KNN realiza un cálculo de distancia del vector de consulta con cada incorporación del conjunto de datos para encontrar el vecino más cercano. Las búsquedas de KNN en Cloud SQL proporcionan una recuperación perfecta. Las búsquedas de KNN no usan un índice vectorial, por lo que son una buena opción cuando se trabaja con conjuntos de datos más pequeños.

Para realizar una búsqueda de KNN, usa la función vector_distance que toma dos vectores como entrada: el vector de consulta (lo que buscas) y un vector candidato de tu conjunto de datos. Calcula la distancia entre estos dos vectores. Usa vector_distance en una sentencia SELECT. Para obtener más información, consulta Búsqueda de k-vecinos más cercanos (KNN).

Si descubres que el KNN no tiene un buen rendimiento, puedes compilar un índice de vectores más adelante y seguir usando approx_distance en tu aplicación para las búsquedas de ANN.

Una búsqueda de vectores de ANN es el tipo de búsqueda preferido cuando la eficiencia de la consulta es una preocupación. Acelera las búsquedas de similitud calculando la distancia entre el vector de consulta y solo una parte de los vectores de tu conjunto de datos. Para ello, Cloud SQL organiza los datos en clústeres o particiones y, luego, enfoca la búsqueda en los clústeres más cercanos a la consulta. Las búsquedas de ANN requieren índices vectoriales. Estos índices priorizan la velocidad de búsqueda sobre la recuperación perfecta. En Cloud SQL, se usa el tipo de índice TREE_SQ para las búsquedas de ANN.

Para realizar una búsqueda de ANN, usa la función approx_distance con una opción de medición de distancia. Usas approx_distance en una lista ORDER BY o SELECT, y se permite una cláusula LIMIT para limitar los resultados de la búsqueda. También puedes agregar una cláusula WHERE para realizar un filtrado posterior de los resultados de la búsqueda. Para obtener más información, consulta Búsqueda de vecino más cercano aproximado (ANN).

En algunos casos, una búsqueda de ANN recurre a una búsqueda de KNN. Para obtener más información, consulta Verifica el estado de resguardo de las búsquedas de ANN.

Requisitos

Cloud SQL requiere que habilites las incorporaciones de vectores en la instancia con la marca cloudsql_vector antes de agregarlas. Para obtener más información, consulta Habilita e inhabilita las incorporaciones de vectores en tu instancia.

Limitaciones

Las siguientes son limitaciones para las tablas que tienen una columna de embeddings de vectores:

  • Solo puede haber una columna de embedding de vectores por tabla.
  • Solo puede haber un índice de vectores por tabla.
  • Un embedding de vectores se limita a 16,000 dimensiones.
  • La columna de embedding de vectores no puede ser una columna generada.
  • No se admite la partición a nivel de tabla en tablas con columnas de embedding de vectores.
  • Las claves primarias que usan los tipos de datos BIT, BINARY, VARBINARY, JSON, BLOB, TEXT o datos espaciales no son compatibles con los índices vectoriales. Las claves primarias compuestas tampoco pueden incluir ninguno de estos tipos.
  • Si hay un índice de vectores, no puedes agregar una restricción a la clave primaria de la tabla base.
  • Cuando hay un índice vectorial presente en una tabla, hay algunas operaciones de DDL que no puedes realizar. Para obtener más información, consulta Operaciones de DDL no admitidas en tablas con índices de vectores.

Las siguientes son restricciones para las consultas de búsqueda vectorial:

  • La función approx_distance solo se puede usar en una lista ORDER BY o SELECT.
  • Los predicados que involucran la tabla base se pueden usar en la condición WHERE en combinación con expresiones approx_distance en la lista ORDER BY o SELECT. Los predicados de condición WHERE se evalúan después de que se evalúan las funciones vectoriales approx_distance.

Prácticas recomendadas para trabajar con índices de vectores

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

  • Después de operaciones importantes de DML, se recomienda volver a compilar el índice.
  • Por lo general, es aceptable permitir que Cloud SQL calcule la cantidad de hojas que se usarán. Si tienes un caso de uso en el que deseas especificar la cantidad de hojas, se recomienda tener al menos 100 vectores por hoja para obtener la mejor recuperación.

¿Qué sigue?