Partilhar via


Pesquisa vetorial e índices vetoriais no Mecanismo de Banco de Dados SQL

Aplica-se a: SQL Server 2025 (17.x) Azure SQL Database AzureSQL Managed InstanceSQL database in Microsoft Fabric

O Mecanismo de Banco de Dados SQL fornece a capacidade de armazenar qualquer tipo de dados e executar qualquer tipo de consulta: estruturada e não estruturada, e executar pesquisa vetorial nesses dados. É uma boa opção para cenários em que você precisa pesquisar todos esses dados juntos e não quer usar um serviço separado para pesquisa que complicaria sua arquitetura.

Observação

  • Os recursos de vetor estão disponíveis na Instância Gerenciada SQL do Azure configurada com a política de atualizaçãodo SQL Server 2025 ou Always-up-to-date.

Vectors

Vetores são matrizes ordenadas de números (normalmente flutuadores) que podem representar informações sobre alguns dados. Por exemplo, uma imagem pode ser representada como um vetor de valores de pixel ou uma cadeia de caracteres de texto pode ser representada como um vetor de valores ASCII. O processo para transformar dados em um vetor é chamado de vetorização. O tipo de dados vetoriais no SQL Server foi projetado para armazenar essas matrizes de números de forma eficiente.

Incorporações

As incorporações são vetores que representam características importantes dos dados. As incorporações geralmente são aprendidas usando um modelo de aprendizado profundo, e os modelos de aprendizado de máquina e IA os utilizam como recursos. As incorporações também podem capturar semelhança semântica entre conceitos semelhantes. Por exemplo, ao gerar uma incorporação para as palavras person e human, esperaríamos que suas incorporações (representação vetorial) fossem semelhantes em valor, uma vez que as palavras também são semanticamente semelhantes.

O Azure OpenAI apresenta modelos para criar incorporações a partir de dados de texto. O serviço divide o texto em tokens e gera incorporações usando modelos pré-treinados pela OpenAI. Para saber mais, consulte Criando incorporações com o Azure OpenAI.

Depois que as incorporações são geradas, elas podem ser armazenadas em um banco de dados do SQL Server. Isso permite que você armazene as incorporações ao lado dos dados que elas representam e execute consultas de pesquisa vetorial para encontrar pontos de dados semelhantes.

A pesquisa vetorial refere-se ao processo de encontrar todos os vetores em um conjunto de dados que são semelhantes a um vetor de consulta específico. Portanto, um vetor de consulta para a palavra human pesquisa todo o conjunto de dados em busca de vetores semelhantes e, portanto, palavras semelhantes: neste exemplo, ele deve encontrar a palavra person como uma correspondência próxima. Essa proximidade, ou distância, é medida usando uma métrica de distância, como a distância do cosseno. Quanto mais próximos são os vetores, mais semelhantes eles são.

O SQL Server oferece suporte incorporado para vetores através do tipo de dados vetorial . Os vetores são armazenados em um formato binário otimizado, mas expostos como matrizes JSON por conveniência. Cada elemento do vetor é armazenado usando o valor de ponto flutuante de precisão única (4 bytes). Junto com o tipo de dados, existem funções dedicadas para operar em vetores. Por exemplo, é possível encontrar a distância entre dois vetores usando a função VETOR_DISTANCE . A função retorna um valor escalar com a distância entre dois vetores com base na métrica de distância especificada.

Como os vetores são normalmente geridos como matrizes de floats, a criação de um vetor pode ser feita simplesmente registando uma matriz JSON para um tipo de dados vetorial . Por exemplo, o código a seguir cria um vetor a partir de uma matriz JSON:

SELECT 
    CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
    CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;

Ou, use fundição implícita

DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;

O mesmo vale para converter um vetor em uma matriz JSON:

DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT 
    CAST(@v AS NVARCHAR(MAX)) AS s,
    CAST(@v AS JSON) AS j

Pesquisa exata e distância de vetor (vizinhos mais próximos exatos)

A pesquisa exata, também conhecida como pesquisa k-nearest neighbor (k-NN), envolve calcular a distância entre um determinado vetor e todos os outros vetores em um conjunto de dados, classificar os resultados e selecionar os vizinhos mais próximos com base em uma métrica de distância especificada. Este método garante a recuperação precisa dos vizinhos mais próximos, mas pode ser computacionalmente intensivo, especialmente para grandes conjuntos de dados.

As funções de distância vetorial são usadas para medir a proximidade entre vetores. As métricas de distância comuns incluem distância euclidiana, semelhança de cosseno e produto ponto. Estas funções são essenciais para realizar pesquisas k-NN e garantir resultados precisos.

