Udostępnij przez


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

Dotyczy: SQL Server 2025 (17.x)

Począwszy od programu SQL Server 2025 (17.x), można określić podstawowy typ danych wektora . Domyślnie wektor używa float32 jako podstawowego typu. float16 (połowa precyzji) jest alternatywnym typem scenariuszy, w których mniejsza precyzja jest akceptowalna. Oferuje bardziej kompaktowa alternatywę, zmniejszając ilość miejsca do magazynowania i zwiększając wydajność.

Wektor zmiennoprzecinkowy o półprecyzji jest tablicą lub zbiorem liczb, w którym każda liczba jest reprezentowana przy użyciu 16-bitowego formatu o półprecyzji zmiennoprzecinkowej (float16). Ta reprezentacja zużywa połowę pamięci standardowego 32-bitowego zmiennoprzecinkowego o pojedynczej precyzji. Użyj tych typów wektorów, aby zaoszczędzić pamięć i przepustowość, zwłaszcza w przypadku uczenia głębokiego i baz danych wektorowych, poświęcając nieco precyzji na rzecz wydajności.

Oferuje znaczne zalety magazynowania i wydajności, ale float16 zapewnia ograniczoną precyzję liczbową w porównaniu z float32. Ten kompromis sprawia, że jest dobrze dopasowana do przybliżonych scenariuszy podobieństwa, takich jak wyszukiwanie semantyczne, ale mniej odpowiedni dla zadań wymagających arytmetyki o wysokiej precyzji lub dokładnej wierności liczbowej.

Najważniejsze zalety obsługi float16

  • Zwiększona obsługa wymiarów

    Program SQL Server obsługuje wektory z maksymalnie 3996 wymiarami (1998 × 2) w przypadku korzystania z programu float16. Ta funkcja podwaja ograniczenie 1998 wymiarów dla elementu float32. Ta funkcja umożliwia bardziej wyraziste osadzanie i zgodność z większymi modelami, na przykład text-embedding-large.

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

    Przechowywanie wektorów w formacie 16-bitowym znacznie zmniejsza ilość miejsca potrzebnego do magazynowania w porównaniu z wektorami o pełnej precyzji. Dzięki temu można przechowywać i wykonywać zapytania o wektory wielowymiarowe na dużą skalę. Ta optymalizacja zwiększa również gęstość danych, co może zwiększyć wydajność zapytań w scenariuszach wyszukiwania wektorów.

  • Wydajność magazynowania i kontrola precyzji

    Wybierz najbardziej odpowiedni typ podstawowy:

    • float16 do kompaktowego przechowywania
    • float32 do zadań ogólnego użytku lub wymagających wysokiej precyzji

    Ta elastyczność zapewnia optymalne użycie zasobów bez naruszania dokładności aplikacji.

Przykładowa składnia

Składnia użycia jest podobna do typu danych wektorowych . Jednak aby użyć float16, jawnie określ typ podstawowy.

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

Dostępność funkcji

float16 wektor jest obecnie dostępny dla wersji zapoznawczej. Aby przetestować, włącz PREVIEW_FEATURES opcję konfiguracji z zakresem dla bazy danych. Aby uzyskać szczegółowe informacje, przejrzyj PREVIEW_FEATURES = { ON | WYŁĄCZONE }. float16 wektory są obecnie przesyłane jako varchar(max) (tablica JSON) za pośrednictwem TDS. Obsługa float16 transportu binarnego nie jest obecnie dostępna.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Przykłady

Zdefiniuj kolumnę wektoraCREATE TABLE w deklaracji, używając domyślnego typu podstawowego lub jawnego.

Domyślnie podstawowy typ to float32.

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

Aby użyć połowy precyzji, określ float16 jawnie.

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

Poniższy przykład tworzy tabelę z kolumną wektorów zmiennoprzecinkowych o pół precyzji i wstawia do niej dane.

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

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, takie jak float16 (na przykład powyżej 65504.0), powodują błąd podczas przypisywania.

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

float16 nie jest obsługiwana w architekturach Arm64 i jej używanie zgłasza błąd środowiska uruchomieniowego

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

Program SQL Server Management Studio (SSMS) obecnie nie rozróżnia float32 i float16 w interfejsie użytkownika. Użyj sys.columns , aby potwierdzić rzeczywisty typ podstawowy używany w schemacie.

Obsługa transportu binarnego dla wektorów float16 nie jest jeszcze dostępna

float16 wektory są obecnie przesyłane jako varchar(max) (tablica JSON) za pośrednictwem TDS. Obsługa float16 transportu binarnego nie jest jeszcze dostępna w sterownikach, takich jak ODBC, JDBC i .NET.

Uwaga / Notatka

Wszystkie ograniczenia dotyczące domyślnego typu wektora (z float32) mają również zastosowanie do VECTOR(float16).