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 embeddings de vectores, crear índices de vectores y realizar búsquedas de vectores junto con tus otros datos almacenados.
Almacenamiento de embeddings de vectores
Almacenas embeddings 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 la semántica transaccional existente.
Para establecer la asignación entre las filas de la tabla y las representaciones vectoriales, debes crear una columna en tu tabla para almacenar tus embeddings de vectores. 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 embeddings de vectores solo puede almacenar embeddings de vectores 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 o 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 embedding 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 las limitaciones y restricciones de las tablas de incorporación de vectores, las columnas y las instrucciones DML, consulta Limitaciones.
Índices vectoriales
Debes usar un índice de vectores para realizar búsquedas de similitud de ANN en tus embeddings de vectores. Cloud SQL crea índices de vectores con el algoritmo de vecinos más cercanos escalable (ScaNN).
Los índices vectoriales tienen los siguientes requisitos:
- Solo puedes crear un índice de vectores por tabla.
- Si tienes varias tablas con embeddings de vectores en tu instancia, puedes crear índices vectoriales para cada una de ellas.
- Si creas un índice de vectores, no puedes agregar una restricción a la clave primaria de la tabla indexada.
Para obtener una mejor calidad de búsqueda, crea un índice de vectores 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, fallará la creación del índice.
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 del embedding de vectores. Una mayor cantidad de embeddings podría requerir un índice de vectores.
Para obtener una lista de las limitaciones y restricciones de los índices vectoriales, consulta Limitaciones. Para obtener información sobre cómo crear un índice vectorial, consulta Crea y administra índices vectoriales.
Actualizaciones del índice de vectores
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 completamente coherentes a nivel transaccional y cumplen con los requisitos de 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, incluso para 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 de ellas.
En términos del impacto en el retraso de replicación, la creación y el mantenimiento de los índices de vectores funcionan 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 total con ACID. Los índices vectoriales siempre están sincronizados con los datos de su tabla base y tienen la misma visibilidad, aislamiento y seguridad ante fallas. El índice de vectores no se ve afectado cuando se apaga 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 con los datos iniciales (en el momento de la creación del índice) no refleje el nuevo estado. Esto puede afectar la calidad de la búsqueda.
El índice tiene dos partes:
- Es el árbol de índice. Se crea entrenando con datos existentes. Permanece sin cambios durante la vida útil del índice.
- La aguja sale del índice. Contienen todas las filas de datos. Los índices de hojas nunca se desincronizan.
El árbol de índice podría volverse menos eficiente después de ejecutar una gran cantidad de sentencias DML, ya que las filas se mueven de una hoja a otra. Para actualizar el árbol de índice, debes volver a compilar el índice.
Operaciones DDL no admitidas en tablas con índices vectoriales
- Operaciones de modificación de tablas que requieren un algoritmo de copia.
- Operaciones de modificación de tablas que requieren que se vuelva a compilar la tabla.
- Quita o cambia la clave primaria.
- Mueve la tabla a un espacio de tabla general.
Búsqueda de vectores
Cloud SQL proporciona funciones de distancia vectorial que se usan 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 búsqueda, el vector de búsqueda 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 de vectores cuando realizas búsquedas de vectores de ANN y KNN:
- Coseno: Mide el coseno del ángulo entre dos vectores. Un valor más pequeño indica una mayor similitud entre los vectores.
- Producto escalar: Calcula el coseno del ángulo multiplicado por el producto de las magnitudes de los vectores correspondientes.
- Distancia L2 al cuadrado: Mide la distancia euclidiana entre dos vectores sumando la distancia al cuadrado en cada dimensión.
Búsqueda de KNN
La búsqueda de vectores de KNN es el método de búsqueda preferido cuando necesitas resultados exactos o deseas agregar filtros selectivos. La búsqueda de KNN realiza un cálculo de distancia del vector de consulta con cada incorporación en el 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 estás buscando) y un vector candidato de tu conjunto de datos. Calcula la distancia entre estos dos vectores.
Usas vector_distance en una sentencia SELECT
. Para obtener más información, consulta Cómo buscar k-vecinos más cercanos (KNN).
Si observas que 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.
Búsqueda 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 tu 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 de vectores. Estos índices priorizan la velocidad de búsqueda por sobre la recuperación perfecta. En Cloud SQL, el tipo de índice TREE_SQ se usa 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 Cómo buscar vecinos más cercanos aproximados (ANN).
En algunos casos, una búsqueda de ANN recurre a una búsqueda de KNN. Para obtener más información, consulta Cómo verificar el estado de resguardo para las búsquedas con ANN.
Requisitos
Cloud SQL requiere que habilites los embeddings de vectores en la instancia con la marca cloudsql_vector
antes de agregar embeddings de vectores. Para obtener más información, consulta Cómo habilitar y, luego, inhabilitar las incorporaciones de vectores en tu instancia.
Limitaciones
A continuación, se indican las limitaciones de 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 está restringido 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
yTEXT
, o los datos espaciales, no se admiten para 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 de vectores en una tabla, hay algunas operaciones DDL que no puedes realizar. Para obtener más información, consulta Operaciones de DDL no admitidas en tablas con índices vectoriales.
A continuación, se indican las restricciones para las búsquedas vectoriales:
- La función
approx_distance
solo se puede usar en una listaORDER BY
oSELECT
. - Los predicados que involucran la tabla base se pueden usar en la condición
WHERE
en combinación con expresionesapprox_distance
en la listaORDER BY
oSELECT
. Los predicados de condiciónWHERE
se evalúan después de que se evalúan las funciones vectorialesapprox_distance
.
Prácticas recomendadas para trabajar con índices vectoriales
En esta sección, se proporcionan prácticas recomendadas para trabajar con índices vectoriales. Cada carga de trabajo es diferente y es posible que debas ajustarla en consecuencia.
- Después de las operaciones de DML importantes, se recomienda volver a compilar el índice.
- Por lo general, es aceptable dejar que Cloud SQL calcule la cantidad de nodos hoja 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?
- Lee la descripción general de la búsqueda de vectores en Cloud SQL.
- Obtén más información para generar embeddings de vectores.
- Obtén más información para crear índices de vectores.
- Aprende a realizar búsquedas en embeddings vectoriales.