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

Si applica a: SQL Server 2025 (17.x)

A partire da SQL Server 2025 (17.x), è possibile specificare il tipo di base sottostante per il tipo di dati vector . Per impostazione predefinita, vector usa float32 come tipo di base. float16 (precisione a metà) è un tipo alternativo per gli scenari in cui la precisione ridotta è accettabile. Offre un'alternativa più compatta riducendo lo spazio di archiviazione e migliorando le prestazioni.

Un vettore a virgola mobile a metà precisione è una matrice o una raccolta di numeri, in cui ogni numero viene rappresentato usando un formato a virgola mobile () a metà precisione a 16 bit (float16). Questa rappresentazione utilizza metà della memoria di un float a precisione singola standard a 32 bit. Usare questi tipi di vettore per risparmiare memoria e larghezza di banda, in particolare nei database di deep learning e vettoriali, scambiando una certa precisione per l'efficienza.

Sebbene float16 offra vantaggi significativi per l'archiviazione e le prestazioni, offre una precisione numerica ridotta rispetto a float32. Questo compromesso lo rende adatto per scenari di somiglianza approssimativi, ad esempio la ricerca semantica, ma meno appropriato per i carichi di lavoro che richiedono una fedeltà aritmetica o esatta aritmetica ad alta precisione.

Vantaggi principali del supporto float16

  • Maggiore supporto per la dimensionalità

    SQL Server supporta vettori con dimensioni fino a 3.996 (1998 × 2) quando si usa float16. Questa funzione raddoppia il limite di 1.998 dimensioni per float32. Questa funzionalità consente incorporamenti più espressivi e compatibilità con modelli di dimensioni maggiori, ad esempio text-embedding-large.

  • Riduzione dell'archiviazione e del footprint di memoria

    L'archiviazione dei vettori in un formato a 16 bit riduce significativamente la quantità di spazio di archiviazione necessaria rispetto ai vettori a precisione completa. In questo modo è possibile archiviare ed eseguire query su vettori altamente dimensionali su larga scala. Questa ottimizzazione migliora anche la densità dei dati, che può migliorare le prestazioni delle query negli scenari di ricerca vettoriale.

  • Efficienza di archiviazione e controllo della precisione

    Scegliere il tipo di base più appropriato:

    • float16 per archiviazione compatta
    • float32 per attività di utilizzo generico e precisione più elevata

    Questa flessibilità garantisce un utilizzo ottimale delle risorse senza compromettere l'accuratezza dell'applicazione.

Sintassi di esempio

La sintassi di utilizzo è simile al tipo di dati vector . Tuttavia, per usare float16, specificare il tipo di base in modo esplicito.

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

Disponibilità delle funzionalità

float16 vector è attualmente disponibile per l'anteprima. Per testare, abilitare l'opzione PREVIEW_FEATURES di configurazione con ambito database. Per informazioni dettagliate, vedere PREVIEW_FEATURES = { ON | OFF }. float16 i vettori sono attualmente trasmessi come varchar(max) (matrice JSON) su TDS. Il supporto del trasporto binario per float16 non è attualmente disponibile.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Esempi

Definire una colonna vettoriale in un'istruzione CREATE TABLE usando il tipo di base predefinito o uno esplicito.

Per impostazione predefinita, il tipo di base è float32.

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

Per usare mezza precisione, specificare float16 in modo esplicito.

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

Nell'esempio seguente viene creata una tabella con una colonna vettore di float a mezza precisione e vengono inseriti i dati.

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

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 out-of-range per float16 (ad esempio, sopra la 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

float16 non è supportato nelle architetture arm64 e l'uso genera 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. Usare sys.columns per confermare il tipo di base effettivo usato in uno schema.

Supporto del trasporto binario per vettori *float16* non ancora disponibile

float16 i vettori sono attualmente trasmessi come varchar(max) (matrice JSON) su TDS. Il supporto del trasporto binario per float16 non è ancora disponibile nei driver come ODBC, JDBC e .NET.

Annotazioni

Tutte le limitazioni che si applicano al tipo di vettore predefinito (con float32) si applicano anche a VECTOR(float16).