En esta página, se describe cómo se implementan las búsquedas de vectores en 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 semánticas transaccionales existentes.
Para establecer una 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. La columna de embeddings de vectores solo puede almacenar embeddings de vectores que usen exactamente las mismas dimensiones que especificas cuando defines la columna. No hay restricciones para la cantidad de filas en la tabla en la que almacenas embeddings de vectores.
Si tienes suficiente almacenamiento y memoria disponibles en tu instancia de Cloud SQL, puedes tener varias tablas con sus propias columnas de embeddings de vectores.
La replicación de datos funciona de la misma manera para la columna de embeddings de vectores que para otras columnas de MySQL InnoDB.
Para obtener una lista de las limitaciones y restricciones de las tablas, las columnas, y las instrucciones DML de embeddings de vectores, consulta Limitaciones.
Índices vectoriales
Debes usar un índice vectorial para realizar búsquedas de similitud ANN en tus embeddings de vectores. Cloud SQL crea índices vectoriales con el algoritmo de vecinos más cercanos escalables (ScANN).
Los índices vectoriales tienen los siguientes requisitos:
- Solo puedes crear un índice vectorial 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 vectorial, 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 vectorial solo después de cargar la mayor parte de tus datos en la tabla base. Si tienes menos de 1,000 embeddings en la tabla base, falla la creación del índice.
Cuando decidas si crear un índice vectorial, si tienes una pequeña cantidad de filas, considera si puedes realizar una búsqueda KNN en su lugar. La decisión de usar una búsqueda KNN en lugar de una ANN también depende de la cantidad de dimensiones en el embedding de vectores. Una mayor cantidad de embeddings podría requerir un índice vectorial.
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 de índices vectoriales
Cloud SQL actualiza los índices vectoriales 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 vectoriales asociados. Los índices vectoriales se comportan de la misma manera que cualquier otro índice secundario de la tabla. Los índices vectoriales son completamente coherentes desde el punto de vista transaccional y cumplen con ACID. Si reviertes una transacción, los cambios de reversión correspondientes también se producen en el índice vectorial.
Replicación de índices vectoriales
Cloud SQL replica los índices vectoriales en todas las réplicas de lectura, incluidas las réplicas 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. Para las réplicas de lectura existentes, debes habilitar la compatibilidad con embeddings 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 vectoriales 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 ante fallas. No hay impacto en el índice vectorial cuando la instancia se apaga o recibe mantenimiento.
Mantenimiento de índices
Después de que se realizan operaciones DML extensas en la tabla base, es posible que el índice vectorial 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 índice Se compila mediante el entrenamiento en datos existentes. Permanece sin cambios durante la vida útil del índice.
- Las hojas de índice Contienen todas las filas de datos. Las hojas de índice nunca se desincronizan.
El árbol de índice puede volverse menos eficiente después de que se ejecutan una gran cantidad de instrucciones DML porque 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
Las siguientes operaciones de lenguaje de definición de datos (DDL) no son compatibles con las tablas que tienen índices vectoriales.
- Operaciones de modificación de tablas que requieren el algoritmo de copia
- Operaciones de modificación de tablas que requieren que se vuelva a compilar la tabla
- Descartar o cambiar la clave primaria
- Mover la tabla a un espacio de tabla general
Búsqueda de vectores
Cloud SQL proporciona funciones de distancia vectorial que usas para realizar búsquedas de similitud de vectores de vecinos más cercanos aproximados (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 de vectores cuando realizas búsquedas de vectores 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 punto**: Calcula el coseno del ángulo multiplicado por el producto de las magnitudes vectoriales correspondientes.
- Distancia L2 al cuadrado: Mide la distancia euclidiana entre dos vectores agregando la distancia al cuadrado en cada dimensión.
Búsqueda de KNN
Una búsqueda de vectores KNN es el método de búsqueda preferido cuando necesitas resultados exactos o quieres agregar un filtrado selectivo. La búsqueda de KNN realiza un cálculo de distancia del vector de consulta con cada embedding 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 estás buscando) y un vector candidato de tu conjunto de datos. Calcula la distancia entre estos dos vectores.
Usas vector_distance en una instrucción SELECT. Para obtener más información, consulta
Busca K vecinos más cercanos (KNN).
Si descubres que KNN no funciona bien, puedes compilar un índice vectorial 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 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 vectoriales. Estos índices priorizan la velocidad de búsqueda por sobre la recuperación perfecta. En Cloud SQL, el TREE_SQ tipo de índice se usa para las búsquedas de ANN.
Para realizar una búsqueda de ANN, usa la
approx_distance función 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.
Si quieres tener más control sobre la cantidad de resultados que se muestran
cuando realizas una búsqueda de ANN con filtros, puedes
usar el filtrado iterativo. Con el filtrado iterativo, tu consulta de búsqueda puede mostrar más resultados de la búsqueda mediante el análisis de más del índice vectorial hasta que se encuentre la cantidad preferida de vecinos.
Puedes habilitar el filtrado iterativo para tu consulta de búsqueda si configuras la marca cloudsql_vector_iterative_filtering en ON a nivel de sesión para clientes individuales o a nivel global para todos los clientes que se conectan a la instancia.
Para obtener más información, consulta Busca vecinos más cercanos aproximados (ANN).
Hay algunos casos en los que una búsqueda de ANN recurre a una búsqueda de KNN. Para obtener más información, consulta Verifica el estado de fallback para las búsquedas de ANN.
Diferencias en la compatibilidad con vectores en las versiones de Cloud SQL para MySQL
Cloud SQL para MySQL introdujo la compatibilidad con la búsqueda de vectores en la versión 8.0.36 y versiones posteriores. A partir de Cloud SQL para MySQL versión 9.7, Cloud SQL modificó capacidades específicas de búsqueda de vectores para integrarse mejor con las funciones de almacenamiento y compatibilidad con vectores desarrolladas por la comunidad que se introdujeron en MySQL 9.0 desarrollado por la comunidad.
En la siguiente tabla, se proporciona una comparación de las versiones de Cloud SQL para MySQL que muestran cómo las diferencias en la versión pueden afectar el uso de la búsqueda de vectores en Cloud para MySQL.
| Área de compatibilidad | Cloud SQL para MySQL 8.4 y versiones anteriores | Cloud SQL para MySQL 9.7 y versiones posteriores |
|---|---|---|
| Habilitación de vectores | Para agregar embeddings de vectores a tu base de datos de MySQL y usar
la búsqueda de vectores, debes configurar la marca cloudsql_vector
en on para tu instancia de Cloud SQL.
|
Si quieres crear índices vectoriales y realizar búsquedas de ANN, debes configurar la marca cloudsql_vector en on. |
| Columnas de embeddings de vectores en una tabla | Una tabla solo puede tener una columna de embeddings de vectores. | Estás limitado a una columna de embeddings de vectores por tabla solo si creas un índice en la tabla. Si no creas un índice en la tabla, esta puede tener varias columnas de embeddings de vectores. |
Uso de COMMENT
y CONSTRAINT para identificar columnas de embeddings de vectores
|
Para distinguir la columna de embeddings de vectores de otras columnas, Cloud SQL agrega una anotación COMMENT especial y una regla CONSTRAINT a la columna.
La restricción es obligatoria para la validación de la entrada y la anotación de la columna de embeddings de vectores se ve como un comentario. No puedes modificar ni borrar el comentario o la restricción.
|
La anotación COMMENT y la regla CONSTRAINT ya no se usan para identificar columnas de embeddings de vectores en Cloud SQL para MySQL 9.7.
|
| Límite de dimensiones | Un embedding de vectores está restringido a 16,000 dimensiones sin valor predeterminado. | Un embedding de vectores está restringido a 16,383 dimensiones con un valor predeterminado de 2,048. |
| Formato de almacenamiento de vectores |
Formato VARBINARY
|
Formato de almacenamiento basado en la comunidad |
| Sintaxis para declarar el tipo de datos vector |
VECTOR(VECTOR_DIMENSIONS)
|
VECTOR(VECTOR_DIMENSIONS)
|
| Diferencias en las funciones de conversión | El resultado de la función vector_to_string se imprime como el valor completo.
|
El resultado de la vector_to_string
función se renderiza en notación científica,
que es el estándar de la comunidad.
|
Limitaciones
Las siguientes limitaciones se aplican a todas las versiones de Cloud SQL que admiten vectores:
- Solo puede haber un índice vectorial por tabla.
- La columna de embeddings de vectores no puede ser una columna generada.
- No se admite la creación de particiones a nivel de tabla en tablas con columnas de embeddings de vectores.
- Las claves primarias que usan los tipos de datos
BIT,BINARY,VARBINARY,JSON,BLOB,TEXTo datos espaciales no son compatibles con los índices vectoriales. Las claves primarias compuestas tampoco pueden incluir ninguno de estos tipos. - Si hay un índice vectorial, no puedes agregar una restricción a la clave primaria de la tabla base.
- Cuando hay un índice vectorial en una tabla, hay operaciones DDL que no puedes realizar. Para obtener más información, consulta Operaciones DDL no admitidas en tablas con índices vectoriales.
Las siguientes restricciones son para las consultas de búsqueda de vectores:
- La función
approx_distancesolo se puede usar en una listaORDER BYoSELECT. - Los predicados que involucran la tabla base se pueden usar en la condición
WHEREen combinación con expresionesapprox_distanceen la listaORDER BYoSELECT. Los predicados de condiciónWHEREse evalúan después de que se evalúan las funciones vectorialesapprox_distance.
¿Qué sigue?
- Lee la descripción general sobre la búsqueda de vectores en Cloud SQL.
- Aprende a generar embeddings de vectores.
- Aprende a crear índices vectoriales.
- Aprende a realizar búsquedas en embeddings de vectores.