Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 usafloat16. Questa funzione raddoppia il limite di 1.998 dimensioni perfloat32. Questa funzionalità consente incorporamenti più espressivi e compatibilità con modelli di dimensioni maggiori, ad esempiotext-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:
-
float16per archiviazione compatta -
float32per 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=float321=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 ONgenera un errore -
ARITHABORT OFFrisultati inNULL
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).