Vektör veri türünde yarım duyarlıklı float desteği

Şunlar için geçerlidir: SQL Server 2025 (17.x)

SQL Server 2025(17.x) sürümünden başlayarak , vektör veri türü için temel alınan temel türü belirtebilirsiniz. Varsayılan olarak vektör, temel türü olarak float32 kullanır. float16 (yarı hassasiyet), azaltılmış hassasiyetin kabul edilebilir olduğu durumlar için alternatif bir türdür. Depolamayı azaltarak ve performansı artırarak daha kompakt bir alternatif sunar.

Yarım duyarlıklı kayan nokta vektör, her sayının 16 bit yarım duyarlık (float16) kayan nokta biçimi kullanılarak temsil edildiği bir dizi veya sayı koleksiyonudur. Bu gösterim, standart 32 bit tek duyarlıklı float'ın belleğinin yarısını tüketir. Bellek ve bant genişliğinden tasarruf etmek için, hassasiyeti biraz feda ederek verimlilik sağlamak amacıyla bu vektör türlerini kullanın; özellikle derin öğrenme ve vektör veritabanlarında.

önemli depolama ve performans avantajları sunarken float16 , ile karşılaştırıldığında float32daha az sayısal duyarlık sağlar. Bu denge, semantik arama gibi yaklaşık benzerlik senaryoları için uygundur, ancak yüksek hassasiyetli aritmetik veya kesin sayısal doğruluk gerektiren iş yükleri için daha az uygundur.

float16 desteğinin temel avantajları

  • Artan boyutsallık desteği

    SQL Server, kullanırken 1998 × 2 kadar vektörleri destekler (float16). Bu özellik, için float321.998 boyut sınırlamasını ikiye katlar. Bu özellik, daha ifadeli gömülümler ve daha büyük modellerle uyumluluk sağlar, örneğin text-embedding-large.

  • Azaltılmış depolama ve bellek ayak izi

    Vektörlerin 16 bit biçiminde depolanması, tam duyarlıklı vektörlere kıyasla gereken depolama miktarını önemli ölçüde azaltır. Bu, yüksek boyutlu vektörleri büyük ölçekte depolamayı ve sorgulamayı mümkün kılar. Bu iyileştirme ayrıca veri yoğunluğunun iyileştirilmesini de sağlar ve bu da vektör arama senaryolarında sorgu performansını geliştirebilir.

  • Depolama verimliliği ve duyarlık denetimi

    En uygun temel türü seçin:

    • float16 kompakt Depolama için
    • float32 genel kullanım ve daha yüksek duyarlıklı görevler için

    Bu esneklik, uygulama doğruluğundan ödün vermeden en iyi kaynak kullanımını sağlar.

Örnek söz dizimi

Kullanım söz dizimi vektör veri türüne benzer. Ancak, float16 kullanmak için taban türünü açıkça belirtin.

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

Özellik kullanılabilirliği

float16 vektör şu anda önizleme için kullanılabilir. Test etmek için veritabanı kapsamlı yapılandırma seçeneğini etkinleştirin PREVIEW_FEATURES . Ayrıntılar için PREVIEW_FEATURES = { AÇIK | KAPALI } kısmını gözden geçirin. float16 vektörleri şu anda TDS üzerinden varchar(max) (JSON dizisi) olarak iletilir. için float16 ikili aktarım desteği şu anda kullanılamıyor.

ALTER DATABASE SCOPED CONFIGURATION SET PREVIEW_FEATURES = ON;
GO

Örnekler

Varsayılan temel türü veya açık bir türü kullanarak bir deyimde CREATE TABLE sütunu tanımlayın.

Varsayılan olarak, temel tür şeklindedir float32.

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

Yarı hassasiyet kullanmak için float16 açıkça belirtin.

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

Aşağıdaki örnek yarım duyarlıklı kayan vektör sütununa sahip bir tablo oluşturur ve içine veri ekler.

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

Vektör temel türü meta verilerini inceleme

Aşağıdaki sorgu, bir vektör sütununun gerçek temel türünü ve boyutlarını onaylar:

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

Çıkış sütunları:

  • vector_dimensions: Vektör için tanımlanan boyut sayısı.

  • vector_base_type: Temel tür için iç sayısal kod:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: Temel türün insan tarafından okunabilen açıklaması.

