Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 programufloat16. Ta funkcja podwaja ograniczenie 1998 wymiarów dla elementufloat32. Ta funkcja umożliwia bardziej wyraziste osadzanie i zgodność z większymi modelami, na przykładtext-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:
-
float16do kompaktowego przechowywania -
float32do 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=float321=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 ONpowoduje wystąpienie błędu -
ARITHABORT OFFwyniki wNULL
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).