Delen via


Ondersteuning voor halve-precisie floats in vectorgegevenstype

Van toepassing op: SQL Server 2025 (17.x) Preview

Vanaf SQL Server 2025 (17.x) Preview kunt u het onderliggende basistype voor het vectorgegevenstype opgeven. Vector gebruikt float32 standaard als basistype. float16 (halve precisie) is een alternatief type voor scenario's waarbij verminderde precisie acceptabel is. Het biedt een compacter alternatief door de opslag te verminderen en de prestaties te verbeteren.

Een drijvendekommavector met halve precisie is een verzameling getallen, waarbij elk getal wordt voorgesteld met een 16-bits drijvendekommaformaat (float16). Deze weergave verbruikt de helft van het geheugen van een standaard 32-bits float met één precisie. Gebruik deze vectortypen om geheugen en bandbreedte te besparen, met name in deep learning- en vectordatabases, door enige precisie af te handelen voor efficiëntie.

Hoewel float16 het aanzienlijke voordelen biedt voor opslag en prestaties, biedt het een verminderde numerieke precisie in vergelijking met float32. Deze afweging maakt het zeer geschikt voor benaderingsscenario's met overeenkomsten, zoals semantische zoekopdrachten, maar minder geschikt voor workloads waarvoor rekenkundige of exacte numerieke nauwkeurigheid is vereist.

Belangrijkste voordelen van float16-ondersteuning

  • Verbeterde dimensionaliteitsondersteuning

    SQL Server ondersteunt vectoren met maximaal 3996 dimensies (1998 × 2) bij gebruik float16. Deze functie verdubbelt de beperking van 1998 dimensies voor float32. Deze mogelijkheid maakt expressieve insluitingen en compatibiliteit met grotere modellen mogelijk, bijvoorbeeld text-embedding-large.

  • Verminderde opslag- en geheugenvoetafdruk

    Het opslaan van vectoren in een 16-bits indeling vermindert de hoeveelheid opslagruimte die nodig is in vergelijking met vectoren met volledige precisie. Dit maakt het mogelijk om high-dimensionale vectoren op schaal op te slaan en op te vragen. Deze optimalisatie verbetert ook de gegevensdichtheid, wat de queryprestaties in vectorzoekscenario's kan verbeteren.

  • Efficiëntie en precisiebeheer van opslag

    Kies het meest geschikte basistype:

    • float16 voor compacte opslag
    • float32 voor algemene gebruikstaken en hogere precisietaken

    Deze flexibiliteit zorgt voor optimaal resourcegebruik zonder afbreuk te doen aan de nauwkeurigheid van toepassingen.

Voorbeeldsyntaxis

De syntaxis van het gebruik is vergelijkbaar met het gegevenstype vector . Als u echter wilt gebruiken float16, geeft u het basistype expliciet op.

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

Beschikbaarheid van functies

float16 vector is momenteel beschikbaar voor preview. Als u wilt testen, schakelt u de configuratieoptie voor databasebereik PREVIEW_FEATURES in. Raadpleeg PREVIEW_FEATURES = { AAN | UIT }.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Voorbeelden

Definieer een vectorkolom in een CREATE TABLE instructie met behulp van het standaardbasistype of een expliciet basistype.

Standaard is float32het basistype .

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

Als u halve precisie wilt gebruiken, moet u float16 expliciet opgeven.

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

In het volgende voorbeeld wordt een tabel gemaakt met een half-precision float- vectorkolom en worden er gegevens in ingevoegd.

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

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 JSON = '[1.0, 2.0, 3.0]';
DECLARE @v VECTOR(3, float16);
SET @v = CAST(@j AS VECTOR(3, float16)); -- Explicit conversion from JSON to float16

DECLARE @v1 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = CAST(@v1 AS VECTOR(3, float16)); -- Explicit conversion from VARCHAR to float16

DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 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 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1;

-- Implicit conversion from NVARCHAR to float16
DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1

--From JSON_ARRAY to VECTOR
DECLARE @v3 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 VECTOR(3, float16);
DECLARE @v2 VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
SET @v1 = CAST(@v2 AS VECTOR(3, float16)); -- Explicit conversion from float32 to float16
-- ❌ 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 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(4, float16) = NULL;
SET @v1 = @v2;
-- 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.

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

--However, if the dimension count is not specified, it raises an error
DECLARE @v1 VECTOR(float16) = NULL;
DECLARE @v2 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

Waarden buiten bereik

Waarden buiten het bereik voor float16 (bijvoorbeeld boven 65504.0) veroorzaken een fout tijdens de toewijzing.

DECLARE @v VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
-- Error: 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 VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: VECTOR_DISTANCE does not support different base types

Niet-ondersteunde architectuur

float16 wordt niet ondersteund in Arm64-architecturen en het gebruik ervan veroorzaakt een runtimefout

DECLARE @v1 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, int) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: float16 is not supported on ARM64 architecture

SIMD-overflow

Bewerkingen op basis van SIMD (bijvoorbeeld AVX2, SSE4.2) kunnen overloopfouten opleveren als waarden de vertegenwoordigbare bereiken overschrijden.

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

SELECT VECTOR_NORM(@v, 'norm1');
-- Behavior depends on ARITHABORT setting:
--     ARITHABORT ON  → Error
--     ARITHABORT OFF → NULL

Ondersteuning voor hulpmiddelen

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

Binaire transportondersteuning voor float16 vectoren nog niet beschikbaar

float16 vectoren worden momenteel verzonden als varchar(max) (JSON-matrix) via TDS. Binaire transportondersteuning voor float16 is nog niet beschikbaar in stuurprogramma's zoals ODBC, JDBC en .NET.

Opmerking

Alle beperkingen die van toepassing zijn op het standaardvectortype (met float32) zijn ook van toepassing op VECTOR(float16).