Unterstützung von Halbpräzisions-Float im Vektordatentyp

Gilt für: SQL Server 2025 (17.x)

Ab SQL Server 2025 (17.x) können Sie den zugrunde liegenden Basistyp für den Vektordatentyp angeben. Standardmäßig wird der Vektor als Basistyp verwendet float32 . float16 (Halbgenauigkeit) ist ein alternativer Typ für Szenarien, in denen eine geringere Genauigkeit akzeptabel ist. Es bietet eine kompaktere Alternative, indem der Speicher reduziert und die Leistung verbessert wird.

Ein Gleitkommavektor mit halber Präzision ist ein Array oder eine Sammlung von Zahlen, wobei jede Zahl im 16-Bit Gleitkommaformat mit halber Präzision (float16) dargestellt wird. Diese Darstellung verbraucht die Hälfte des Arbeitsspeichers eines standardmäßigen 32-Bit-Gleitkommawerts mit einfacher Genauigkeit. Verwenden Sie diese Vektortypen, um Speicher und Bandbreite zu sparen, insbesondere in Deep Learning- und Vektordatenbanken, indem Sie eine gewisse Genauigkeit für Effizienz abhandeln.

Während float16 es erhebliche Speicher- und Leistungsvorteile bietet, bietet es eine reduzierte numerische Genauigkeit im Vergleich zu float32. Dieser Kompromiss eignet sich gut für ungefähre Ähnlichkeitsszenarien, z. B. die semantische Suche, aber weniger geeignet für Arbeitslasten, die eine präzise Arithmetik oder genaue numerische Genauigkeit erfordern.

Wichtige Vorteile der Float16-Unterstützung

  • Unterstützung für erhöhte Dimensionalität

    SQL Server unterstützt Vektoren mit bis zu 3.996 Dimensionen (1998 × 2) bei Verwendung float16. Dieses Feature verdoppelt die Beschränkung auf 1.998 Dimensionen für float32. Diese Funktion ermöglicht ausdrucksstärkere Einbettungen und Kompatibilität mit größeren Modellen, zum Beispiel text-embedding-large.

  • Reduzierter Speicher- und Speicherbedarf

    Durch das Speichern von Vektoren im 16-Bit-Format wird die erforderliche Speichermenge im Vergleich zu Vektoren mit voller Genauigkeit erheblich verringert. Dadurch ist es möglich, hochdimensionale Vektoren im Maßstab zu speichern und abzufragen. Diese Optimierung verbessert auch die Datendichte, wodurch die Abfrageleistung in Vektorsuchszenarien verbessert werden kann.

  • Speichereffizienz und präzise Steuerung

    Wählen Sie den am besten geeigneten Basistyp aus:

    • float16 für kompakten Speicher
    • float32 für allgemeine Verwendungsaufgaben und höhere Genauigkeitsaufgaben

    Durch diese Flexibilität wird eine optimale Ressourcenauslastung gewährleistet, ohne die Anwendungsgenauigkeit zu beeinträchtigen.

Beispielsyntax

Die Verwendungssyntax ähnelt dem Vektordatentyp . Geben Sie für die Verwendung float16jedoch explizit den Basistyp an.

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

Verfügbarkeit von Funktionen

float16 Vektor ist zurzeit für die Vorschau verfügbar. Aktivieren Sie zum Testen die Konfigurationsoption für den PREVIEW_FEATURES Datenbankbereich. Details erhalten Sie unter PREVIEW_FEATURES = { ON | OFF }. float16 Vektoren werden derzeit als varchar(max) (JSON-Array) über TDS übertragen. Die Unterstützung des binären Transports für float16 den binären Transport ist derzeit nicht verfügbar.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Examples

Definieren Sie eine Vektorspalte in einer CREATE TABLE Anweisung entweder mithilfe des Standardbasistyps oder eines expliziten.

Standardmäßig ist float32der Basistyp .

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

Wenn Sie eine halbe Genauigkeit verwenden möchten, geben Sie explizit an float16 .

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

Im folgenden Beispiel wird eine Tabelle mit halber Genauigkeit float-Vektorspalte erstellt und Daten in die Tabelle eingefügt.

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

