Prise en charge du flottant à demi-précision dans le type de données vector

S'applique à : SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceBase de données SQL dans Microsoft Fabric

Le type de données vectoriel prend en charge un type de base optionnel. Par défaut, Vector utilise float32. Vous pouvez spécifier float16 (demi-précision) lorsque la réduction de la précision est acceptable. Float16 offre une représentation plus compacte qui peut réduire le stockage et améliorer les performances.

Un vecteur à virgule flottante à demi-précision est un tableau de nombres dans lequel chaque nombre utilise le format float virgule flottante de 16 bits. Cette représentation utilise la moitié du stockage du format float32 32 bits. Utilisez float16 pour réduire la mémoire et la consommation de mémoire pour des charges de travail telles que les embeddings, la recherche sémantique et l’apprentissage automatique.

Float16 offre une précision numérique moindre et une plage numérique plus petite que float32. Ce compromis rend float16 adapté aux scénarios de similarité approximative, mais moins adapté aux charges de travail nécessitant une arithmétique de haute précision ou une fidélité numérique exacte.

Syntax

Pour utiliser des valeurs de demi-précision, spécifiez float16 comme type de base vectorielle :

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

Si vous omettez <base_type>, le défaut est float32.

Principaux avantages de float16

  • Dimensionnalité accrue

    Le SQL Moteur de base de données prend en charge des vecteurs allant jusqu’à 3 996 dimensions avec float16, contre 1 998 dimensions avec float32. Les dimensions supplémentaires supportent les embeddings générés par des modèles produisant plus de 1 998 valeurs.

  • Réduction de l’encombrement du stockage et de la mémoire

    Le stockage d’éléments vectoriels dans un format 16 bits réduit la capacité de stockage nécessaire par rapport à float32. Cette réduction rend pratique le stockage et l’interrogation de vecteurs de haute dimension à grande échelle.

  • Efficacité du stockage et contrôle de précision

    Choisissez le type de base qui convient à la charge de travail :

    • Utilisez float16 pour un stockage compact lorsque la réduction de la précision est acceptable.
    • Utilisez float32 pour un usage général et des charges de travail nécessitant plus de précision.

Disponibilité des fonctionnalités

  • Les vecteurs demi-précision (float16) sont généralement disponibles dans Azure SQL Database, Azure SQL Managed Instance et SQL Database dans Microsoft Fabric. Aucune configuration de prévisualisation n’est requise.

  • Les vecteurs demi-précision (float16) sont disponibles en aperçu dans SQL Server 2025. Activez l’option de configuration délimitée à la base de données PREVIEW_FEATURES avant d’utiliser VECTOR(..., float16). Pour plus d’informations, voir PREVIEW_FEATURES = { ON | OFF }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Examples

R : Définir les colonnes vectorielles

L’exemple suivant définit des colonnes séparées qui utilisent le type de base par défaut float32 et le type explicite de base 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. Stocker et comparer les vecteurs float16

L’exemple suivant crée une table avec une colonne vectorielle float16 , insère des données d’échantillon, et utilise VECTOR_DISTANCE pour trouver les trois vecteurs les plus proches :

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;

Note

Un indice vectoriel nécessite au moins 100 lignes avec des valeurs vectorielles non NULL. Pour des exigences et des exemples, voir CREATE VECTOR INDEX.

C. Inspecter les métadonnées de type de base vectorielle

La requête suivante confirme le type de base réel et les dimensions d’une colonne vectorielle :

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

Colonnes de sortie :

  • vector_dimensions: nombre de dimensions définies pour le vecteur.

  • vector_base_type: code numérique interne pour le type de base :

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: description lisible par l’homme du type de base.

Prise en charge des conversions implicite et explicite

SQL Server prend en charge la conversion implicite et explicite à partir de chaînes varchar, nvarchar et json en VECTOR(<dimension_count>, float16), à condition que le vecteur soit déclaré avec un nombre de dimensions explicite.

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 conversion implicite est prise en charge uniquement lorsque le type de vecteur cible est entièrement déclaré.

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

Scénarios non pris en charge ou sujets aux erreurs

Les exemples suivants mettent en évidence les erreurs et limitations courantes lors de l’utilisation du type de données de vecteur float demi-précision dans SQL Server.

Conversion explicite et implicite entre les types de base float32 et float16

SQL Server ne prend actuellement pas en charge la conversion implicite entre VECTOR(float32) et VECTOR(float16).

En outre, la conversion explicite à l’aide CAST ou CONVERT est actuellement bloquée.

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

L’erreur suivante est retournée :

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

Incompatibilité des dimensions

La conversion entre vecteurs avec des dimensions incompatibles n’est pas autorisée et génère une erreur d’incompatibilité de dimension.

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

L’erreur suivante est retournée :

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

Gestion des valeurs Null

Si un vecteur est déclaré sans nombre de dimensions, l’affectation d’une valeur à celle-ci génère une erreur.

Cet exemple fonctionne :

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

Toutefois, si le nombre de dimensions n’est pas spécifié, il génère une erreur :

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

Valeurs en dehors de la plage autorisée

Les valeurs hors plage pour float16 (par exemple, les valeurs supérieures à 65504.0) génèrent une erreur lors de l’affectation.

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

L’erreur suivante est retournée :

Input JSON contains out-of-range values for float16

Types de base mixtes dans les fonctions

Les types de base mixtes dans les fonctions comme VECTOR_DISTANCE ne sont pas pris en charge et déclenchent une erreur de type.

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

L’erreur suivante est retournée :

VECTOR_DISTANCE does not support different base types

Architecture non prise en charge

Les architectures Arm64 ne supportent pas float16. Utiliser ce type provoque une erreur d’exécution.

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

L’erreur suivante est retournée :

float16 is not supported on ARM64 architecture

Dépassement de capacité SIMD

Les opérations basées sur une seule instruction et plusieurs données (SIMD), telles qu’AVX2 ou SSE4.2, peuvent produire des erreurs de dépassement si les valeurs dépassent les plages représentables.

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

SELECT VECTOR_NORM(@v, 'norm1');

Le comportement dépend du ARITHABORT paramètre :

  • ARITHABORT ON entraîne une erreur
  • ARITHABORT OFF a pour résultat NULL

Prise en charge des outils

SQL Server Management Studio (SSMS) ne fait actuellement pas de distinction entre float32 et float16 dans l'interface utilisateur. Interrogez sys.columns pour confirmer le type de base utilisé par une colonne vectorielle.

Support des pilotes

Les pilotes suivants prennent en charge le transport binaire natif pour les vecteurs float16 :

Utilisez ces versions de pilotes ou ultérieures pour envoyer et recevoir des vecteurs float16 en format binaire natif. Les pilotes qui ne prennent pas en charge le transport natif de float16 peuvent fonctionner avec des vecteurs représentés sous forme de varchar(max) tableaux JSON.

Note

Toutes les limitations qui s’appliquent au type de vecteur par défaut avec le type de base float32 s’appliquent également à VECTOR(..., float16), sauf indication contraire.