A pesquisa vetorial do vizinho mais próximo exato (ENN) executa um cálculo exaustivo de distância em todos os vetores indexados para garantir a recuperação dos vizinhos mais próximos com base em uma métrica de distância especificada. Esse método é preciso, mas consome muitos recursos, tornando-o adequado para conjuntos de dados menores ou cenários onde a precisão é fundamental.

No Mecanismo de Banco de Dados SQL, as pesquisas k-NN podem ser realizadas usando a função VETOR_DISTANCE , que permite o cálculo eficiente de distâncias entre vetores e facilita a recuperação dos vizinhos mais próximos.

O exemplo a seguir mostra como fazer k-NN para retornar os 10 principais vetores mais semelhantes armazenados na content_vector tabela para o vetor @qvde consulta fornecido.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance

O uso de uma pesquisa exata é recomendado quando você não tem muitos vetores para pesquisar (menos de 50.000 vetores como recomendação geral). A tabela pode conter muito mais vetores, desde que seus predicados de pesquisa reduzam o número de vetores a serem usados para pesquisa de vizinhos para 50.000 ou menos.

Índice vetorial aproximado e pesquisa vetorial (vizinhos aproximados mais próximos)

Observação

O índice vetorial aproximado e a pesquisa vetorial estão em pré-visualização e atualmente só estão disponíveis no SQL Server 2025 (17.x), Azure SQL Database e SQL Database no Microsoft Fabric.

A identificação de todos os vetores próximos a um determinado vetor de consulta requer recursos substanciais para calcular a distância entre o vetor de consulta e os vetores armazenados na tabela. A pesquisa de todos os vetores próximos a um determinado vetor de consulta envolve uma verificação completa da tabela e um uso significativo da CPU. Isso é chamado de consulta "K-vizinhos mais próximos" ou "k-NN" e retorna os vetores mais próximos "k".

Os vetores são usados para encontrar dados semelhantes para modelos de IA responderem às perguntas dos usuários. Isso envolve a consulta ao banco de dados para os vetores "k" mais próximos do vetor de consulta, utilizando métricas de distância como produto interno (escalar), similaridade do cosseno ou distância euclidiana.

As consultas K-NN muitas vezes enfrentam problemas de escalabilidade, o que torna aceitável, em muitos casos, sacrificar alguma precisão, particularmente a revocação, em troca de ganhos significativos em velocidade. Este método é conhecido como vizinhos aproximados mais próximos (ANN).

Recall é um conceito importante que deve se tornar familiar para todos que usam ou planejam usar vetores e incorporações. Na verdade, o recall mede a proporção dos vizinhos mais próximos aproximados que são identificados pelo algoritmo, em comparação com os vizinhos mais próximos exatos que uma pesquisa exaustiva retornaria. Portanto, é uma boa medição da qualidade da aproximação que o algoritmo está fazendo. Um recall perfeito, que equivale a sem aproximação, é 1.

Para aplicações de IA, o trade-off é bastante razoável. Como a incorporação vetorial já aproxima conceitos, o uso de ANN não afeta significativamente os resultados, desde que o recall seja próximo de 1. Isso garante que os resultados retornados sejam muito semelhantes aos do k-NN, oferecendo desempenho amplamente melhorado e uso de recursos significativamente reduzido, o que é altamente benéfico para bancos de dados operacionais.

É importante entender que o termo "índice" quando usado para se referir a um índice vetorial tem um significado diferente do índice com o qual você está acostumado a trabalhar em bancos de dados relacionais. Na verdade, um índice vetorial retorna resultados aproximados.

No mecanismo do Banco de dados SQL, os índices vetoriais são baseados no algoritmo DiskANN . O DiskANN depende da criação de um gráfico para navegar rapidamente por todos os vetores indexados para encontrar a correspondência mais próxima de um determinado vetor. O DiskANN é um sistema baseado em gráficos para indexação e pesquisa de grandes conjuntos de dados vetoriais usando recursos computacionais limitados. Utiliza eficientemente SSDs e memória mínima para lidar com significativamente mais dados do que os índices na memória, mantendo consultas por segundo (QPS) elevadas e baixa latência, garantindo um equilíbrio entre a utilização de memória, CPU e E/S e desempenho de pesquisa.

Uma pesquisa de algoritmo de vizinhos aproximados mais próximos pode ser feita primeiro criando um índice vetorial usando o comando CREATE VETOR INDEX T-SQL e, em seguida, usando VETOR_SEARCH função T-SQL para executar a pesquisa aproximada.

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDINGS(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT 
    t.id, s.distance, t.title
FROM
    VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t, 
        COLUMN = [content_vector], 
        SIMILAR_TO = @qv, 
        METRIC = 'cosine', 
        TOP_N = 10
    ) AS s
ORDER BY s.distance