Suporte de flutuação de meia precisão no tipo de dados vetoriais

Aplica-se a: SQL Server 2025 (17.x) Base de Dados SQL do AzureAzure SQL Managed InstanceSQL database in Microsoft Fabric

O tipo de dados vetorial suporta um tipo base opcional. Por defeito, o vector usa float32. Pode especificar float16 (meia-precisão) quando a precisão reduzida for aceitável. O float16 fornece uma representação mais compacta que pode reduzir o armazenamento e melhorar o desempenho.

Um vetor de vírgula flutuante de meia precisão é uma sequência de números em que cada número usa o formato de vírgula flutuante float16 de 16 bits. Esta representação utiliza metade do armazenamento do formato float32 de 32 bits. Utilize float16 para reduzir o armazenamento e o consumo de memória em cargas de trabalho como embeddings, pesquisa semântica e aprendizagem automática.

O float16 oferece menos precisão numérica e um alcance numérico menor do que o float32. Este compromisso torna o float16 adequado para cenários de similaridade aproximada, 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 tipo base vetorial:

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

Se omitires <base_type>, o padrão é float32.

Principais benefícios do float16

  • Aumento da dimensionalidade

    O SQL Database Engine suporta vetores com até 3.996 dimensões ao usar float16, comparado com 1.998 dimensões ao usar float32. As dimensões adicionais suportam embeddings gerados por modelos que produzem mais de 1.998 valores.

  • Armazenamento reduzido e espaço ocupado pela memória

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

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

    Escolha o tipo base que seja apropriado para a carga de trabalho:

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

Disponibilidade de funcionalidades

  • Vetores de meia-precisão (float16) estão geralmente disponíveis no Base de Dados SQL do Azure, Azure SQL Managed Instance e SQL database no Microsoft Fabric. Não é necessária qualquer configuração de pré-visualização.

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

    ALTER DATABASE SCOPED CONFIGURATION
    SET PREVIEW_FEATURES = ON;
    GO
    

Examples

A. Defina colunas vetoriais

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

O exemplo seguinte cria uma tabela com uma coluna vetorial float16 , insere dados de amostra e utiliza 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 do tipo base vetorial

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

--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 de base:

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

Conversão implícita ou explícita suportada

O SQL Server oferece 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 é suportada somente 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 de base float32 e float16

Atualmente, o SQL Server não oferece suporte à conversão implícita entre VECTOR(float32) e VECTOR(float16).

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

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 é devolvedo:

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

Incompatibilidade de dimensões

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 é devolvedo:

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ão não for especificada, gera 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 do intervalo 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 é devolvedo:

Input JSON contains out-of-range values for float16

Tipos de base mistos em funções

Tipos de base mistos em funções como VECTOR_DISTANCE não são suportados e gera 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 é devolvedo:

VECTOR_DISTANCE does not support different base types

Arquitetura não suportada

As arquiteturas Arm64 não suportam float16. Usar este 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 é devolvedo:

float16 is not supported on ARM64 architecture

Excesso de SIMD

Operações do tipo instrução única e dados múltiplos (SIMD), como AVX2 ou SSE4.2, podem produzir 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 configuração do ARITHABORT.

  • ARITHABORT ON resulta num erro
  • ARITHABORT OFF resultados em NULL

Suporte de ferramentas

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

Suporte ao motorista

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

Use estas versões do driver ou posteriores para enviar e receber vetores float16 em formato binário nativo. Controladores que não suportam transporte nativo de float16 podem funcionar com vetores representados como varchar(max) matrizes 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.