ベクター データ型での半精度浮動小数点数のサポート

適用対象:SQL Server 2025 (17.x)Azure SQL DatabaseAzure 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 Managed Instance、Microsoft FabricのSQLデータベースで利用可能です。 プレビュー設定は不要です。

  • 半精度(float16)ベクトルはSQL Server 2025のプレビュー版で利用可能です。 VECTOR(..., float16)を使う前に、PREVIEW_FEATURESデータベーススコープ設定オプションを有効にしてください。 詳細については、 PREVIEW_FEATURES = { ON |OFF }を参照してください。

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

例示

A. ベクトル列を定義する

以下の例では、デフォルトの 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 を用いて最も近い3つのベクトルを探します。

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;

注

ベクトルインデックスには、NULLでないベクトル値を持つ少なくとも100行が必要です。 要件や例については 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 文字列からへのVECTOR(<dimension_count>, float16)な変換と明示的な変換の両方がサポートされます。

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

null 処理

ベクトルが次元数なしで宣言されている場合、値を割り当てるとエラーが発生します。

この例は次のようになります。

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 オーバーフロー

AVX2 や SSE4.2 などの単一命令の複数データ (SIMD) ベースの操作では、値が表現可能な範囲を超えるとオーバーフロー エラーが発生する可能性があります。

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 ベクトルのネイティブバイナリトランスポートをサポートしています:

これらのドライバーバージョン以降を使用して、ネイティブバイナリ形式の float16 ベクトルを送受信できます。 ネイティブの float16 トランスポートをサポートしないドライバーは、 varchar(max) JSON配列で表現されたベクターで動作します。

注

float32のベースタイプでデフォルトのベクタータイプに適用されるすべての制限は、特に記載がない限りVECTOR(..., float16)にも適用されます。