Obsługa zmiennoprzecinkowa o połowie precyzji w typie danych wektorowych

Dotyczy: SQL Server 2025 (17.x) Azure SQL DatabaseAzure SQL Managed InstanceBaza danych SQL w Microsoft Fabric

Typ danych wektorowych obsługuje opcjonalny typ bazowy. Domyślnie wektor używa float32. Możesz określić float16 (półprecyzję), gdy zmniejszona precyzja jest akceptowalna. float16 zapewnia bardziej zwartą reprezentację, która może zmniejszyć pamięć i poprawić wydajność.

Wektor zmiennoprzecinkowy o półprecyzji to tablica liczb, w której każda liczba używa 16-bitowego formatu zmiennoprzecinkowego float16 . Ta reprezentacja wykorzystuje połowę pamięci w porównaniu z 32-bitowym formatem float32 . Użyj float16, aby zmniejszyć zużycie miejsca na dane i pamięci w przypadku takich obciążeń jak wektorowe reprezentacje, wyszukiwanie semantyczne i uczenie maszynowe.

Float16 zapewnia mniejszą precyzję numeryczną i mniejszy zakres liczbowy niż float32. Ten kompromis sprawia, że float16 nadaje się do scenariuszy przybliżonego podobieństwa, ale mniej do zadań wymagających wysokiej precyzji arytmetyki lub dokładnej wierności liczbowej.

Syntax

Aby użyć wartości o półprecyzji, określ float16 jako typ bazy wektora:

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

Jeśli pominiesz <base_type>, domyślnie jest float32.

Kluczowe zalety float16

  • Zwiększona wymiarowość

    SQL Database Engine obsługuje wektory o wymiarach do 3 996 przy użyciu float16, w porównaniu do 1 998 wymiarów przy float32. Dodatkowe wymiary wspierają osadzenia generowane przez modele generujące ponad 1 998 wartości.

  • Zmniejszona ilość miejsca do magazynowania i pamięci

    Przechowywanie elementów wektorowych w formacie 16-bitowym zmniejsza wymaganą pamięć w porównaniu do float32. Ta redukcja sprawia, że praktyczne staje się przechowywanie i wykonywanie zapytań na wysokowymiarowych wektorach na dużą skalę.

  • Wydajność magazynowania i kontrola precyzji

    Wybierz typ bazowy odpowiedni dla danego obciążenia:

    • Używaj float16 do kompaktowego przechowywania, gdy akceptowalna jest niższa precyzja.
    • Używaj float32 do ogólnego użytku i zadań wymagających większej precyzji.

Dostępność funkcji

  • Wektory półprecyzyjne (float16) są zazwyczaj dostępne w Azure SQL Database, Azure SQL Managed Instance oraz bazie danych SQL w Microsoft Fabric. Nie jest wymagana konfiguracja podglądowa.

  • Wektory o półprecyzji (float16) są dostępne w podglądzie w SQL Server 2025. Włącz opcję konfiguracji o zakresie bazy danych PREVIEW_FEATURES przed użyciem VECTOR(..., float16). Więcej informacji można znaleźć w PREVIEW_FEATURES = { ON | OFF }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Przykłady

Odp. Zdefiniuj kolumny wektorowe

Poniższy przykład definiuje oddzielne kolumny wykorzystujące domyślny typ bazy float32 oraz jawny typ bazy float16 :

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

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

B. Przechowuj i porównaj wektory float16

Poniższy przykład tworzy tabelę z kolumną wektorową float16 , wstawia dane próbki i wykorzystuje VECTOR_DISTANCE do znalezienia trzech najbliższych wektorów:

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;

Uwaga / Notatka

Indeks wektorowy wymaga co najmniej 100 wierszy o wartościach wektorowych niebędących NULL. Wymagania i przykłady można znaleźć w CREATE VECTOR INDEX.

C. Sprawdzanie metadanych typu podstawowego wektora

