Compartir vía


Información general sobre la búsqueda vectorial y los índices de vectores en el motor de base de datos de SQL

Se aplica a: SQL Server 2025 (17.x) Versión preliminar de la base de datos SQL de Azure SQL Database deAzure SQL Managed Instanceen Microsoft Fabric

Los vectores son matrices ordenadas de números (normalmente floats) que pueden representar información sobre algunos datos. Por ejemplo, una imagen se puede representar como un vector de valores de píxeles o una cadena de texto se puede representar como un vector de valores ASCII. El proceso para convertir los datos en un vector se denomina vectorización.

Nota:

Inserciones

Las incrustaciones son vectores que representan características importantes de los datos. Las incrustaciones a menudo se aprenden mediante un modelo de aprendizaje profundo, y los modelos de aprendizaje automático e inteligencia artificial las usan como características. Las incrustaciones también pueden capturar la similitud semántica entre conceptos similares. Por ejemplo, al generar una incrustación para las palabras person y human, podemos esperar que sus incrustaciones (representaciones vectoriales) tengan valores similares, ya que las palabras son semánticamente similares.

Azure OpenAI ofrece modelos para crear incrustaciones a partir de datos de texto. El servicio divide el texto en tokens y genera incrustaciones mediante modelos entrenados previamente por OpenAI. Para obtener más información, consulte Creación de incrustaciones con Azure OpenAI.

Una vez generadas las incrustaciones, se pueden almacenar en una base de datos de SQL Server. Esto le permite almacenar las incrustaciones junto con los datos que representan y realizar consultas de búsqueda vectorial para buscar puntos de datos similares.

La búsqueda de vectores hace referencia al proceso de búsqueda de todos los vectores de un conjunto de datos similar a un vector de consulta específico. Por lo tanto, un vector de consulta para la palabra human busca en todo el conjunto de datos vectores similares y, por tanto, palabras similares: en este ejemplo debe encontrar la palabra person como una coincidencia cercana. Esta proximidad, o distancia, se mide mediante una métrica de distancia, como la distancia coseno. Cuanto más cercanos sean los vectores, más similares serán.

SQL Server proporciona compatibilidad integrada con vectores a través del tipo de datos vectorial. Los vectores se almacenan en un formato binario optimizado, pero se exponen como matrices JSON para mayor comodidad. Cada elemento del vector se almacena mediante el valor de punto flotante de precisión única (4 bytes). Junto con el tipo de datos hay funciones dedicadas para operar en vectores. Por ejemplo, es posible encontrar la distancia entre dos vectores mediante la función VECTOR_DISTANCE . La función devuelve un valor escalar con la distancia entre dos vectores en función de la métrica de distancia que especifique.

Dado que normalmente los vectores se administran como matrices de floats, la creación de un vector se puede hacer simplemente convertir una matriz JSON a un tipo de datos vectorial . Por ejemplo, el código siguiente crea un vector a partir de una matriz JSON:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

O bien, use la conversión implícita

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

Lo mismo sucede para convertir un vector en una matriz JSON:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

Búsqueda exacta y distancia vectorial (vecinos más cercanos exactos)

La búsqueda exacta, también conocida como búsqueda de vecino más cercano (k-NN), implica calcular la distancia entre un vector determinado y todos los demás vectores de un conjunto de datos, ordenar los resultados y seleccionar los vecinos más cercanos en función de una métrica de distancia especificada. Este método garantiza una recuperación precisa de los vecinos más cercanos, pero puede ser de uso intensivo de cálculo, especialmente para grandes conjuntos de datos.

Las funciones de distancia vectorial se usan para medir la proximidad entre vectores. Entre las métricas de distancia comunes se incluyen la distancia euclidiana, la similitud de coseno y el producto de puntos. Estas funciones son esenciales para realizar búsquedas k-NN y garantizar resultados precisos.

La búsqueda de vectores más próximo exacto (ENN) realiza un cálculo exhaustivo de distancia en todos los vectores indexados para garantizar la recuperación de los vecinos más cercanos basándose en una métrica de distancia especificada. Este método es preciso, pero con un uso intensivo de recursos, lo que resulta adecuado para conjuntos de datos o escenarios más pequeños en los que la precisión es fundamental.

