Implementación de patrones de consulta de búsqueda vectorial
Con los vectores almacenados y una estrategia de búsqueda elegida, está listo para escribir consultas. En esta unidad se describen las funciones de T-SQL que impulsan la búsqueda vectorial y se muestra cómo combinarlas de manera eficaz.
Las consultas de búsqueda vectorial siguen un patrón común: genere o recupere un vector de consulta, calcule las distancias a los vectores almacenados y devuelva las coincidencias más cercanas. SQL Server proporciona cuatro funciones que funcionan conjuntamente para admitir este patrón: VECTOR_DISTANCE, VECTOR_SEARCH, VECTOR_NORMALIZEy VECTORPROPERTY.
Calcular distancias con VECTOR_DISTANCE
La VECTOR_DISTANCE función calcula la distancia entre dos vectores mediante la métrica que especifique. Esta función realiza la búsqueda de vecinos más cercanos de manera exacta, calculando la distancia a cada fila que califica. En términos prácticos, compara la inserción de búsqueda con cada inserción almacenada para encontrar cuáles son más similares, como comprobar cada producto de un catálogo para encontrar las mejores coincidencias.
VECTOR_DISTANCE(metric, vector1, vector2)
La métrica debe ser 'cosine', 'euclidean'o 'dot'. Ambos vectores deben tener el mismo número de dimensiones.
Este es un patrón típico para buscar productos similares en función de la inserción de una descripción:
-- Generate an embedding for the user's search phrase
DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);
SELECT TOP 10
ProductID,
Name,
VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;
Esta consulta funciona en dos pasos. En primer lugar, convierte la frase de búsqueda "botas ligeras de senderismo" en una inserción con el mismo modelo que creó los valores almacenados DescriptionVector . En segundo lugar, calcula la distancia de coseno entre @searchVector y DescriptionVector de cada fila. La ORDER BY Distance cláusula ordena los resultados de la distancia más pequeña (más similar) a mayor y TOP 10 devuelve solo las primeras 10 filas. Dado que las distancias más pequeñas significan vectores más similares, esta combinación proporciona los 10 productos más semánticamente relacionados con "botas ligeras de senderismo".
También puede usar VECTOR_DISTANCE en una cláusula WHERE para buscar todos los vectores dentro de un umbral de distancia específico:
SELECT ProductID, Name
FROM dbo.Products
WHERE VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) < 0.3
ORDER BY VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector);
Este enfoque busca todos los productos dentro de un umbral de similitud en lugar de devolver un recuento fijo. El valor 0.3 aquí es solo un ejemplo. La distancia de coseno oscila entre 0 (vectores idénticos) y 2 (completamente opuestos), pero lo que cuenta como "lo suficientemente similar" depende completamente de los datos y del modelo de incrustación. Para encontrar el umbral correcto, ejecute consultas de prueba, examine los valores de distancia de los resultados e identifique dónde se detienen los resultados pertinentes y comienza el ruido. Use este patrón cuando quiera que todo cumpla una barra de calidad en lugar de un número fijo de resultados.
Uso de VECTOR_SEARCH para la recuperación aproximada
Cuando la tabla crece más allá de decenas de miles de filas, calcular distancias en cada fila se ralentiza. La VECTOR_SEARCH función usa un índice vectorial para buscar rápidamente vecinos más cercanos aproximados.
VECTOR_SEARCH(
TABLE = object AS alias,
COLUMN = vector_column,
SIMILAR_TO = query_vector,
METRIC = 'cosine' | 'euclidean' | 'dot',
TOP_N = k
)
Esta función devuelve un conjunto de resultados que contiene todas las columnas de la tabla de origen más una distance columna. Este es el modo en que lo usaría:
DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);
SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
TABLE = dbo.Products AS t,
COLUMN = DescriptionVector,
SIMILAR_TO = @searchVector,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance;
La función devuelve los 10 vecinos más cercanos aproximadamente. Si existe un índice vectorial coincidente en DescriptionVector con la misma métrica, VECTOR_SEARCH lo utiliza para una recuperación rápida. Sin un índice, retorna a la búsqueda exacta y emite una advertencia.
Controlar cuidadosamente el filtrado posterior
VECTOR_SEARCH aplica cualquier condición de la cláusula WHERE después de encontrar los vecinos más cercanos, no antes. Considere esta consulta:
SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
TABLE = dbo.Products AS t,
COLUMN = DescriptionVector,
SIMILAR_TO = @searchVector,
METRIC = 'cosine',
TOP_N = 10
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;
Esta consulta busca primero los 10 vectores más cercanos en todas las categorías y, a continuación, filtra solo a la categoría 5. Si ninguno de los 10 productos más cercanos está en la categoría 5, no obtendrá ningún resultado. Para solucionar este problema, solicite más candidatos de los que necesita:
SELECT TOP 10 t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
TABLE = dbo.Products AS t,
COLUMN = DescriptionVector,
SIMILAR_TO = @searchVector,
METRIC = 'cosine',
TOP_N = 50
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;
Al solicitar 50 candidatos de VECTOR_SEARCH y luego tomar los 10 primeros después de aplicar el filtro, es más probable que obtenga suficientes resultados en la categoría objetivo.
Normalizar vectores para comparaciones coherentes
Los diferentes modelos de inserción producen vectores con diferentes longitudes (magnitudes). Al comparar vectores de varios orígenes o cuando el modelo no normaliza las salidas, puede usar VECTOR_NORMALIZE para escalar vectores a longitud unitaria.
VECTOR_NORMALIZE(vector, norm_type)
norm_type puede ser:
-
'norm2': norma euclidiana (más común) -
'norm1': suma de valores absolutos -
'norminf': valor absoluto máximo
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORMALIZE(@v, 'norm2') AS NormalizedVector;
-- Returns: [0.6, 0.8, 0.0]
La normalización garantiza que la distancia de coseno y el producto escalar se comporten de forma coherente. La mayoría de los modelos de inserción modernos (como los de OpenAI) producen vectores normalizados, por lo que a menudo no necesita este paso. Pero si está trabajando con incrustaciones de modelos que no se normalizan, aplicar VECTOR_NORMALIZE antes de almacenar o comparar garantiza puntuaciones de similitud coherentes.
Puede calcular la magnitud de un vector mediante la función relacionada VECTOR_NORM :
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORM(@v, 'norm2') AS Magnitude;
-- Returns: 5.0
Inspección de vectores con VECTORPROPERTY
La VECTORPROPERTY función devuelve metadatos sobre un vector. Estos metadatos son útiles para validar datos o depurar discrepancias de dimensiones.
VECTORPROPERTY(vector, property)
Se admiten dos propiedades:
-
'Dimensions': devuelve el número de dimensiones como un entero. -
'BaseType': devuelve el nombre del tipo de datos (actualmente siemprefloat)
DECLARE @v VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT VECTORPROPERTY(@v, 'Dimensions') AS Dims;
-- Returns: 1536
Esta función ayuda a solucionar problemas de consultas en las que los vectores podrían tener dimensiones no coincidentes, un problema común cuando se usan modelos de inserción diferentes.
Elección de la función adecuada para su escenario
Cada función sirve para un propósito distinto en la búsqueda de vectores:
| Escenario | Función | Cuándo usar |
|---|---|---|
| Conjunto de datos pequeño o consultas filtradas | VECTOR_DISTANCE |
Menos de 50 000 vectores o cuando una cláusula WHERE reduce significativamente los candidatos |
| Conjunto de datos grande con índice vectorial | VECTOR_SEARCH |
Cientos de miles de vectores o más, cuando la velocidad importa |
| Comparación de vectores de diferentes modelos | VECTOR_NORMALIZE |
Cuando la inserción de orígenes varía o el modelo no produce vectores normalizados |
| Validación de datos vectoriales | VECTORPROPERTY |
Comprobación de dimensiones durante la solución de problemas o validación de datos |
Conclusiones clave
Las consultas de búsqueda vectorial en SQL siguen un patrón de predicción: prepare un vector de consulta, busque vecinos mediante VECTOR_DISTANCE (exacto) o VECTOR_SEARCH (aproximado) y ordene por distancia.
VECTOR_NORMALIZE y VECTORPROPERTY soportan la calidad y coherencia de los datos. Recuerde que VECTOR_SEARCH aplica filtros después de encontrar vecinos más cercanos, así que solicite más candidatos de los que necesita al combinarlo con cláusulas WHERE. En la unidad siguiente, aprenderá a combinar la búsqueda de vectores con búsqueda de texto completo en consultas híbridas.