Ondersteuning voor halve-precisie floats in vectorgegevenstype

Van toepassing op: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Het vectordatatype ondersteunt een optioneel basistype. Standaard gebruikt vectorfloat32. Je kunt float16 (half-precisie) specificeren wanneer verminderde precisie acceptabel is. float16 biedt een compactere weergave die opslag kan verminderen en de prestaties kan verbeteren.

Een half-precisie floating-point vector is een array van getallen waarbij elk getal het 16-bits floating-16 floating-point formaat gebruikt. Deze representatie gebruikt de helft van de opslag van het 32-bits float32-formaat . Gebruik float16 om het opslag- en geheugenverbruik te verminderen voor workloads zoals embeddings, semantisch zoeken en machine learning.

float16 biedt minder numerieke precisie en een kleiner numeriek bereik dan float32. Deze afweging maakt float16 geschikt voor scenario's met ongeveer gelijkenis, maar minder geschikt voor workloads die hoge precisie rekenkunde of exacte numerieke nauwkeurigheid vereisen.

Syntax

Om halfprecisiewaarden te gebruiken, specificeer float16 als vectorbasistype:

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

Als je weglaat <base_type>, is de standaard float32.

Belangrijkste voordelen van float16

  • Verhoogde dimensionaliteit

    De SQL Database Engine ondersteunt vectoren met maximaal 3.996 dimensies bij gebruik van float16, vergeleken met 1.998 dimensies bij gebruik van float32. De aanvullende dimensies ondersteunen embeddings die door modellen worden gegenereerd en meer dan 1.998 waarden produceren.

  • Verminderde opslag- en geheugenvoetafdruk

    Het opslaan van vectorelementen in een 16-bits formaat vermindert de benodigde opslag vergeleken met float32. Deze reductie maakt het praktisch om hoogdimensionale vectoren op schaal op te slaan en te bevragen.

  • Efficiëntie en precisiebeheer van opslag

    Kies het basistype dat geschikt is voor de werklast:

    • Gebruik float16 voor compacte opslag wanneer de verminderde precisie acceptabel is.
    • Gebruik float32 voor algemeen gebruik en workloads die meer precisie vereisen.

Beschikbaarheid van functies

  • Half-precision (float16) vectoren zijn over het algemeen beschikbaar in Azure SQL Database, Azure SQL Managed Instance en SQL database in Microsoft Fabric. Er is geen previewconfiguratie vereist.

  • Half-precision (float16) vectoren zijn beschikbaar in preview in SQL Server 2025. Schakel de configuratieoptie voor databereik PREVIEW_FEATURES in voordat je VECTOR(..., float16) gebruikt. Voor meer informatie, zie PREVIEW_FEATURES = { AAN | UIT }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Voorbeelden

Eén. Definieer vectorkolommen

Het volgende voorbeeld definieert aparte kolommen die het standaard float32-basistype en het expliciete float16-basistype gebruiken:

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

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

B. Sla float16-vectoren op en vergelijk ze

Het volgende voorbeeld maakt een tabel met een float16-vectorkolom , voegt voorbeeldgegevens in en gebruikt VECTOR_DISTANCE het om de drie dichtstbijzijnde vectoren te vinden:

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;

Opmerking

Een vectorindex vereist minstens 100 rijen met niet-NULL vectorwaarden. Voor vereisten en voorbeelden, zie CREATE VECTOR INDEX.

C. Metagegevens van vectorbasistype controleren

De volgende query bevestigt het werkelijke basistype en de afmetingen van een vectorkolom :

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

Uitvoerkolommen:

  • vector_dimensions: Het aantal dimensies dat is gedefinieerd voor de vector.

  • vector_base_type: Interne numerieke code voor het basistype:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: Leesbare beschrijving van het basistype.

Ondersteunde impliciete en expliciete conversie

SQL Server ondersteunt zowel impliciete als expliciete conversie van varchar-, nvarchar- en json-tekenreeksen naar VECTOR(<dimension_count>, float16), zolang de vector wordt gedeclareerd met een expliciet aantal dimensies.

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

Impliciete conversie wordt alleen ondersteund wanneer het doelvectortype volledig is gedeclareerd.

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

Niet-ondersteunde of foutgevoelige scenario's

In de volgende voorbeelden worden veelvoorkomende fouten en beperkingen gemarkeerd bij het werken met gegevenstype met een halve precisie float vector in SQL Server.

Expliciete en impliciete conversie tussen basistypen float32 en float16

SQL Server biedt momenteel geen ondersteuning voor impliciete conversie tussen VECTOR(float32) en VECTOR(float16).

Daarnaast is expliciete conversie met CAST of CONVERT momenteel geblokkeerd.

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

De volgende fout wordt geretourneerd:

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

Dimensie komt niet overeen

Conversie tussen vectoren met niet-overeenkomende dimensies is niet toegestaan en leidt tot een onjuiste dimensiefout.

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

De volgende fout wordt geretourneerd:

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

Nullverwerking

Als een vector wordt gedeclareerd zonder dimensieaantal, ontstaat er een fout wanneer er een waarde aan wordt toegekend.

Dit voorbeeld werkt:

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

Als het aantal dimensies echter niet is opgegeven, wordt er een fout gegenereerd:

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

Waarden buiten bereik

Waarden buiten bereik voor float16 (bijvoorbeeld waarden boven 65504,0) veroorzaken een fout tijdens de toewijzing.

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

De volgende fout wordt geretourneerd:

Input JSON contains out-of-range values for float16

Gemengde basistypen in functies

Gemengde basistypen in functies zoals VECTOR_DISTANCE worden niet ondersteund en veroorzaken een typefout.

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

De volgende fout wordt geretourneerd:

VECTOR_DISTANCE does not support different base types

Niet-ondersteunde architectuur

Arm64-architecturen ondersteunen float16 niet. Het gebruik van dit type veroorzaakt een runtime-fout.

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

De volgende fout wordt geretourneerd:

float16 is not supported on ARM64 architecture

SIMD-overflow

Eén instructie, op basis van meerdere gegevens (SIMD)-bewerkingen, zoals AVX2 of SSE4.2, kunnen overloopfouten veroorzaken als waarden groter zijn dan vertegenwoordigbare bereiken.

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

SELECT VECTOR_NORM(@v, 'norm1');

Het gedrag is afhankelijk van de ARITHABORT instelling:

  • ARITHABORT ON resulteert in een fout
  • ARITHABORT OFF resulteert in NULL

Ondersteuning voor hulpmiddelen

SQL Server Management Studio (SSMS) maakt momenteel geen onderscheid tussen float32 en float16 in de gebruikersinterface. Vraag sys.columns om het basistype te bevestigen dat door een vectorkolom wordt gebruikt.

Driverondersteuning

De volgende drivers ondersteunen native binair transport voor float16-vectoren :

Gebruik deze driverversies of hoger om float16-vectoren in systeemeigen binaire indeling te verzenden en te ontvangen. Drivers die geen native float16-transport ondersteunen, kunnen werken met vectoren die als varchar(max) JSON-arrays worden weergegeven.

Opmerking

Alle beperkingen die gelden voor het standaard vectortype met het float32-basistype gelden ook voor VECTOR(..., float16), tenzij anders vermeld.