Desteklenen örtük ve açık dönüştürme

SQL Server, vektör açık bir boyut sayısıyla bildirilirse örtük ve açık dönüştürmeyi varchar, nvarchar ve json dizelerinden VECTOR(<dimension_count>, float16)öğesine destekler.

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

Örtük Dönüştürme yalnızca hedef vektör türü tam olarak bildirildiğinde desteklenir.

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

Desteklenmeyen veya hataya açık senaryolar

Aşağıdaki örneklerde, SQL Server'da yarı duyarlıklı kayan vektör veri türüyle çalışırken karşılaşılan yaygın hatalar ve sınırlamalar vurgulanır.

Float32 ve float16 temel türleri arasında açık ve örtük dönüştürme

SQL Server şu anda ve VECTOR(float32) arasında örtük dönüşümü desteklememektedir.

Ayrıca, veya CAST kullanılarak yapılan CONVERT şu anda engellenmiştir.

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

Aşağıdaki hata döndürülür:

Error: Msg 42238, Level 16, State 1, Line 61
Conversion of vector from data type float32 to float16 is not allowed.

Boyut uyuşmazlığı

Eşleşmeyen boyutlara sahip vektörler arasında dönüştürmeye izin verilmez ve boyut uyuşmazlığı hatası oluşturur.

DECLARE @v1 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
DECLARE @v2 AS VECTOR(4, float16) = NULL;
SET @v1 = @v2;

Aşağıdaki hata döndürülür:

Error: Msg 42204, Level 16, State 1, Line 10
The vector dimensions 4 and 3 do not match

Null işleme

Bir vektör boyut sayısı olmadan bildirilirse, buna bir değer atamak hataya neden olur.

Bu örnek çalışır:

DECLARE @v1 AS VECTOR(3, float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

Ancak boyut sayısı belirtilmezse bir hata oluşur:

DECLARE @v1 AS VECTOR(float16) = NULL;
DECLARE @v2 AS VECTOR(3, float16) = '[1.0, 2.0, 3.0]';
SET @v1 = @v2;

Aralık dışı değerler

için aralık dışı değerler float16 (örneğin, 65504.0'ın üzerinde) atama sırasında bir hata oluşturur.

DECLARE @v AS VECTOR(3, float16) = '[1.0, 2.0, 70000.0]';

Aşağıdaki hata döndürülür:

Input JSON contains out-of-range values for float16

İşlevlerdeki karma veri türleri

gibi VECTOR_DISTANCE işlevlerdeki karma temel türler desteklenmez ve tür hatası oluşturur.

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

Aşağıdaki hata döndürülür:

VECTOR_DISTANCE does not support different base types

Desteklenmeyen mimari

float16 Arm64 mimarilerinde desteklenmez ve bunu kullanmak çalışma zamanı hatasına neden olur

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

Aşağıdaki hata döndürülür:

float16 is not supported on ARM64 architecture

SIMD taşması

Tek talimatla, çoklu veri (SIMD) tabanlı işlemler, örneğin AVX2 veya SSE4.2 gibi, değerler temsil edilebilir aralıkları aşarsa taşma hataları üretebilir.

DECLARE @v AS VECTOR(8) = '[-2.9e+38, ..., 2.9e+38]';

SELECT VECTOR_NORM(@v, 'norm1');

Davranış şu ayara ARITHABORT bağlıdır:

  • ARITHABORT ON hatayla sonuçlanır
  • ARITHABORT OFF sonuç verir NULL

Araçlar desteği

SQL Server Management Studio (SSMS) şu anda kullanıcı arabiriminde float32 ile float16 arasındaki farkı ayırt etmez. Şemada kullanılan gerçek temel türü onaylamak için kullanın sys.columns .

Float16 vektörleri için ikili aktarım desteği henüz mevcut değil

float16 vektörleri şu anda TDS üzerinden varchar(max) (JSON dizisi) olarak iletilir. için float16 ikili aktarım desteği henüz ODBC, JDBC ve .NET gibi sürücülerde sağlanmamıştır.

Uyarı

Varsayılan vektör türüne (ile float32) uygulanan tüm sınırlamalar için VECTOR(float16)de geçerlidir.