Überprüfen der Metadaten des Vektorbasistyps

Die folgende Abfrage bestätigt den tatsächlichen Basistyp und die Abmessungen einer Vektorspalte :

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

Ausgabespalten:

  • vector_dimensions: Anzahl der dimensionen, die für den Vektor definiert sind.

  • vector_base_type: Interner numerischer Code für den Basistyp:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: Lesbare Beschreibung des Basistyps.

Unterstützte implizite und explizite Konvertierung

SQL Server unterstützt sowohl implizite als auch explizite Konvertierungen von varchar-, nvarchar- und json-Zeichenfolgen in VECTOR(<dimension_count>, float16), solange der Vektor mit einer expliziten Dimensionsanzahl deklariert wird.

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

Implizite Konvertierung wird nur unterstützt, wenn der Zielvektortyp vollständig deklariert wird.

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

Nicht unterstützte oder fehleranfällige Szenarien

In den folgenden Beispielen werden häufige Fehler und Einschränkungen beim Arbeiten mit dem Gleitkommavektortyp mit halber Genauigkeit in SQL Server hervorgehoben.

Explizite und implizite Konvertierung zwischen Basistypen float32 und float16

SQL Server unterstützt derzeit keine implizite Konvertierung zwischen VECTOR(float32) und VECTOR(float16).

Darüber hinaus wird die explizite Konvertierung mit CAST oder CONVERT zurzeit blockiert.

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

Der folgende Fehler wird zurückgegeben:

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

Nichtübereinstimmung von Dimensionen

Die Konvertierung zwischen Vektoren mit nicht übereinstimmenden Dimensionen ist nicht zulässig und löst einen Dimensionsfehler aus.

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

Der folgende Fehler wird zurückgegeben:

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

Nullbehandlung

Wenn ein Vektor ohne Bemaßungsanzahl deklariert wird, löst das Zuweisen eines Werts einen Fehler aus.

Dieses Beispiel funktioniert:

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

Wenn die Dimensionsanzahl jedoch nicht angegeben ist, wird ein Fehler ausgelöst:

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

außerhalb der zulässigen Werte

Out-of-Range-Werte für float16 (z. B. über 65504,0) lösen einen Fehler während der Zuordnung aus.

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

Der folgende Fehler wird zurückgegeben:

Input JSON contains out-of-range values for float16

Gemischte Basistypen in Funktionen

Gemischte Basistypen in Funktionen wie VECTOR_DISTANCE werden nicht unterstützt und löst einen Typfehler aus.

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

Der folgende Fehler wird zurückgegeben:

VECTOR_DISTANCE does not support different base types

Nicht unterstützte Architektur

float16 wird für Arm64-Architekturen nicht unterstützt, und die Verwendung löst einen Laufzeitfehler aus.

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

Der folgende Fehler wird zurückgegeben:

float16 is not supported on ARM64 architecture

SIMD-Überlauf

Einzelne Anweisungen für mehrere Daten (SIMD), wie AVX2 oder SSE4.2, können Überlauffehler erzeugen, wenn die Werte über die darstellbaren Bereiche hinausgehen.

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

SELECT VECTOR_NORM(@v, 'norm1');

Das Verhalten hängt von der ARITHABORT Einstellung ab:

  • ARITHABORT ON führt zu einem Fehler.
  • ARITHABORT OFF ergibt NULL

Unterstützung von Tools

SQL Server Management Studio (SSMS) unterscheidet derzeit nicht zwischen float32 und float16 in der Benutzeroberfläche. Wird sys.columns verwendet, um den tatsächlichen Basistyp zu bestätigen, der in einem Schema verwendet wird.

Unterstützung des binären Transports für float16-Vektoren noch nicht verfügbar

float16 Vektoren werden derzeit als varchar(max) (JSON-Array) über TDS übertragen. Die Unterstützung für den binären Transport von float16 in Treibern wie ODBC, JDBC und .NET ist noch nicht verfügbar.

Hinweis

Alle Einschränkungen, die für den Standardvektortyp gelten (mit float32) gelten auch für VECTOR(float16).