適用於: SQL Server 2025 (17.x)
Azure SQL Database
Azure SQL 受控執行個體
Microsoft Fabric 中的 SQL 資料庫
向量資料型態支援一個可選的基底型態。 預設情況下, 向量 使用 float32。 當降低精度可接受時,你可以指定 float16 (半精度)。 float16 提供更精簡的表示方式,能減少儲存空間並提升效能。
半精度浮點向量是一個數字陣列,每個數字使用16位元 float16 浮點格式。 此表示方式使用了 32 位元 float32 格式的一半儲存空間。 使用 float16 來減少嵌入、語意搜尋和機器學習等工作負載的儲存空間與記憶體消耗。
float16 提供的數值精度較低,數值範圍也比 float32 小。 這種取捨使 float16 適合近似相似度,但對於需要高精度算術或精確數值保真度的工作負載則較不適用。
Syntax
若要使用半精度值,請指定 float16 作為向量基底類型:
column_name VECTOR ( <dimensions> [ , <base_type> ] ) [ NOT NULL | NULL ]
如果你省略 <base_type>了 ,預設是 float32。
float16 的主要優點
維度增加
SQL 資料庫引擎 在使用 float16 時支援最多 3,996 維度的向量,相比之下,使用 float32 時支援 1,998 維度。 額外的維度支援由產生超過 1,998 個值的模型所產生的嵌入。
減少儲存和記憶體佔用
以 16 位元格式儲存向量元素,相較於 float32 能減少所需的儲存空間。 這種約簡使得大規模儲存和查詢高維向量變得可行。
儲存效率與精準控制
選擇適合工作負載的基礎類型:
- 在可接受較低精度的情況下,請使用 float16 作為精簡儲存格式。
- 在一般用途和需要更高精確度的工作負載時,使用 float32 。
功能可用性
半精度(float16)向量通常可在 Azure SQL Database、Azure SQL 受控執行個體 以及 Microsoft Fabric 的 SQL 資料庫中取得。 不需要預覽設定。
半精度(float16)向量可在 SQL Server 2025 預覽版中取得。 在使用
VECTOR(..., float16). 之前,先啟用PREVIEW_FEATURES資料庫範圍設定選項。 更多資訊請參見 PREVIEW_FEATURES = { 開 |關閉 }。ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON; GO
範例
答: 定義向量欄位
以下範例定義了使用預設 float32 基底型別與明確 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. 儲存並比較 float16 向量
以下範例建立一個帶有 float16 向量欄位的表格,插入樣本資料,並用來 VECTOR_DISTANCE 尋找三個最接近的向量:
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;
備註
向量索引至少需要 100 列且向量值非 NULL。 關於需求與範例,請參見 CREATE VECTOR INDEX。
C. 檢查向量基底類型中繼資料
下列查詢會確認 向量 資料行的實際基底類型和維度:
--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');
輸出欄:
vector_dimensions:為向量定義的維度數。vector_base_type:基底類型的內部數值代碼:-
0= float32 -
1= float16
-
vector_base_type_desc:人類可讀的基底類型描述。
支援隱式和顯式轉換
SQL Server 支援從varchar、nvarchar和json字串到 的隱含和明確轉換,只要該向量以具有明確維度數的方式宣告。
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
只有在完全宣告目標 向量 類型時,才支援隱含轉換。
-- 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);
不支援或容易出錯的狀況
下列範例強調在 SQL Server 中使用半精細浮點 向量 資料類型時的常見錯誤和限制。
基底類型 float32 和 float16 之間的明確和隱含轉換
SQL Server 目前不支援VECTOR(float32)與VECTOR(float16)之間的隱含轉換。
此外,使用明確轉換的CAST或CONVERT目前已封鎖。
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
回傳以下錯誤:
Error: Msg 42238, Level 16, State 1, Line 61
Conversion of vector from data type float32 to float16 is not allowed.
維度不相符
不允許在維度不相符的向量之間進行轉換,並引發維度不相符錯誤。
DECLARE @v1 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(4, float16) = NULL;
SET @v1 = @v2;
回傳以下錯誤:
Error: Msg 42204, Level 16, State 1, Line 10
The vector dimensions 4 and 3 do not match
空值處理
如果向量宣告時沒有維度計數,則為其指派值會引發錯誤。
這個例子是可行的:
DECLARE @v1 AS VECTOR(3, float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;
然而,如果未指定維度計數,則會產生錯誤:
DECLARE @v1 AS VECTOR(float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;
超出範圍的值
float16 的值超出範圍(例如高於 65504.0)會在指派時產生錯誤。
DECLARE @v AS VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
回傳以下錯誤:
Input JSON contains out-of-range values for float16
函數中的混合基底類型
不支援函 VECTOR_DISTANCE 式中的混合基底類型,並引發類型錯誤。
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);
回傳以下錯誤:
VECTOR_DISTANCE does not support different base types
不支援的架構
Arm64 架構不支援 float16。 使用此類型會造成執行時錯誤。
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);
回傳以下錯誤:
float16 is not supported on ARM64 architecture
SIMD 溢位
基於單指令、多資料(SIMD)的操作,如 AVX2 或 SSE4.2,若值超過可表示範圍,可能會產生溢位錯誤。
DECLARE @v AS VECTOR(8) = '[-2.9e+38, ..., 2.9e+38]';
SELECT VECTOR_NORM(@v, 'norm1');
行為依環境而異 ARITHABORT :
-
ARITHABORT ON結果出現錯誤 -
ARITHABORT OFF結果如下NULL
工具支援
SQL Server Management Studio(SSMS)目前在使用者介面中尚未區分 float32 與 float16。 查詢 sys.columns 以確認向量欄位所使用的基底型態。
驅動程式支援
以下驅動程式支援 float16 向量的原生二進位傳輸:
-
Microsoft JDBC 驅動程式 13.4 for SQL Server 及後續版本支援 IEEE 754 的序列化與反序列化,支援 Java
Float[]值與半精度線材格式之間的反序列化。 - Microsoft ODBC 驅動程式 18.7.1 用於 SQL Server 及後續版本支援 float16 向量子型。
使用這些驅動版本或更新版本,以原生二進位格式傳送與接收 float16 向量。 不支援原生 float16 傳輸的驅動程式,可以用 JSON 陣列表示 varchar(max) 的向量來運作。
備註
除非另有說明,所有適用於以 float32 為基底類型的預設 vector 類型的限制,也適用於 VECTOR(..., float16)。