Compatibilidad con coma flotante de media precisión en el tipo de datos vectorial

Se aplica a: SQL Server 2025 (17.x)

A partir de SQL Server 2025 (17.x), puede especificar el tipo base subyacente para el tipo de datos vectorial . De forma predeterminada, el vector usa float32 como tipo base. float16 (precisión media) es un tipo alternativo para escenarios en los que se acepta una precisión reducida. Ofrece una alternativa más compacta al reducir el almacenamiento y mejorar el rendimiento.

Un vector de punto flotante de precisión media es una matriz o colección de números, donde cada número se representa mediante un formato de punto flotante de precisión media () de 16 bits (float16). Esta representación consume la mitad de la memoria de un float estándar de precisión única de 32 bits. Use estos tipos de vectores para ahorrar memoria y ancho de banda, especialmente en bases de datos de aprendizaje profundo y vectores, al intercambiar cierta precisión para mejorar la eficacia.

Aunque float16 ofrece importantes ventajas de almacenamiento y rendimiento, proporciona una precisión numérica reducida en comparación con float32. Esta compensación hace que sea adecuado para escenarios aproximados de similitud, como la búsqueda semántica, pero menos adecuado para las cargas de trabajo que exigen una fidelidad numérica exacta o aritmética de alta precisión.

Ventajas clave de la compatibilidad con float16

  • Aumento del soporte para la dimensionalidad

    SQL Server admite vectores con hasta 3996 dimensiones (1998 × 2) al usar float16. Esta característica duplica la limitación de 1998 dimensiones para float32. Esta funcionalidad permite incrustaciones más expresivas y compatibilidad con modelos más grandes, por ejemplo text-embedding-large.

  • Reducción de la superficie de almacenamiento y memoria

    El almacenamiento de vectores en un formato de 16 bits reduce significativamente la cantidad de almacenamiento necesario en comparación con los vectores de precisión completa. Esto hace que sea factible almacenar y consultar vectores de alta dimensión a escala. Esta optimización también mejora la densidad de datos, lo que puede mejorar el rendimiento de las consultas en escenarios de búsqueda vectorial.

  • Eficiencia del almacenamiento y control de precisión

    Elija el tipo base más adecuado:

    • float16 para almacenamiento compacto
    • float32 para tareas de uso general y de mayor precisión

    Esta flexibilidad garantiza un uso óptimo de los recursos sin poner en peligro la precisión de la aplicación.

Sintaxis de ejemplo

La sintaxis de uso es similar al tipo de datos vectorial . Sin embargo, para usar float16, especifique explícitamente el tipo base.

column_name VECTOR ( <dimensions> [, <base_type>] ) [ NOT NULL | NULL ]

Disponibilidad de funcionalidades

float16 vector está actualmente disponible para vista previa. Para probarlo, habilite la PREVIEW_FEATURES opción de configuración con ámbito de base de datos. Para obtener más información, revise PREVIEW_FEATURES = { ON | OFF }. float16 Los vectores se transmiten actualmente como varchar(max) (matriz JSON) a través de TDS. La compatibilidad con el transporte binario para float16 no está disponible actualmente.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Examples

Defina una columna vector en una CREATE TABLE instrucción utilizando ya sea el tipo base predeterminado o uno explícito.

De forma predeterminada, el tipo base es float32.

-- Default: float32
CREATE TABLE ExampleTable
(
    id INT PRIMARY KEY,
    VectorColumn VECTOR(3)
);

Para usar la precisión media, especifique float16 explícitamente.

-- Explicit float16
CREATE TABLE ExampleTable
(
    id INT PRIMARY KEY,
    VectorColumn VECTOR(3, float16)
);

En el ejemplo siguiente se crea una tabla con una columna de vector float de precisión media y se insertan datos en ella.

-- Step 0: Enable Preview Features
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

-- Step 1: Create a Table with a VECTOR(5, float16) Column
CREATE TABLE dbo.Articles
(
    id INT PRIMARY KEY,
    title NVARCHAR(100),
    content NVARCHAR(MAX),
    embedding VECTOR(5, float16)
);

-- Step 2: Insert Sample Data
INSERT INTO Articles (id, title, content, embedding)
VALUES
    (1, 'Intro to AI', 'This article introduces AI concepts.', '[0.1, 0.2, 0.3, 0.4, 0.5]'),
    (2, 'Deep Learning', 'Deep learning is a subset of ML.', '[0.2, 0.1, 0.4, 0.3, 0.6]'),
    (3, 'Neural Networks', 'Neural networks are powerful models.', '[0.3, 0.3, 0.2, 0.5, 0.1]'),
    (4, 'Machine Learning Basics', 'ML basics for beginners.', '[0.4, 0.5, 0.1, 0.2, 0.3]'),
    (5, 'Advanced AI', 'Exploring advanced AI techniques.', '[0.5, 0.4, 0.6, 0.1, 0.2]');

-- Step 3: Perform a Vector Similarity Search Using VECTOR_DISTANCE function
DECLARE @v AS VECTOR(5, float16) = '[0.3, 0.3, 0.3, 0.3, 0.3]';

SELECT TOP (3)
    id,
    title,
    VECTOR_DISTANCE('cosine', @v, embedding) AS distance
FROM dbo.Articles
ORDER BY distance;

-- Step 4: Optionally Create a Vector Index
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (
    metric = 'cosine',
    type = 'diskANN'
);

-- Step 5: Perform a Vector Similarity Search
DECLARE @qv AS VECTOR(5, float16) = '[0.3, 0.3, 0.3, 0.3, 0.3]';

