벡터 검색 쿼리 패턴 구현

Completed

Tip

자세한 내용은 텍스트 및 이미지 탭을 참조하세요.

벡터가 저장되고 검색 전략을 선택하면 쿼리를 작성할 준비가 된 것입니다. 이 단원에서는 벡터 검색을 구동하는 T-SQL 함수를 다루며 효과적으로 결합하는 방법을 보여 줍니다.

벡터 검색 쿼리는 일반적인 패턴을 따릅니다. 쿼리 벡터를 생성하거나 검색하고, 저장된 벡터까지의 거리를 계산하고, 가장 가까운 일치 항목을 반환합니다. SQL Server는 이 패턴을 지원하기 위해 함께 작동하는 네 가지 VECTOR_DISTANCE함수를 VECTOR_SEARCHVECTOR_NORMALIZEVECTORPROPERTY제공합니다.

VECTOR_DISTANCE 사용하여 거리 계산

이 함수는 VECTOR_DISTANCE 지정한 메트릭을 사용하여 두 벡터 사이의 거리를 계산합니다. 이 함수는 가장 가까운 인접 검색을 수행하여 모든 적격 행까지의 거리를 계산합니다. 실질적으로 검색 포함을 모든 저장된 포함과 비교하여 카탈로그의 모든 제품을 확인하여 가장 일치하는 항목을 찾는 것과 같이 가장 유사한 항목을 찾습니다.

VECTOR_DISTANCE(metric, vector1, vector2)

메트릭은 'cosine', 'euclidean', 또는 'dot'이어야 합니다. 두 벡터 모두 동일한 수의 차원을 가져야 합니다.

다음은 설명 포함을 기반으로 유사한 제품을 찾는 일반적인 패턴입니다.

-- Generate an embedding for the user's search phrase
DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

SELECT TOP 10 
    ProductID,
    Name,
    VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;

이 쿼리는 두 단계로 작동합니다. 먼저 저장된 DescriptionVector 값을 생성한 동일한 모델을 사용하여 검색어 "경량 하이킹 부츠"를 임베딩으로 변환합니다. 둘째, @searchVector와 각각의 행의 DescriptionVector 사이의 코사인 거리를 계산합니다. 절은 ORDER BY Distance 가장 작은 거리(가장 유사)에서 가장 큰 간격으로 결과를 정렬하고 TOP 10 처음 10개 행만 반환합니다. 거리가 작을수록 벡터가 더 비슷하기 때문에 이 조합은 "경량 하이킹 부츠"에 가장 의미 있는 10가지 제품을 제공합니다.

VECTOR_DISTANCE를 WHERE 절에서 사용하여 특정 거리 임계값 내의 모든 벡터를 찾을 수도 있습니다.

SELECT ProductID, Name
FROM dbo.Products
WHERE VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector) < 0.3
ORDER BY VECTOR_DISTANCE('cosine', @searchVector, DescriptionVector);

이 방법은 고정 횟수를 반환하는 대신 유사성 임계값 내의 모든 제품을 찾습니다. 0.3 값은 단지 예시일 뿐입니다. 코사인 거리 범위는 0(동일한 벡터)에서 2(완전히 반대)이지만 "비슷한 정도"로 계산되는 것은 전적으로 데이터 및 포함 모델에 따라 달라집니다. 적절한 임계값을 찾으려면 테스트 쿼리를 실행하고, 결과의 거리 값을 검사하고, 관련 결과가 중지되고 노이즈가 시작되는 위치를 식별합니다. 모든 항목이 고정된 결과 수가 아닌 품질 표시줄을 충족하려는 경우 이 패턴을 사용합니다.

대략적인 검색에 VECTOR_SEARCH 사용

테이블이 수만 개의 행을 초과하면 모든 행까지의 거리를 계산하는 속도가 느려집니다. 이 함수는 VECTOR_SEARCH 벡터 인덱스를 사용하여 근사한 인접 항목을 빠르게 찾습니다.

VECTOR_SEARCH(
    TABLE = object AS alias,
    COLUMN = vector_column,
    SIMILAR_TO = query_vector,
    METRIC = 'cosine' | 'euclidean' | 'dot',
    TOP_N = k
)

이 함수는 원본 테이블의 모든 열과 distance 열을 포함하는 결과 집합을 반환합니다. 사용하는 방법은 다음과 같습니다.

DECLARE @searchVector VECTOR(1536);
SELECT @searchVector = AI_GENERATE_EMBEDDINGS('lightweight hiking boots' USE MODEL MyEmbeddingModel);

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
ORDER BY s.distance;

이 함수는 가장 가까운 약 10개의 인접 항목을 반환합니다. DescriptionVector에 동일한 메트릭을 가진 일치하는 벡터 인덱스가 존재하면, VECTOR_SEARCH은 빠른 검색을 위해 이를 사용합니다. 인덱스가 없으면 정확한 검색으로 대체되고 경고가 발생합니다.

사후 필터링을 신중하게 처리

VECTOR_SEARCH 은 이전 항목이 아닌 가장 가까운 인접 항목을 먼저 찾은 다음 WHERE 절의 조건을 적용합니다. 다음 쿼리를 살펴보십시오.

SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 10
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;

이 쿼리는 먼저 모든 범주에서 가장 가까운 10개의 벡터를 찾은 다음 범주 5로만 필터링합니다. 가장 가까운 10개 제품 중 범주 5에 속하지 않으면 결과가 표시되지 않습니다. 이 문제를 해결하려면 필요한 것보다 더 많은 후보자를 요청합니다.

SELECT TOP 10 t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
    TABLE = dbo.Products AS t,
    COLUMN = DescriptionVector,
    SIMILAR_TO = @searchVector,
    METRIC = 'cosine',
    TOP_N = 50
) AS s
WHERE t.CategoryID = 5
ORDER BY s.distance;

필터링 후 50명의 VECTOR_SEARCH 후보자를 요청한 다음 상위 10위 안에 들면 대상 범주에 충분한 결과가 있을 가능성이 높습니다.

일관된 비교를 위해 벡터 정규화

다양한 포함 모델은 길이가 다른 벡터를 생성합니다(크기). 여러 원본의 벡터를 비교하거나 모델이 출력을 정규화하지 않는 경우 벡터를 단위 길이로 스케일링하는 데 사용할 VECTOR_NORMALIZE 수 있습니다.

VECTOR_NORMALIZE(vector, norm_type)

norm_type은 다음과 같을 수 있습니다.

  • 'norm2': 유클리드 표준(가장 일반적)
  • 'norm1': 절대값의 합계
  • 'norminf': 최대 절대값
DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORMALIZE(@v, 'norm2') AS NormalizedVector;
-- Returns: [0.6, 0.8, 0.0]

정규화를 통해 코사인 거리와 점 제품이 일관되게 작동합니다. 대부분의 최신 포함 모델(예: OpenAI의 모델)은 정규화된 벡터를 생성하므로 이 단계가 필요하지 않은 경우가 많습니다. 그러나 정규화되지 않은 모델의 포함을 사용하는 경우 저장하거나 비교하기 전에 적용 VECTOR_NORMALIZE 하면 일관된 유사성 점수가 보장됩니다.

관련 VECTOR_NORM 함수를 사용하여 벡터의 크기를 계산할 수 있습니다.

DECLARE @v VECTOR(3) = '[3, 4, 0]';
SELECT VECTOR_NORM(@v, 'norm2') AS Magnitude;
-- Returns: 5.0

VECTORPROPERTY를 사용하여 벡터 검사

함수는 VECTORPROPERTY 벡터에 대한 메타데이터를 반환합니다. 이 메타데이터는 데이터의 유효성을 검사하거나 차원 불일치를 디버깅하는 데 유용합니다.

VECTORPROPERTY(vector, property)

다음 두 가지 속성이 지원됩니다.

  • 'Dimensions': 차원 수를 정수로 반환합니다.
  • 'BaseType': 데이터 형식 이름(현재 항상 float)을 반환합니다.
DECLARE @v VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT VECTORPROPERTY(@v, 'Dimensions') AS Dims;
-- Returns: 1536

이 함수는 벡터에 차원이 일치하지 않을 수 있는 쿼리 문제를 해결할 때 도움이 됩니다. 다른 포함 모델을 사용할 때 발생하는 일반적인 문제입니다.

시나리오에 적합한 함수 선택

각 함수는 벡터 검색에서 고유한 용도로 사용됩니다.

시나리오 기능 사용 시기
작은 데이터 세트 또는 필터링된 쿼리 VECTOR_DISTANCE 벡터 수가 50,000개 미만이거나 WHERE 절을 통해 후보군이 대폭 축소되는 경우
벡터 인덱스가 있는 큰 데이터 세트 VECTOR_SEARCH 속도가 중요한 경우 수십만 개의 벡터 이상
다른 모델의 벡터 비교 VECTOR_NORMALIZE 원본 포함이 다양하거나 모델이 정규화된 벡터를 생성하지 않는 경우
벡터 데이터 유효성 검사 VECTORPROPERTY 문제 해결 또는 데이터 유효성 검사 중 차원 확인

주요 내용

SQL의 벡터 검색 쿼리는 예측 가능한 패턴을 따릅니다. 쿼리 벡터를 준비하고, (정확한) 또는 (근사치) 및 VECTOR_DISTANCE 거리별 순서를 사용하여 VECTOR_SEARCH 인접 항목을 찾습니다. VECTOR_NORMALIZE 및 VECTORPROPERTY은/는 데이터 품질과 일관성을 지원합니다. VECTOR_SEARCH 가 최인접 항목을 찾은 후 필터를 적용하므로, WHERE 절과 함께 사용할 때는 필요한 것보다 더 많은 후보를 요청해야 합니다. 다음 단원에서는 하이브리드 쿼리에서 벡터 검색을 전체 텍스트 검색과 결합하는 방법을 알아봅니다.