Dela via


Stöd för halvprecisionsflöd i vektordatatyp

Gäller för: Förhandsversion av SQL Server 2025 (17.x)

Från och med förhandsversionen av SQL Server 2025 (17.x) kan du ange den underliggande bastypen för vektordatatypen . Som standard används float32 som bastyp. float16 (halvprecision) är en alternativ typ för scenarier där minskad precision är acceptabel. Det erbjuder ett mer kompakt alternativ genom att minska lagringen och förbättra prestandan.

En halvprecisions flyttalsvektor är en vektor eller samling av tal, där varje tal representeras med hjälp av ett flyttal med 16-bitars halvprecision (float16) format. Den här representationen förbrukar hälften av minnet för ett vanligt 32-bitars flyttal med enkel precision. Använd dessa vektortyper för att spara minne och bandbredd, särskilt i djupinlärnings- och vektordatabaser, genom att byta bort viss precision för effektivitet.

Även om float16 det ger betydande fördelar med lagring och prestanda ger det minskad numerisk precision jämfört med float32. Den här kompromissen gör den väl lämpad för ungefärliga likhetsscenarier, till exempel semantisk sökning, men mindre lämplig för arbetsbelastningar som kräver aritmetik med hög precision eller exakt numerisk återgivning.

Viktiga fördelar med float16-stöd

  • Stöd för ökad dimensionalitet

    SQL Server stöder vektorer med upp till 3 996 dimensioner (1998 × 2) när du använder float16. Den här funktionen dubblar begränsningen 1 998 dimensioner för float32. Den här funktionen möjliggör mer uttrycksfulla inbäddningar och kompatibilitet med större modeller, till exempel text-embedding-large.

  • Minskat fotavtryck för lagring och minne

    Lagring av vektorer i ett 16-bitarsformat minskar avsevärt mängden lagringsutrymme som krävs jämfört med vektorer med full precision. Detta gör det möjligt att lagra och köra frågor mot högdimensionella vektorer i stor skala. Den här optimeringen förbättrar också datadensiteten, vilket kan förbättra frågeprestanda i scenarier för vektorsökning.

  • Lagringseffektivitet och precisionskontroll

    Välj den lämpligaste bastypen:

    • float16 för kompakt lagring
    • float32 för allmän användning och uppgifter med högre precision

    Den här flexibiliteten säkerställer optimal resursanvändning utan att äventyra programmets noggrannhet.

Exempelsyntax

Användningssyntaxen liknar vektordatatypen . Dock, om du vill använda float16, anger du bastypen explicit.

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

Tillgänglighet av funktioner

float16 vektor är för närvarande tillgänglig för förhandsversion. Om du vill testa aktiverar du konfigurationsalternativet PREVIEW_FEATURES med databasomfattning. Mer information finns i PREVIEW_FEATURES = { ON | AV }.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Examples

Definiera en vektorkolumn i en CREATE TABLE instruktion med antingen standardbastypen eller en explicit.

Som standard är float32bastypen .

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

Om du vill använda halv precision anger du float16 explicit.

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

I följande exempel skapas en tabell med en halv precisionsflottavektorkolumn och infogar data i den.

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

Granska metadata för vektorbastyp

Följande fråga bekräftar den faktiska bastypen och dimensionerna för en vektorkolumn :

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

Utdatakolumner:

  • vector_dimensions: Antal dimensioner som definierats för vektorn.

  • vector_base_type: Intern numerisk kod för bastypen:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: Läsbar beskrivning av bastypen.

Implicit och explicit konvertering stöds

SQL Server stöder både implicit och explicit konvertering från varchar-, nvarchar- och json-strängar till VECTOR(<dimension_count>, float16), så länge vektorn deklareras med ett explicit dimensionsantal.

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

Implicit konvertering stöds endast när målvektortypen är helt deklarerad.

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

Scenarier som inte stöds eller är felbenägna

I följande exempel visas vanliga fel och begränsningar när man arbetar med datatypen halv precision flyttal vektor i SQL Server.

Explicit och implicit konvertering mellan bastyperna float32 och float16

SQL Server stöder för närvarande inte implicit konvertering mellan VECTOR(float32) och VECTOR(float16).

Dessutom är explicit konvertering med CAST eller CONVERT för närvarande blockerad.

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.

Dimensionsavvikelse

Konvertering mellan vektorer med felmatchade dimensioner tillåts inte och ger upphov till ett matchningsfel för dimensionen.

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

Null-hantering

Om en vektor deklareras utan dimensionsantal uppstår ett fel när du tilldelar ett värde till den.

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;

Värden utanför intervallet

Out-of-range-värden för float16 (till exempel över 65504.0) genererar ett fel under tilldelningen.

DECLARE @v VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
-- Error: Input JSON contains out-of-range values for float16

Blandade bastyper i funktioner

Blandade bastyper i funktioner som VECTOR_DISTANCE inte stöds och skapar ett typfel.

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

Arkitektur som inte stöds

float16 stöds inte i Arm64-arkitekturer, och om du använder den genereras ett körningsfel

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-överflöd

SIMD-baserade åtgärder (till exempel AVX2, SSE4.2) kan generera spillfel om värdena överskrider visningsbara intervall.

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

Verktygsstöd

SQL Server Management Studio (SSMS) skiljer för närvarande inte mellan float32 och float16 i användargränssnittet. Använd sys.columns för att bekräfta den faktiska bastypen som används i ett schema.

Stöd för binär transport för float16-vektorer är ännu inte tillgängligt

float16 vektorer överförs för närvarande som varchar(max) (JSON-matris) över TDS. Stöd för binär transport för float16 är ännu inte tillgängligt i drivrutiner som ODBC, JDBC och .NET.

Anmärkning

Alla begränsningar som gäller för standardvektortypen (med float32) gäller även för VECTOR(float16).