Condividi tramite


VECTOR_SEARCH (Transact-SQL) (anteprima)

Si applica a: SQL Server 2025 (17.x) Azure SQL DatabaseSQL database in Microsoft Fabric

Cercare vettori simili a uno specifico vettore di query usando un algoritmo di ricerca di vettori vicini più vicino approssimativo. Per altre informazioni sul funzionamento dell'indicizzazione vettoriale e della ricerca vettoriale e sulle differenze tra ricerca esatta e approssimativa, vedere Ricerca vettoriale e indici vettoriali nel motore di database SQL.

Database SQL di Azure e database SQL in Fabric

La funzione è in anteprima. Assicurarsi di controllare le limitazioni correnti prima di usarlo.

Annotazioni

In quanto funzionalità di anteprima, la tecnologia presentata in questo articolo è soggetta alle condizioni per l'utilizzo supplementari per le anteprime di Microsoft Azure.

Funzionalità di anteprima di SQL Server 2025

In SQL Server 2025 questa funzione è in anteprima ed è soggetta a modifiche. Per usare questa funzionalità, è necessario abilitare la PREVIEW_FEATURESconfigurazione con ambito database.

Assicurarsi di controllare le limitazioni correnti prima di usarlo.

Syntax

Convenzioni relative alla sintassi Transact-SQL

VECTOR_SEARCH(
    TABLE = object [ AS source_table_alias ]
    , COLUMN = vector_column
    , SIMILAR_TO = query_vector
    , METRIC = { 'cosine' | 'dot' | 'euclidean' }
    , TOP_N = k
) [ AS result_table_alias ]

Arguments

TABLE = oggetto [AS source_table_alias]

Tabella in cui eseguire la ricerca. Deve essere una tabella di base. Le viste, le tabelle temporanee, sia locali che globali, non sono supportate.

COLONNA = vector_column

Colonna vettoriale in cui viene eseguita la ricerca. La colonna deve essere un tipo di dati vector .

SIMILAR_TO = query_vector

Vettore utilizzato per la ricerca. Deve essere una variabile o una colonna di tipo vettore .

METRIC = { 'coseno' | 'dot' | 'euclideo' }

Metrica della distanza usata per calcolare la distanza tra il vettore di query e i vettori nella colonna specificata. Viene usato un indice ANN (Nearest Neighbor approssimativo) solo se viene trovato un indice ANN corrispondente, con la stessa metrica e nella stessa colonna. Se non sono presenti indici ANN compatibili, viene generato un avviso e viene usato l'algoritmo KNN (k-Nearest Neighbor).

TOP_N = <k>

Numero massimo di vettori simili che devono essere restituiti. Deve essere un numero intero positivo.

result_table_alias

L'alias viene usato per fare riferimento al set di risultati.

Restituire il set di risultati

Il set di risultati restituito dalla VECTOR_SEARCH funzione include:

  • Tutte le colonne della tabella specificata nell'argomento TABLE .

  • Colonna aggiuntiva denominata distance, che rappresenta la distanza tra il vettore nella colonna specificata dall'argomento COLUMN e il vettore fornito nell'argomento SIMILAR_TO .

La colonna distance viene generata dalla VECTOR_SEARCH funzione stessa, mentre tutte le altre colonne provengono dalla tabella a cui viene fatto riferimento nell'argomento TABLE .

Se si usa un alias per la tabella nell'argomento TABLE , è necessario utilizzare lo stesso alias per fare riferimento alle colonne nell'istruzione SELECT . Non è possibile usare l'alias assegnato a per fare riferimento alle VECTOR_SEARCH colonne della tabella specificata in TABLE. Questo comportamento è più semplice da comprendere se si pensa al set di risultati compilato prendendo l'output di VECTOR_SEARCH e unendolo ai dati della tabella.

Se la tabella specificata nell'argomento TABLE contiene già una colonna denominata distance, il comportamento sarà simile a un join SQL tra due tabelle che condividono un nome di colonna. In questi casi, è necessario usare alias di tabella per evitare ambiguità con i riferimenti alle colonne. In caso contrario, verrà generato un errore.

