Supporto a virgola mobile a metà precisione nel tipo di dati vettoriali

Si applica a: SQL Server 2025 (17.x) Database SQL di AzureIstanza gestita di SQL di AzureDatabase SQL in Microsoft Fabric

Il tipo di dati vettoriale supporta un tipo base opzionale. Di default, Vector utilizza float32. Puoi specificare float16 (mezza precisione) quando è accettabile una precisione ridotta. Float16 fornisce una rappresentazione più compatta che può ridurre lo storage e migliorare le prestazioni.

Un vettore in virgola mobile a mezza precisione è un array di numeri in cui ogni numero utilizza il formato in virgola mobile float16 a 16 bit. Questa rappresentazione utilizza metà della memoria del formato float32 a 32 bit. Utilizza float16 per ridurre il consumo di archiviazione e memoria per carichi di lavoro come embedding, ricerca semantica e machine learning.

Float16 offre una precisione numerica inferiore e un intervallo numerico più ridotto rispetto a Float32. Questo compromesso rende float16 adatto a scenari di similarità approssimativa, ma meno adatto a carichi di lavoro che richiedono aritmetica ad alta precisione o fedeltà numerica esatta.

Syntax

Per usare valori a mezza precisione, specifica float16 come tipo base vettoriale:

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

Se ometti <base_type>, il predefinito è float32.

Principali benefici di float16

  • Aumento della dimensionalità

    Il SQL motore di database supporta vettori fino a 3.996 dimensioni usando float16, rispetto a 1.998 dimensioni usando float32. Le dimensioni aggiuntive supportano embedding generati da modelli che producono più di 1.998 valori.

  • Riduzione dell'archiviazione e del footprint di memoria

    Memorizzare elementi vettoriali in un formato a 16 bit riduce la memoria richiesta rispetto a float32. Questa riduzione rende pratico memorizzare e interrogare vettori ad alta dimensione su larga scala.

  • Efficienza di archiviazione e controllo della precisione

    Scegli il tipo base più adatto al carico di lavoro:

    • Usa float16 per uno stoccaggio compatto quando è accettabile una precisione ridotta.
    • Usa float32 per l'uso generale e per carichi di lavoro che richiedono maggiore precisione.

Disponibilità delle funzionalità

  • I vettori a mezza precisione (float16) sono generalmente disponibili in database SQL di Azure, Istanza gestita di SQL di Azure e database SQL in Microsoft Fabric. Non è richiesta alcuna configurazione di anteprima.

  • I vettori a mezza precisione (float16) sono disponibili in anteprima in SQL Server 2025. Abilita l'opzione PREVIEW_FEATURES di configurazione con ambito del database prima di usare VECTOR(..., float16). Per maggiori informazioni, vedi PREVIEW_FEATURES = { ON | OFF }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Esempi

A. Definisci colonne vettoriali

Il seguente esempio definisce colonne separate che utilizzano il tipo base predefinito float32 e il tipo base esplicito float16 :

CREATE TABLE dbo.Float32Vectors
(
    id int PRIMARY KEY,
    VectorColumn vector(3)
);

CREATE TABLE dbo.Float16Vectors
(
    id int PRIMARY KEY,
    VectorColumn vector(3, float16)
);

B. Memorizzare e confrontare i vettori float16

Il seguente esempio crea una tabella con una colonna vettoriale float16 , inserisce dati campioni e utilizza VECTOR_DISTANCE per trovare i tre vettori più vicini:

CREATE TABLE dbo.Articles
(
    id int PRIMARY KEY,
    title nvarchar(100),
    content nvarchar(max),
    embedding vector(5, float16)
);

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

DECLARE @QueryVector vector(5, float16) =
    '[0.3, 0.3, 0.3, 0.3, 0.3]';

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

Annotazioni

Un indice vettoriale richiede almeno 100 righe con valori vettoriali non NULL. Per requisiti ed esempi, vedi CREATE VECTOR INDEX.

C. Esaminare i metadati del tipo di base vettoriale

La query seguente conferma il tipo di base e le dimensioni effettive di una colonna vettoriale :

--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');

Colonne di output:

  • vector_dimensions: numero di dimensioni definite per il vettore.

  • vector_base_type: codice numerico interno per il tipo di base:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: descrizione leggibile del tipo di base.

Conversione implicita e esplicita supportata

SQL Server supporta sia la conversione implicita che esplicita da stringhe varchar, nvarchar e json a VECTOR(<dimension_count>, float16), purché il vettore venga dichiarato con un conteggio delle dimensioni esplicito.

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 conversione implicita è supportata solo quando il tipo di vettore di destinazione è completamente dichiarato.

-- 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);

Scenari non supportati o soggetti a errori

Negli esempi seguenti vengono evidenziati errori e limitazioni comuni quando si usa il tipo di dati float vector a metà precisione in SQL Server.

Conversione esplicita e implicita tra i tipi di base float32 e float16

SQL Server attualmente non supporta la conversione implicita tra VECTOR(float32) e VECTOR(float16).

Inoltre, la conversione esplicita con CAST o CONVERT è attualmente bloccata.

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

Viene restituito l'errore seguente:

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

Mancata corrispondenza delle dimensioni

La conversione tra vettori con dimensioni non corrispondenti non è consentita e genera un errore di mancata corrispondenza della dimensione.

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

Viene restituito l'errore seguente:

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

Gestione dei valori Null

Se un vettore viene dichiarato senza un conteggio delle dimensioni, l'assegnazione di un valore a esso genera un errore.

Questo esempio funziona:

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

Tuttavia, se il conteggio delle dimensioni non viene specificato, genera un errore:

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

Valori non compresi nell'intervallo

I valori fuori dalla gamma per float16 (ad esempio, valori superiori a 65504.0) generano un errore durante l'assegnazione.

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

Viene restituito l'errore seguente:

Input JSON contains out-of-range values for float16

Tipi di base misti nelle funzioni

I tipi di base misti nelle funzioni come VECTOR_DISTANCE non sono supportati e generano un errore di 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);

Viene restituito l'errore seguente:

VECTOR_DISTANCE does not support different base types

Architettura non supportata

Le architetture Arm64 non supportano float16. L'uso di questo tipo causa un errore di runtime.

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);

Viene restituito l'errore seguente:

float16 is not supported on ARM64 architecture

Overflow di SIMD

Operazioni basate su istruzione singola, dati multipli (SIMD), ad esempio AVX2 o SSE4.2, possono causare errori di overflow se i valori superano gli intervalli rappresentabili.

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

SELECT VECTOR_NORM(@v, 'norm1');

Il comportamento dipende dall'impostazione ARITHABORT :

  • ARITHABORT ON genera un errore
  • ARITHABORT OFF risultati in NULL

Supporto degli strumenti

SQL Server Management Studio (SSMS) attualmente non distingue tra float32 e float16 nell'interfaccia utente. Consulta sys.columns per confermare il tipo base usato da una colonna vettoriale.

Supporto per i driver

I seguenti driver supportano il trasporto binario nativo per i vettori float16 :

Utilizzare queste versioni del driver o successive per inviare e ricevere vettori float16 in formato binario nativo. I driver che non supportano il trasporto nativo float16 possono lavorare con vettori rappresentati come varchar(max) array JSON.

Annotazioni

Tutte le limitazioni che si applicano al tipo vettoriale predefinito con il tipo base float32 si applicano anche a VECTOR(..., float16), salvo diversa indicazione.