SELECT
    t.id,
    t.title,
    t.content,
    s.distance
FROM
VECTOR_SEARCH(
    table = Articles AS t,
    column = embedding,
    similar_to = @qv,
    metric = 'cosine',
    top_n = 3
) AS s
ORDER BY s.distance, t.title;

Inspección de metadatos de tipo base vectorial

La consulta siguiente confirma el tipo base real y las dimensiones de una columna vectorial :

--Inspect Vector Base type Metadata in sys.columns
SELECT name AS column_name,
       system_type_id,
       user_type_id,
       vector_dimensions,
       vector_base_type,
       vector_base_type_desc
FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.Articles');

Columnas de salida:

  • vector_dimensions: número de dimensiones definidas para el vector.

  • vector_base_type: código numérico interno para el tipo base:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: descripción legible del tipo base.

Admitida conversión implícita y explícita

SQL Server admite la conversión implícita y explícita de cadenas varchar, nvarchar y json en VECTOR(<dimension_count>, float16), siempre y cuando el vector se declare con un recuento de dimensiones explícito.

DECLARE @j AS JSON = '[1.0, 2.0, 3.0]';
DECLARE @v AS VECTOR(3, float16);
SET @v = CAST (@j AS VECTOR(3, float16)); -- Explicit conversion from JSON to float16

DECLARE @v1 AS VARCHAR (50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = CAST (@v1 AS VECTOR(3, float16)); -- Explicit conversion from VARCHAR to float16

DECLARE @v1 AS NVARCHAR (50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = CAST (@v1 AS VECTOR(3, float16)); -- Explicit conversion from NVARCHAR to float16

La conversión implícita solo se admite cuando el tipo de vector de destino está totalmente declarado.

-- Implicit conversion from VARCHAR to float16
DECLARE @v1 AS VARCHAR (50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = @v1;

-- Implicit conversion from NVARCHAR to float16
DECLARE @v1 AS NVARCHAR (50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16);
SET @v2 = @v1;

--From JSON_ARRAY to VECTOR
DECLARE @v3 AS VECTOR(3, float16) = JSON_ARRAY(1.0, 2.0, 3.0);

Escenarios no admitidos o propensos a errores

En los ejemplos siguientes se resaltan errores y limitaciones comunes al trabajar con el tipo de datos vector float de media precisión en SQL Server.

Conversión explícita e implícita entre los tipos base float32 y float16

ACTUALMENTE, SQL Server no admite la conversión implícita entre VECTOR(float32) y VECTOR(float16).

Además, la conversión explícita mediante CAST o CONVERT está bloqueada actualmente.

DECLARE @v1 AS VECTOR(3, float16);
DECLARE @v2 AS VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
SET @v1 = CAST (@v2 AS VECTOR(3, float16)); -- Explicit conversion from float32 to float16

Se devuelve el siguiente error:

Error: Msg 42238, Level 16, State 1, Line 61
Conversion of vector from data type float32 to float16 is not allowed.

Error de coincidencia de dimensiones

No se permite la conversión entre vectores con dimensiones no coincidentes y genera un error de coincidencia de dimensión.

DECLARE @v1 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(4, float16) = NULL;
SET @v1 = @v2;

Se devuelve el siguiente error:

Error: Msg 42204, Level 16, State 1, Line 10
The vector dimensions 4 and 3 do not match

Control nulo

Si un vector se declara sin un recuento de dimensiones, al asignarle un valor se produce un error.

Este ejemplo funciona:

DECLARE @v1 AS VECTOR(3, float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

Sin embargo, si no se especifica el recuento de dimensiones, genera un error:

DECLARE @v1 AS VECTOR(float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

Valores fuera de rango

Los valores fuera del intervalo para float16 (por ejemplo, por encima de 65504.0) generan un error durante la asignación.

DECLARE @v AS VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';

Se devuelve el siguiente error:

Input JSON contains out-of-range values for float16

Tipos base mixtos en funciones

Los tipos base mixtos en funciones como VECTOR_DISTANCE no se admiten y generan un error de tipo.

DECLARE @v1 AS VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, float16) = '[1, 2, 3]';

SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);

Se devuelve el siguiente error:

VECTOR_DISTANCE does not support different base types

Arquitectura no admitida

float16 no se admite en arquitecturas arm64 y su uso genera un error en tiempo de ejecución.

DECLARE @v1 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(3, int) = '[1, 2, 3]';

SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);

Se devuelve el siguiente error:

float16 is not supported on ARM64 architecture

Desbordamiento de SIMD

Una sola instrucción, varias operaciones basadas en datos (SIMD), como AVX2 o SSE4.2, pueden producir errores de desbordamiento si los valores superan los intervalos que se pueden representar.

DECLARE @v AS VECTOR(8) = '[-2.9e+38, ..., 2.9e+38]';

SELECT VECTOR_NORM(@v, 'norm1');

El comportamiento depende de la ARITHABORT configuración:

  • ARITHABORT ON da como resultado un error
  • ARITHABORT OFF da como resultado NULL

Compatibilidad con herramientas

SQL Server Management Studio (SSMS) no distingue actualmente entre float32 y float16 en la interfaz de usuario. Use sys.columns para confirmar el tipo base real usado en un esquema.

Compatibilidad con el transporte binario para vectores float16 aún no está disponible

float16 Los vectores se transmiten actualmente como varchar(max) (matriz JSON) a través de TDS. La compatibilidad con el transporte binario para float16 aún no está disponible en controladores como ODBC, JDBC y .NET.

Nota:

Todas las limitaciones que se aplican al tipo de vector predeterminado (con float32) también se aplican a VECTOR(float16).