Suporte a float de meia precisão no tipo de dados de vetor

Aplica-se a: SQL Server 2025 (17.x) Banco de Dados SQL do AzureInstância Gerenciada de SQL do Azurebanco de dados SQL no Microsoft Fabric

O tipo de dado vetorial suporta um tipo base opcional. Por padrão, o vetor usa float32. Você pode especificar float16 (meia precisão) quando a precisão reduzida for aceitável. Float16 oferece uma representação mais compacta que pode reduzir o armazenamento e melhorar o desempenho.

Um vetor de ponto flutuante de meia precisão é um array de números no qual cada número utiliza o formato de ponto flutuante float16 de 16 bits. Essa representação usa metade do armazenamento do formato float32 de 32 bits. Use float16 para reduzir o consumo de armazenamento e de memória em cargas de trabalho como embeddings, busca semântica e aprendizado de máquina.

O float16 oferece menor precisão numérica e um alcance numérico menor que o float32. Essa troca torna o float16 adequado para cenários aproximados de similaridade, mas menos adequado para cargas de trabalho que exigem aritmética de alta precisão ou fidelidade numérica exata.

Syntax

Para usar valores de meia precisão, especifique float16 como o tipo base vetorial:

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

Se você omitir <base_type>, o padrão é float32.

Principais benefícios do float16

  • Aumento da dimensionalidade

    O SQL Mecanismo de Banco de Dados suporta vetores com até 3.996 dimensões quando usa float16, em comparação com 1.998 dimensões quando usa float32. As dimensões adicionais suportam embeddings gerados por modelos que produzem mais de 1.998 valores.

  • Volume de memória e armazenamento reduzidos

    Armazenar elementos vetoriais em formato de 16 bits reduz o armazenamento necessário em comparação com o float32. Essa redução torna prático armazenar e consultar vetores de alta dimensão em escala.

  • Eficiência de armazenamento e controle de precisão

    Escolha o tipo base apropriado para a carga de trabalho:

    • Use float16 para armazenamento compacto quando uma precisão reduzida for aceitável.
    • Use float32 para uso geral e cargas de trabalho que exigem maior precisão.

Disponibilidade de funcionalidades

  • Vetores de meia-precisão (float16) estão geralmente disponíveis no Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure e SQL Database no Microsoft Fabric. Nenhuma configuração de visualização é necessária.

  • Vetores de meia-precisão (float16) estão disponíveis em prévia no SQL Server 2025. Ative a PREVIEW_FEATURES opção de configuração com escopo de banco de dados antes de usar VECTOR(..., float16). Para mais informações, veja PREVIEW_FEATURES = { LIGADO | DESLIGADO }.

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Exemplos

A. Defina colunas vetoriais

O exemplo a seguir define colunas separadas que usam o tipo padrão de base float32 e o tipo explícito de base 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. Armazene e compare vetores de float16

O exemplo a seguir cria uma tabela com uma coluna vetorial float16 , insere dados de amostra e usa VECTOR_DISTANCE para encontrar os três vetores mais próximos:

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;

Observação

Um índice vetorial requer pelo menos 100 linhas com valores vetoriais não NULL. Para requisitos e exemplos, veja CREATE VECTOR INDEX.

C. Inspecionar metadados de tipo base de vetor

A consulta a seguir confirma o tipo base real e as dimensões de uma coluna de vetor :

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

Colunas de saída:

  • vector_dimensions: número de dimensões definidas para o vetor.

  • vector_base_type: código numérico interno para o tipo base:

    • 0 = float32
    • 1 = float16
  • vector_base_type_desc: descrição legível por humanos do tipo base.

Conversão implícita e explícita com suporte

O SQL Server dá suporte à conversão implícita e explícita de cadeias de caracteres varchar, nvarchar e json para VECTOR(<dimension_count>, float16), desde que o vetor seja declarado com uma contagem de dimensões explícita.

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

A Conversão Implícita só tem suporte quando o tipo de vetor de destino é totalmente declarado.

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

Cenários sem suporte ou propensos a erros

Os exemplos a seguir destacam erros e limitações comuns ao trabalhar com o tipo de dados de vetor flutuante de meia precisão no SQL Server.

Conversão explícita e implícita entre os tipos base float32 e float16

No momento, o SQL Server não dá suporte à conversão implícita entre VECTOR(float32) e VECTOR(float16).

Além disso, a conversão explícita usando CAST ou CONVERT está atualmente bloqueada.

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

O seguinte erro é retornado:

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

Incompatibilidade de dimensão

A conversão entre vetores com dimensões incompatíveis não é permitida e gera um erro de incompatibilidade de dimensão.

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

O seguinte erro é retornado:

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

Tratamento nulo

Se um vetor for declarado sem uma contagem de dimensões, atribuir um valor a ele gerará um erro.

Este exemplo funciona:

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

No entanto, se a contagem de dimensões não for especificada, ela gerará um erro:

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

Valores fora do intervalo

Valores fora de faixa para float16 (por exemplo, valores acima de 65504.0) geram um erro durante a atribuição.

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

O seguinte erro é retornado:

Input JSON contains out-of-range values for float16

Tipos de base mesclados em funções

Tipos de base mistos em funções como VECTOR_DISTANCE não têm suporte e geram um erro de tipo.

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

O seguinte erro é retornado:

VECTOR_DISTANCE does not support different base types

Arquitetura sem suporte

Arquiteturas Arm64 não suportam float16. Usar esse tipo causa um erro em tempo de execução.

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

O seguinte erro é retornado:

float16 is not supported on ARM64 architecture

Estouro de SIMD

Uma única instrução, operações baseadas em múltiplos dados (SIMD), como AVX2 ou SSE4.2, poderão gerar erros de estouro se os valores excederem os intervalos representáveis.

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

SELECT VECTOR_NORM(@v, 'norm1');

O comportamento depende da ARITHABORT configuração:

  • ARITHABORT ON resulta em um erro
  • ARITHABORT OFF resulta em NULL

Suporte a ferramentas

O SQL Server Management Studio (SSMS) atualmente não distingue entre float32 e float16 na interface do usuário. Consulte sys.columns para confirmar o tipo base usado por uma coluna vetorial.

Suporte a driver

Os seguintes drivers suportam transporte binário nativo para vetores float16 :

Use essas versões de drivers ou posteriores para enviar e receber vetores float16 em formato binário nativo. Drivers que não suportam transporte nativo de float16 podem funcionar com vetores representados como varchar(max) arrays JSON.

Observação

Todas as limitações que se aplicam ao tipo de vetor padrão com o tipo base float32 também se aplicam a VECTOR(..., float16), salvo indicação em contrário.