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

S’applique à : SQL Server 2025 (17.x)

À compter de SQL Server 2025 (17.x), vous pouvez spécifier le type de base sous-jacent pour le type de données vectorielles . Par défaut, vector utilise float32 comme type de base. float16 (demi-précision) est un autre type pour les scénarios où la précision réduite est acceptable. Il offre une alternative plus compacte en réduisant le stockage et en améliorant les performances.

Un vecteur à virgule flottante en demi-précision est un tableau ou une collection de nombres, où chaque nombre est représenté en utilisant un format de 16 bits (float16). Cette représentation consomme la moitié de la mémoire d’un float simple précision 32 bits standard. Utilisez ces types de vecteurs pour économiser de la mémoire et de la bande passante, en particulier dans les bases de données d’apprentissage profond et de vecteur, en échangeant une certaine précision pour l’efficacité.

Bien qu’il float16 offre des avantages significatifs en matière de stockage et de performances, il offre une précision numérique réduite par rapport à float32. Ce compromis convient parfaitement aux scénarios de similarité approximative, tels que la recherche sémantique, mais moins approprié pour les charges de travail nécessitant une arithmétique haute précision ou une fidélité numérique exacte.

Principaux avantages de la prise en charge de float16

  • Prise en charge améliorée de la dimensionnalité

    SQL Server prend en charge les vecteurs avec jusqu’à 3 996 dimensions (1998 × 2) lors de l’utilisation float16. Cette fonctionnalité double la limitation de 1 998 dimensions pour float32. Cette capacité permet des représentations plus expressives et une compatibilité avec des modèles plus volumineux, par exemple text-embedding-large.

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

    Le stockage de vecteurs dans un format 16 bits diminue considérablement la quantité de stockage requise par rapport aux vecteurs de précision complète. Cela permet de stocker et d’interroger des vecteurs à grande dimension à grande échelle. Cette optimisation améliore également la densité des données, ce qui peut améliorer les performances des requêtes dans les scénarios de recherche vectorielle.

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

    Choisissez le type de base le plus approprié :

    • float16 pour le stockage compact
    • float32 pour les tâches d’utilisation générale et plus précises

    Cette flexibilité garantit une utilisation optimale des ressources sans compromettre la précision de l’application.

Exemple de syntaxe

La syntaxe d’utilisation est similaire au type de données vectorielles . Toutefois, pour utiliser float16, spécifiez explicitement le type de base.

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

Disponibilité des fonctionnalités

float16 vector est actuellement disponible en aperçu. Pour tester, activez l’option de configuration au niveau de la PREVIEW_FEATURES base de données. Pour plus d’informations, consultez PREVIEW_FEATURES = { ON | OFF }. float16 Les vecteurs sont actuellement transmis sous forme de varchar(max ) (tableau JSON) sur TDS. La prise en charge du transport binaire pour float16 n’est actuellement pas disponible.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Examples

Définissez une colonne vectorielle dans une CREATE TABLE instruction à l’aide du type de base par défaut ou d’une colonne explicite.

Par défaut, le type de base est float32.

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

Pour utiliser la demi-précision, spécifiez float16 explicitement.

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

L’exemple suivant crée une table avec une colonne de vecteur float demi-précision et insère des données dans celle-ci.

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

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 du 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, au-dessus de 65504.0) déclenchent une erreur pendant 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

float16 n’est pas pris en charge sur les architectures Arm64 et l’utilisation de celle-ci génère 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 résultats dans NULL

Prise en charge des outils

SQL Server Management Studio (SSMS) ne fait actuellement pas la distinction entre float32 et float16 dans l’interface utilisateur. Permet sys.columns de confirmer le type de base réel utilisé dans un schéma.

Prise en charge du transport binaire pour les vecteurs float16 non encore disponibles

float16 Les vecteurs sont actuellement transmis sous forme de varchar(max ) (tableau JSON) sur TDS. La prise en charge du transport binaire pour float16 n'est pas encore prise en charge par des pilotes tels qu'ODBC, JDBC et .NET.

Note

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