Limitations

L'anteprima corrente presenta le limitazioni seguenti:

Solo dopo filtro

La ricerca vettoriale viene eseguita prima di applicare qualsiasi predicato. I predicati aggiuntivi vengono applicati solo dopo la restituzione dei vettori più simili. L'esempio seguente restituisce le prime 10 righe con incorporamenti più simili al vettore @qvdi query , quindi applica il predicato specificato nella WHERE clausola . Se nessuna delle 10 righe associate ai vettori restituiti dalla ricerca vettoriale ha la accepted colonna uguale a 1, il risultato è vuoto.

SELECT TOP (10) s.id,
                s.title,
                r.distance
FROM VECTOR_SEARCH(
         TABLE = dbo.sessions AS s,
         COLUMN = embedding,
         SIMILAR_TO = @qv,
         METRIC = 'cosine',
         TOP_N = 10
     ) AS r
WHERE accepted = 1
ORDER BY r.distance;

VECTOR_SEARCH non può essere usato nelle visualizzazioni

VECTOR_SEARCH non può essere usato nel corpo di una visualizzazione.

Examples

Esempio 1

Nell'esempio seguente vengono trovati i 10 articoli più simili a Pink Floyd music style nella wikipedia_articles_embeddings tabella .

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);

SELECT TOP (10) s.id,
                s.title,
                r.distance
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

Esempio 2

Uguale all'esempio 1, ma questa volta i vettori di query prendono da un'altra tabella anziché da una variabile.

CREATE TABLE #t
(
    id INT,
    q NVARCHAR (MAX),
    v VECTOR(1536)
);

INSERT INTO #t
SELECT id,
       q,
       AI_GENERATE_EMBEDDINGS(q USE MODEL Ada2Embeddings)
FROM (VALUES (1, N'four legged furry animal'),
             (2, N'pink floyd music style')
     ) AS S(id, q);

SELECT TOP (10) t.id,
                s.distance,
                t.title
FROM #t AS qv
    CROSS APPLY VECTOR_SEARCH(
        TABLE = [dbo].[wikipedia_articles_embeddings] AS t,
        COLUMN = [content_vector],
        SIMILAR_TO = qv.v,
        METRIC = 'cosine',
        TOP_N = 10
    ) AS s
WHERE qv.id = 2
ORDER BY s.distance;

Esempio 3

Esempio end-to-end di base che usa CREATE VECTOR INDEX e la funzione correlata VECTOR_SEARCH . Gli incorporamenti vengono fittizi. In uno scenario reale, gli incorporamenti vengono generati usando un modello di incorporamento e AI_GENERATE_EMBEDDINGS o una libreria esterna come OpenAI SDK.

Il blocco di codice seguente illustra la VECTOR_SEARCH funzione con incorporamenti fittizi:

  1. Abilita il flag di traccia, necessario nell'anteprima corrente.
  2. Creare una tabella di esempio con una colonna con tipo di dati vector(5).Create a sample table dbo.Articles with a column embedding with data type vector(5).
  3. Inserire dati di esempio con dati fittizi di incorporamento.
  4. Creare un indice vettoriale in dbo.Articles.embedding.
  5. Illustrare la ricerca di somiglianza del vettore con la VECTOR_SEARCH funzione .
-- Step 0: Enable Preview Feature
ALTER DATABASE SCOPED CONFIGURATION
SET PREVIEW_FEATURES = ON;
GO

-- Step 1: Create a sample table with a VECTOR(5) column
CREATE TABLE dbo.Articles
(
    id INT PRIMARY KEY,
    title NVARCHAR(100),
    content NVARCHAR(MAX),
    embedding VECTOR(5) -- mocked embeddings
);
GO

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

-- Step 3: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (METRIC = 'cosine', TYPE = 'diskann');
GO

-- Step 4: Perform a vector similarity search
DECLARE @qv VECTOR(5) = '[0.3, 0.3, 0.3, 0.3, 0.3]';
SELECT TOP(3)
    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;