Następujące zapytanie potwierdza rzeczywisty typ podstawowy i wymiary kolumny wektora :

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

Kolumny wyjściowe:

  • vector_dimensions: liczba wymiarów zdefiniowanych dla wektora.

  • vector_base_type: Wewnętrzny kod liczbowy dla typu podstawowego:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: czytelny dla człowieka opis typu podstawowego.

Obsługiwana niejawna i jawna konwersja

Program SQL Server obsługuje zarówno niejawną , jak i jawną konwersję z ciągów varchar, nvarchar i json na VECTOR(<dimension_count>, float16), o ile wektor jest zadeklarowany z jawną liczbą wymiarów.

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

Konwersja niejawna jest obsługiwana tylko wtedy, gdy typ wektora docelowego jest w pełni zadeklarowany.

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

Nieobsługiwane lub podatne na błędy scenariusze

W poniższych przykładach przedstawiono typowe błędy i ograniczenia podczas pracy z typem danych wektorów zmiennoprzecinkowych o połowie precyzji w programie SQL Server.

Jawna i niejawna konwersja między typami podstawowymi float32 i float16

Program SQL Server obecnie nie obsługuje niejawnej konwersji między VECTOR(float32) i VECTOR(float16).

Ponadto jawna konwersja przy użyciu CAST lub CONVERT jest obecnie blokowana.

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

Zwracany jest następujący błąd:

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

Niezgodność wymiarów

Konwersja między wektorami z niezgodnymi wymiarami nie jest dozwolona i zgłasza błąd niezgodności wymiaru.

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

Zwracany jest następujący błąd:

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

Obsługa wartości null

Jeśli wektor jest zadeklarowany bez liczby wymiarów, przypisanie do niej wartości powoduje wystąpienie błędu.

Ten przykład działa:

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

Jeśli jednak liczba wymiarów nie jest określona, zgłasza błąd:

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

Wartości poza zakresem

Wartości poza zakresem dla float16 (na przykład powyżej 65504.0) powodują błąd podczas przypisania.

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

Zwracany jest następujący błąd:

Input JSON contains out-of-range values for float16

Mieszane typy bazowe w funkcjach

Mieszane typy podstawowe w funkcjach, takich jak VECTOR_DISTANCE, nie są obsługiwane i powodują błąd typu.

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

Zwracany jest następujący błąd:

VECTOR_DISTANCE does not support different base types

Nieobsługiwana architektura

Architektury arm64 nie obsługują float16. Użycie tego typu powoduje błąd w czasie wykonywania.

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

Zwracany jest następujący błąd:

float16 is not supported on ARM64 architecture

Przepełnienie SIMD

Pojedyncza instrukcja, wiele operacji opartych na danych (SIMD), takich jak AVX2 lub SSE4.2, może powodować błędy przepełnienia, jeśli wartości przekraczają możliwe do reprezentowania zakresy.

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

SELECT VECTOR_NORM(@v, 'norm1');

Zachowanie zależy ARITHABORT od ustawienia:

  • ARITHABORT ON powoduje wystąpienie błędu
  • ARITHABORT OFF wyniki w NULL

Obsługa narzędzi

SQL Server Management Studio (SSMS) obecnie nie rozróżnia float32 od float16 w interfejsie użytkownika. Wykonaj zapytanie do sys.columns, aby potwierdzić typ bazowy używany w kolumnie wektorowej.

Obsługa sterowników

Następujące sterowniki wspierają natywny transport binarny dla wektorów float16 :

Używaj tych wersji sterowników lub nowszych, aby wysyłać i odbierać wektory float16 w natywnym formacie binarnym. Sterowniki, które nie obsługują natywnego transportu float16 , mogą pracować z wektorami reprezentowanymi jako varchar(max) macierze JSON.

Uwaga / Notatka

Wszystkie ograniczenia dotyczące domyślnego typu wektora z bazowym typem float32 dotyczą VECTOR(..., float16)również , chyba że zaznaczono inaczej.