共用方式為


VECTOR_SEARCH (Transact-SQL) (預覽)

SQL Server 2025 (17.x) 預覽

使用近似鄰近向量搜尋演算法,搜尋類似指定查詢向量的向量。 若要深入瞭解向量索引編製和向量搜尋的運作方式,以及確切和近似搜尋之間的差異,請參閱 SQL Database Engine 中的向量

預覽功能

備註

此函式處於預覽狀態,而且可能會變更。 請務必閱讀 在線服務的服務等級協定 (SLA) 中的預覽使用規定。

此功能為預覽版。 若要使用這項功能,您必須啟用下列 追蹤旗標

DBCC TRACEON(466, 474, 13981, -1)

在使用之前,請務必先查看 目前的限制

語法

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]

論點

TABLE = 物件 [AS source_table_alias]

執行搜尋的數據表。 它必須是基表。 不支持檢視表、本機和全域數據表。

COLUMN = vector_column

執行搜尋的向量數據行。 數據行必須是 向量 數據類型。

SIMILAR_TO = query_vector

用於搜尋的向量。 它必須是 向量 類型的變數或數據行。

METRIC = { 'cosine' |'dot' |'euclidean' }

用來計算查詢向量與指定數據行中向量之間的距離度量。 只有在找到具有相同計量且位於相同數據行的相符 ANN 索引時,才會使用 ANN (近似近鄰)索引。 如果沒有相容的 ANN 索引,則會引發警告,並使用 KNN (k-Nearest Neighbor) 演算法。

TOP_N = <k>

必須傳回的類似向量數目上限。 它必須是正 整數

result_table_alias

別名是用來參考結果集。

傳回結果集

傳回的結果集具有 TABLE 自變數中所指定資料表中的所有資料行,以及額外的 distance 數據行。 數據 distance 行包含 COLUMN 自變數中指定向量與 SIMILAR_TO 自變數中指定的向量之間的距離。

局限性

目前的預覽有下列限制:

僅篩選後

向量搜尋會在套用任何述詞之前發生。 只有在傳回最類似的向量之後,才會套用其他述詞。 下列範例會傳回前 10 個數據列,內嵌最類似於查詢向量 @qv,然後套用 子句中指定的 WHERE 述詞。 如果與向量搜尋所傳回的向量相關聯的 10 個數據列中沒有任何數據列等於 accepted 1,則結果會是空的。

SELECT
  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

VECTOR_SEARCH 無法在檢視主體中使用。

範例

範例 1

下列範例會尋找 10 個與 資料表中 Pink Floyd music style 最類似的文章wikipedia_articles_embeddings

DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(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

範例 2

與範例 1 相同,但這次查詢向量取自另一個數據表,而不是變數。

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')
    ) S(id, q)
;

SELECT 
    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

範例 3

使用 CREATE VECTOR INDEX 和相關 VECTOR_SEARCH 函式的基本端對端範例。 內嵌會模擬。 在真實世界的案例中,內嵌是使用內嵌模型和 AI_GENERATE_EMBEDDINGS,或 OpenAI SDK 之類的外部連結庫來產生。

下列程式代碼區塊示範 VECTOR_SEARCH 具有模擬內嵌的函式:

  1. 啟用目前預覽中必要的追蹤旗標。
  2. 使用數據類型dbo.Articles的數據行embedding建立範例數據表
  3. 使用模擬內嵌數據插入範例數據。
  4. 在上 dbo.Articles.embedding建立向量索引。
  5. 使用函式示範向量相似度搜尋 VECTOR_SEARCH
-- Step 0: Enable Preview Feature
DBCC TRACEON(466, 474, 13981, -1);
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
);

-- 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: Create a vector index on the embedding column
CREATE VECTOR INDEX vec_idx ON Articles(embedding)
WITH (metric = 'cosine', type = 'diskann');

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