En el motor de base de datos sql, las búsquedas k-NN se pueden realizar mediante la función VECTOR_DISTANCE , lo que permite un cálculo eficaz de distancias entre vectores y facilita la recuperación de los vecinos más cercanos.

En el ejemplo siguiente se muestra cómo realizar k-NN para devolver los 10 vectores más similares principales almacenados en la content_vector tabla al vector @qvde consulta especificado.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

Se recomienda usar una búsqueda exacta cuando no hay muchos vectores en los que buscar (menos de 50 000 vectores como recomendación general). La tabla puede contener muchos más vectores siempre que los predicados de búsqueda reduzcan el número de vectores que se usarán para la búsqueda vecina a 50 000 o menos.

Índice vectorial aproximado y búsqueda de vectores (vecinos más cercanos aproximados)

La identificación de todos los vectores cerca de un vector de consulta determinado requiere recursos sustanciales para calcular la distancia entre el vector de consulta y los vectores almacenados en la tabla. La búsqueda de todos los vectores cerca de un vector de consulta determinado implica un examen completo de la tabla y un uso significativo de la CPU. Esto se denomina consulta "K-Vecinos más cercanos" o "KNN" y devuelve los vectores más cercanos "k".

Los vectores se usan para buscar datos similares para los modelos de inteligencia artificial para responder a las consultas de usuario. Esto implica consultar la base de datos para los vectores "k" más cercanos al vector de consulta utilizando métricas de distancia como el producto punto, la similitud de coseno o la distancia euclidiana.

Las consultas KNN suelen tener problemas con la escalabilidad, lo que hace que sea aceptable en muchos casos sacrificar algo de precisión, especialmente el recuerdo, a cambio de mejoras significativas en la velocidad. Este método se conoce como Vecinos más cercanos aproximados (ANN).

La recuperación es un concepto importante que debería ser familiar para todos los usuarios que usan o planean usar vectores e incrustaciones. De hecho, la medida de recall evalúa la proporción de vecinos más cercanos aproximados que son identificados por el algoritmo, en comparación con los vecinos más cercanos exactos que una búsqueda exhaustiva devolvería. Por lo tanto, es una buena medida de la calidad de la aproximación que está haciendo el algoritmo. Una recuperación perfecta, que es equivalente a ninguna aproximación, es 1.

En el caso de las aplicaciones de inteligencia artificial, el equilibrio es bastante razonable. Dado que las incrustaciones de vectores ya son aproximaciones de conceptos, el uso de una red neuronal artificial (ANN) no afecta significativamente a los resultados, siempre que la tasa de recuperación esté cerca de 1. Esto garantiza que los resultados devueltos sean muy similares a los de KNN, al tiempo que ofrece un rendimiento muy mejorado y un uso de recursos considerablemente reducido, lo que resulta muy beneficioso para las bases de datos operativas.

Es importante comprender que el término "índice" cuando se usa al hacer referencia a un índice vectorial tiene un significado diferente al índice con el que se usa para trabajar en bases de datos relacionales. De hecho, un índice vectorial devuelve resultados aproximados.

En el motor MSSQL, los índices vectoriales se basan en el algoritmo DiskANN . DiskANN se basa en la creación de un grafo para navegar rápidamente por todos los vectores indexados para encontrar la coincidencia más cercana a un vector determinado. DiskANN es un sistema basado en grafos para indexar y buscar grandes conjuntos de datos vectoriales mediante recursos computacionales limitados. Usa de forma eficaz SSDs y memoria mínima para manejar significativamente más datos que los índices en memoria, a la vez que mantiene altas tasas de consultas por segundo (QPS) y baja latencia, y garantiza un equilibrio entre el uso de memoria, CPU y entrada/salida y el rendimiento de la búsqueda.

Primero se puede realizar una búsqueda utilizando el algoritmo de vecinos más cercanos aproximados mediante el comando T-SQL CREATE VECTOR INDEX y luego usar la función T-SQL VECTOR_SEARCH para ejecutar la búsqueda aproximada.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance