Поделиться через


VECTOR_SEARCH (Transact-SQL) (предварительная версия)

Applies to: SQL Server 2025 (17.x) Preview

Используется VECTOR_SEARCH для поиска векторов, аналогичных заданным векторам запроса, с помощью приблизительного алгоритма поиска векторов ближайших соседей. Дополнительные сведения о том, как работает индексирование векторов и поиск векторов, а также различия между точным и приблизительным поиском, см. в статье "Обзор векторного поиска и векторных индексов в ядро СУБД SQL".

Preview feature

Note

Эта функция находится в предварительной версии и подлежит изменению. Не забудьте прочитать условия использования предварительной версии в соглашениях об уровне обслуживания (SLA) для веб-служб.

Эта функция предоставляется в виде предварительной версии. In order to use this feature, you must enable the following trace flags:

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

Make sure to check out the current limitations before using it.

Syntax

Соглашения о синтаксисе 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 = объект [AS source_table_alias]

Таблица, в которой выполняется поиск. Она должна быть базовой таблицей. Представления, временные таблицы, как локальные, так и глобальные, не поддерживаются.

COLUMN = vector_column

Векторный столбец, в котором выполняется поиск. The column must be a vector data type.

SIMILAR_TO = query_vector

Вектор, используемый для поиска. It must be a variable or a column of vector type.

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

Метрика расстояния, используемая для вычисления расстояния между вектором запроса и векторами в указанном столбце. Индекс ANN (Приблизительный ближайший сосед) используется только в том случае, если найден соответствующий индекс ANN с той же метрикой и на том же столбце. Если нет совместимых индексов ANN, возникает предупреждение и используется алгоритм KNN (k-Ближайший сосед).

TOP_N = <k>

Максимальное количество аналогичных векторов, которые должны быть возвращены. It must be a positive integer.

result_table_alias

Псевдоним используется для ссылки на результирующий набор.

Возврат результирующий набор

Возвращаемый результирующий набор содержит все столбцы из таблицы, указанной в аргументе TABLE, а также дополнительный distance столбец. Столбец distance содержит расстояние между заданным вектором в аргументе COLUMN и вектором, указанным в аргументе SIMILAR_TO.

Limitations

Текущая предварительная версия имеет следующие ограничения:

Post-filtering only

Поиск вектора происходит перед применением любого предиката. Дополнительные предикаты применяются только после возврата наиболее похожих векторов. В следующем примере возвращаются первые 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 нельзя использовать в тексте представления.

Examples

Example 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

Example 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

Example 3

Базовый комплексный пример использования CREATE VECTOR INDEX и связанной VECTOR_SEARCH функции. Внедренные макеты издеваются. In a real world scenario, embeddings are generated using an embedding model and AI_GENERATE_EMBEDDINGS, or an external library such as OpenAI SDK.

Следующий блок кода демонстрирует функцию VECTOR_SEARCH с макетами внедрения:

  1. Включает флаг трассировки, необходимый в текущей предварительной версии.
  2. Create a sample table dbo.Articles with a column embedding with data type vector(5).
  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;