矢量数据类型中的半精度浮点支持

适用于:SQL Server 2025 (17.x) 预览版

从 SQL Server 2025 (17.x) 预览版开始,可以为 矢量 数据类型指定基础基类型。 默认情况下, 向量 用作 float32 其基类型。 float16(半精度)是一种在精度降低可以接受时使用的替代类型。 它通过减少存储和提高性能来提供更紧凑的选择。

半精度浮点向量是数字的数组或集合,其中每个数字都使用 16 位半精度 (float16) 浮点格式表示。 此表示形式消耗标准 32 位单精度浮点数的一半内存。 使用这些矢量类型,通过权衡一些精度来节省内存和带宽,特别是在深度学习和矢量数据库中,以提高效率。

虽然 float16 具有显著的存储和性能优势,但与 float32 相比,它提供的数值精度较低。 这种权衡使它非常适合近似相似性方案,例如语义搜索,但不太适合需要高精度算术或精确数字保真度的工作负荷。

float16 支持的主要优势

  • 增加维度支持

    SQL Server 支持的向量在使用时最多可达到1998 × 2float16)。 此功能使针对float32的 1,998 个维度限制加倍。 例如,此功能可实现更具表现力的嵌入,并与较大模型的 text-embedding-large 兼容。

  • 减少存储和内存占用

    与全精度向量相比,以 16 位格式存储向量会显著减少所需的存储量。 这使得大规模存储和查询高维向量是可行的。 此优化还提高了数据密度,这可以提高矢量搜索方案中的查询性能。

  • 存储效率和精度控制

    选择最合适的基类型:

    • float16 用于紧凑型存储
    • float32 用于常规用途和精度要求更高的任务

    这种灵活性可确保最佳的资源使用,而不会影响应用程序的准确性。

示例语法

用法语法类似于 矢量 数据类型。 但是,若要使用 float16,请显式指定基类型。

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

功能可用性

float16 vector 当前可供预览。 若要测试,请启用 PREVIEW_FEATURES 数据库范围的配置选项。 有关详细信息,请查看 PREVIEW_FEATURES = { ON |OFF }

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

例子

在语句中使用默认基类型或显式基类型定义向量列。

默认情况下,基类型为 float32.

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

若要使用 半精度,请显式指定 float16

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

以下示例创建一个具有半精度浮向量列的表,并将数据插入其中。

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

检查矢量基类型元数据

以下查询确认 矢量 列的实际基类型和维度:

--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 支持从 varcharnvarcharjson 字符串到向量的隐式和显式转换,只要向量声明了明确的维度计数。

DECLARE @j JSON = '[1.0, 2.0, 3.0]';
DECLARE @v VECTOR(3, float16);
SET @v = CAST(@j AS VECTOR(3, float16)); -- Explicit conversion from JSON to float16

DECLARE @v1 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = CAST(@v1 AS VECTOR(3, float16)); -- Explicit conversion from VARCHAR to float16

DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 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 VARCHAR(50) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1;

-- Implicit conversion from NVARCHAR to float16
DECLARE @v1 NVARCHAR(50) = N'[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16);
SET @v2 = @v1

--From JSON_ARRAY to VECTOR
DECLARE @v3 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 VECTOR(3, float16);
DECLARE @v2 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 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 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 VECTOR(3, float16) = NULL;
DECLARE @v2 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2; -- This works

--However, if the dimension count is not specified, it raises an error
DECLARE @v1 VECTOR(float16) = NULL;
DECLARE @v2 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

范围外值

超出 float16 范围的值(例如超过 65504.0)在分配时会引发错误。

DECLARE @v VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';
-- Error: Input JSON contains out-of-range values for float16

函数中的混合基类型

函数 VECTOR_DISTANCE 中的混合基类型不受支持,并引发类型错误。

DECLARE @v1 VECTOR(3, float32) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, float16) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: VECTOR_DISTANCE does not support different base types

不支持的体系结构

float16 Arm64 体系结构不支持,并且使用它会引发运行时错误

DECLARE @v1 VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 VECTOR(3, int) = '[1, 2, 3]';
SELECT VECTOR_DISTANCE('euclidean', @v1, @v2);
-- Error: 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');
-- Behavior depends on ARITHABORT setting:
--     ARITHABORT ON  → Error
--     ARITHABORT OFF → NULL

工具支持

SQL Server Management Studio (SSMS)目前在用户界面中不区分 float32float16。 使用sys.columns确认架构中使用的实际基类型。

二进制传输支持对于 float16 向量尚未可用。

float16 矢量当前通过 TDS 作为 varchar(max) (JSON 数组)传输。 ODBC、JDBC 和 .NET 等驱动程序中尚不支持 float16 的二进制传输。

注释

适用于默认 向量 类型的所有限制(with float32) 也适用 VECTOR(float16)