Preparación de SQL para la búsqueda de vectores

Completado

Para poder ejecutar búsquedas vectoriales, debe almacenar vectores en la base de datos y decidir cómo se ejecutan esas búsquedas. En esta unidad se tratan las decisiones de diseño que se toman antes de escribir la primera consulta vectorial.

La búsqueda de vectores busca filas basadas en similitud matemática en lugar de coincidencias exactas. Para que esto funcione, almacene incrustaciones como vectores, elija cómo medir la similitud y decida si buscar todos los vectores exactamente o usar un índice para obtener resultados aproximados más rápidos.

Almacenar vectores con el tipo de datos vector

SQL Server y Azure SQL Database proporcionan un tipo de datos vectorial nativo diseñado para almacenar incrustaciones. Cada vector es una matriz de números de punto flotante, almacenados en un formato binario optimizado, pero expuestos como matrices JSON para mayor comodidad.

Al definir una columna vectorial, especifique el número de dimensiones:

CREATE TABLE dbo.Products
(
    ProductID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Description NVARCHAR(MAX),
    DescriptionVector VECTOR(1536) NOT NULL
);

El número entre paréntesis coincide con las dimensiones que genera el modelo de inserción. Por ejemplo, el modelo de inserción de texto de OpenAI-3-small genera 1536 dimensiones, por lo que la columna sería VECTOR(1536). El máximo admitido es de 1998 dimensiones.

Cada elemento se almacena como un float de precisión única (4 bytes). Un vector de dimensión de 1536 usa aproximadamente 6 KB por fila. Al diseñar la tabla, tenga en cuenta cómo afecta esta columna al almacenamiento y la memoria a medida que crecen los datos.

Descripción de las métricas de distancia

La búsqueda de vectores funciona calculando la distancia entre vectores. Los vectores que están más cerca representan conceptos más similares. SQL Server admite tres métricas de distancia:

La distancia coseno mide el ángulo entre vectores, ignorando su magnitud. Dos vectores que apuntan en la misma dirección tienen una distancia de coseno de 0, independientemente de su longitud. Esta métrica funciona bien cuando se preocupa por la dirección del significado, no por la intensidad. La distancia de coseno va de 0 (idéntico) a 2 (opuesto).

La distancia euclidiana mide la distancia de línea recta entre dos puntos en el espacio vectorial. Tiene en cuenta tanto la dirección como la magnitud. La distancia euclidiana oscila entre 0 (idéntico) y infinito.

Dot product calcula la suma de los productos elemento a elemento. SQL Server devuelve el producto de puntos negativos para que los valores más pequeños indiquen vectores más similares, coherentes con las demás métricas.

La mayoría de los modelos de inserción están optimizados para la similitud de coseno, lo que hace que la distancia de coseno sea la opción común. Sin embargo, la mejor métrica depende de cómo se hayan entrenado las inserciones.

Al buscar vectores similares, tiene dos opciones: búsqueda exacta de vecinos más cercanos (ENN), y búsqueda aproximada de vecinos más cercanos (ANN).

Búsqueda de vecino más cercano exacta compara el vector de consulta con cada vector de la tabla. Garantiza los resultados más precisos, pero requiere calcular la distancia a cada fila. Use la VECTOR_DISTANCE función para la búsqueda exacta:

DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';

SELECT TOP 10 ProductID, Name,
    VECTOR_DISTANCE('cosine', @query, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;

Esta consulta calcula la distancia de coseno entre @query y cada fila DescriptionVectory, a continuación, devuelve las 10 coincidencias más cercanas. Para tablas pequeñas (menos de 50 000 vectores como una guía general), la búsqueda exacta funciona bien.

La búsqueda de vecinos más cercana aproximada usa un índice vectorial para buscar vectores similares sin examinar cada fila. Se trata de un cambio de precisión perfecta a cambio de velocidad, ya que devuelve resultados muy cercanos a la exactitud, pero no garantiza que sean los vecinos más cercanos absolutos.

Cree un índice vectorial mediante CREATE VECTOR INDEX:

CREATE VECTOR INDEX idx_Products_DescriptionVector
ON dbo.Products(DescriptionVector)
WITH (METRIC = 'cosine', TYPE = 'DiskANN');

SQL Server usa el algoritmo DiskANN, que crea una estructura de grafos que permite una navegación rápida a vectores cercanos. Una vez que el índice existe, use la VECTOR_SEARCH función para la búsqueda aproximada:

DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @query,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
ORDER BY s.distance;

Decidir cuándo usar cada enfoque

La elección entre la búsqueda exacta y aproximada depende del tamaño del conjunto de datos y los requisitos de precisión.

Utilice la búsqueda exacta (VECTOR_DISTANCE) cuando:

  • La tabla tiene menos de 50 000 vectores
  • Los filtros de consulta reducen el conjunto de candidatos a unas pocas filas.
  • Necesita resultados precisos garantizados y puede aceptar tiempos de consulta más largos.

Use la búsqueda aproximada (VECTOR_SEARCH con un índice) cuando:

  • La tabla tiene cientos de miles o millones de vectores
  • La velocidad de consulta es más importante que la precisión perfecta
  • Una recuperación cercana a 1 (lo que significa que se han encontrado la mayoría de los verdaderos más cercanos verdaderos) es aceptable.

La recuperación mide cuántos de los verdaderos vecinos más cercanos devuelve la búsqueda aproximada en comparación con una búsqueda exacta. DiskANN suele lograr una recuperación alta, lo que significa que los resultados están muy cerca de lo que devolvería la búsqueda exacta.

Consideraciones sobre las limitaciones del índice

Los índices vectoriales de SQL Server tienen requisitos específicos para tener en cuenta:

  • La tabla debe tener una clave principal de entero de una sola columna con un índice agrupado.
  • Las tablas con índices vectoriales se convierten en de solo lectura mientras el índice existe; debe quitar el índice para modificar los datos y volver a crearlos.
  • Los índices vectoriales no se pueden particionar

Nota:

Los índices vectoriales se encuentran actualmente en versión preliminar. En Azure SQL Database y SQL Database en Microsoft Fabric, puede establecer la configuración con ámbito de la base de datos ALLOW_STALE_VECTOR_INDEX en ON para permitir escrituras, pero el índice no refleja los nuevos datos hasta que se vuelva a generar. Esta opción no está disponible actualmente en SQL Server 2025. Consulte la documentación actual para obtener la información más reciente sobre estas limitaciones.

Estas limitaciones afectan a la forma de diseñar las tablas y los flujos de trabajo de mantenimiento. En el caso de las tablas que cambian con frecuencia, puede usar la búsqueda exacta hasta que los datos se estabilicen y, a continuación, agregue un índice vectorial.

Conclusiones clave

Preparar SQL para la búsqueda de vectores significa tomar tres decisiones: qué tipo de datos y dimensiones usar, qué métrica de distancia coincide con el modelo de inserción y si la búsqueda exacta o aproximada se ajusta al tamaño del conjunto de datos. La búsqueda exacta con VECTOR_DISTANCE funciona bien para conjuntos de datos más pequeños o consultas filtradas, mientras que la búsqueda aproximada con VECTOR_SEARCH y un índice DiskANN controla conjuntos de datos más grandes de forma eficaz. En la unidad siguiente, aprenderá las funciones específicas y los patrones de consulta para ejecutar búsquedas de vectores.