Unterstützung von Halbpräzisions-Float im Vektordatentyp

Gilt für: SQL Server 2025 (17.x) Azure SQL-DatenbankAzure SQL Managed InstanceSQL-Datenbank in Microsoft Fabric

Der Vektordatentyp unterstützt einen optionalen Basistyp. Standardmäßig verwendet VectorFloat32. Man kann float16 (Halbpräzision) angeben, wenn reduzierte Präzision akzeptabel ist. float16 bietet eine kompaktere Darstellung, die den Speicher reduzieren und die Leistung verbessern kann.

Ein halbpräziser Gleitkommavektor ist ein Zahlenarray, bei dem jede Zahl das 16-Bit-Gleitkommaformat verwendet. Diese Darstellung benötigt die Hälfte des Speichers des 32-Bit-float32-Formats. Verwenden Sie float16 , um den Speicher- und Speicherverbrauch für Workloads wie Embeddings, semantische Suche und maschinelles Lernen zu reduzieren.

float16 bietet weniger numerische Präzision und einen kleineren numerischen Bereich als float32. Dieser Kompromiss macht Float16 für ungefähre Ähnlichkeitsszenarien geeignet, aber weniger geeignet für Arbeitslasten, die hochpräzise Arithmetik oder exakte numerische Genauigkeit erfordern.

Syntax

Um halbpräzise Werte zu verwenden, gib float16 als Vektorbasistyp an:

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

Wenn du weglässt <base_type>, ist der Standard float32.

Wichtige Vorteile von float16

  • Erhöhte Dimensionalität

    Die SQL Datenbank-Engine unterstützt Vektoren mit bis zu 3.996 Dimensionen bei Verwendung von float16, verglichen mit 1.998 Dimensionen bei float32. Die zusätzlichen Dimensionen unterstützen Embeddings, die von Modellen generiert werden, die mehr als 1.998 Werte erzeugen.

  • Reduzierter Speicher- und Speicherbedarf

    Das Speichern von Vektorelementen in einem 16-Bit-Format reduziert den Speicherbedarf im Vergleich zu float32. Diese Reduktion macht es praktikabel, hochdimensionale Vektoren in großem Maßstab zu speichern und abzufragen.

  • Speichereffizienz und Präzisionssteuerung

    Wählen Sie den Basistyp, der für die Arbeitslast geeignet ist:

    • Verwenden Sie Float16 für kompakte Lagerung, wenn eine reduzierte Präzision akzeptabel ist.
    • Nutze float32 für allgemeine Zwecke und Arbeitslasten, die größere Präzision erfordern.

Verfügbarkeit von Funktionen

  • Halbpräzisionsvektoren (float16) sind im Allgemeinen in Azure SQL-Datenbank, Azure SQL Managed Instance und SQL Database in Microsoft Fabric verfügbar. Eine Vorschaukonfiguration ist nicht erforderlich.

  • Halbpräzisionsvektoren (float16) sind in der Vorschau in SQL Server 2025 verfügbar. Aktivieren Sie die PREVIEW_FEATURES datenbankbezogene Konfigurationsoption, bevor Sie VECTOR(..., float16) verwenden. Für weitere Informationen siehe PREVIEW_FEATURES = { AN | AUS }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Examples

A. Definiere Vektorspalten

Das folgende Beispiel definiert separate Spalten, die den Standard-Basistyp float32 und den expliziten Basistyp float16 verwenden:

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

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

B. Float16-Vektoren speichern und vergleichen

Das folgende Beispiel erstellt eine Tabelle mit einer Float16-Vektorspalte , fügt Beispieldaten ein und verwendet VECTOR_DISTANCE es, um die drei nächstgelegenen Vektoren zu finden:

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;

Hinweis

Ein Vektorindex benötigt mindestens 100 Zeilen mit nicht-NULL-Vektorwerten. Für Anforderungen und Beispiele siehe CREATE VECTOR INDEX.

C. Ü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

Außerhalb des Normbereichs liegende Werte für Float16 (zum Beispiel Werte über 65504,0) verursachen während der Zuweisung einen Fehler.

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

Arm64-Architekturen unterstützen float16 nicht. Die Verwendung dieses Typs verursacht einen Laufzeitfehler.

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

Vorgänge, die auf einer einzelnen Anweisung und mehreren Daten basieren (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. Fragen Sie sys.columns ab, um den von einer Vektorspalte verwendeten Basisdatentyp zu ermitteln.

Treiberunterstützung

Die folgenden Treiber unterstützen den nativen Binärtransport für float16-Vektoren :

Verwenden Sie diese Treiberversionen oder später, um float16-Vektoren im nativen Binärformat zu senden und zu empfangen. Treiber, die den nativen float16-Transport nicht unterstützen, können mit Vektoren arbeiten, die als varchar(max) JSON-Arrays dargestellt werden.

Hinweis

Alle Einschränkungen, die für den Standardvektortyp mit dem float32-Basistyp gelten, gelten auch für VECTOR(..., float16), sofern nicht anders angegeben.