벡터 검색을 위한 SQL 준비
Tip
자세한 내용은 텍스트 및 이미지 탭을 참조하세요.
벡터 검색을 실행하려면 데이터베이스에 벡터를 저장하고 해당 검색 실행 방법을 결정해야 합니다. 이 단원에서는 첫 번째 벡터 쿼리를 작성하기 전에 내리는 디자인 결정에 대해 설명합니다.
벡터 검색은 정확한 일치가 아닌 수학 유사성을 기반으로 행을 찾습니다. 이 작업을 수행하려면 임베딩을 벡터로 저장하고, 유사성을 측정하는 방법을 선택하고, 모든 벡터를 정확하게 검색할지 아니면 인덱스를 사용하여 더 빠른 근사 결과를 생성할지 결정합니다.
벡터 데이터 형식을 사용하여 벡터 저장
SQL Server 및 Azure SQL Database는 포함을 저장하도록 설계된 네이티브 벡터 데이터 형식을 제공합니다. 각 벡터는 최적화된 이진 형식으로 저장되지만 편의를 위해 JSON 배열로 노출되는 부동 소수점 숫자의 배열입니다.
벡터 열을 정의할 때 차원 수를 지정합니다.
CREATE TABLE dbo.Products
(
ProductID INT PRIMARY KEY,
Name NVARCHAR(100),
Description NVARCHAR(MAX),
DescriptionVector VECTOR(1536) NOT NULL
);
괄호 안의 숫자는 포함 모델이 생성하는 차원과 일치합니다. 예를 들어 OpenAI의 text-embedding-3-small 모델은 1,536개의 차원을 생성하므로, 이를 위해 설정해야 하는 열은 VECTOR(1536)입니다. 지원되는 최대 크기는 1,998차원입니다.
각 요소는 4바이트 단정밀도 부동 소수점으로 저장됩니다. 1,536차원 벡터는 행당 약 6KB를 사용합니다. 테이블을 디자인할 때 데이터가 증가함에 따라 이 열이 스토리지 및 메모리에 미치는 영향을 고려합니다.
거리 메트릭 이해
벡터 검색은 벡터 간의 거리를 계산하여 작동합니다. 더 가까이 있는 벡터는 더 유사한 개념을 나타냅니다. SQL Server는 세 가지 거리 메트릭을 지원합니다.
코사인 거리는 크기를 무시하고 벡터 사이의 각도를 측정합니다. 동일한 방향을 가리키는 두 벡터는 길이에 관계없이 코사인 거리가 0입니다. 이 메트릭은 강도가 아니라 의미 방향에 관심이 있을 때 잘 작동합니다. 코사인 거리 범위는 0(동일)에서 2(반대)입니다.
유클리드 거리는 벡터 공간에서 두 점 사이의 직선 거리를 측정합니다. 방향과 크기를 모두 고려합니다. 유클리드 거리 범위는 0(동일)에서 무한대까지입니다.
점 제품은 요소별 제품의 합계를 계산합니다. SQL Server는 값이 작을수록 다른 메트릭과 일치하는 더 유사한 벡터를 나타내도록 음수 점 제품을 반환합니다.
대부분의 포함 모델은 코사인 유사성에 최적화되어 코사인 거리를 일반적인 선택으로 만듭니다. 그러나 최적의 지표는 임베딩이 학습된 방법에 따라 달라집니다.
정확한 검색과 근사 검색 중에서 선택
비슷한 벡터를 검색할 때는 정확한 ENN(인접 항목) 검색과 가장 가까운 인접 항목(ANN) 검색의 두 가지 옵션이 있습니다.
가장 가까운 인접 항목 검색 은 쿼리 벡터를 테이블의 모든 벡터와 비교합니다. 가장 정확한 결과를 보장하지만 모든 행까지의 거리를 계산해야 합니다.
VECTOR_DISTANCE 기능을 사용하여 정확하게 검색합니다.
DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT TOP 10 ProductID, Name,
VECTOR_DISTANCE('cosine', @query, DescriptionVector) AS Distance
FROM dbo.Products
ORDER BY Distance;
이 쿼리는 모든 행 @query사이의 DescriptionVector 코사인 거리를 계산한 다음 가장 가까운 10개의 일치 항목을 반환합니다. 작은 테이블(일반적인 지침으로 50,000개 미만의 벡터)의 경우 정확한 검색이 잘 수행됩니다.
근사한 인접 검색 에서는 벡터 인덱스를 사용하여 모든 행을 검사하지 않고도 비슷한 벡터를 찾습니다. 그것은 정확성을 완벽하게 유지하는 대신 속도를 우선시하여, 거의 정확한 결과를 제공하지만, 반드시 가장 가까운 이웃이 된다는 보장은 하지 않습니다.
다음을 사용하여 CREATE VECTOR INDEX벡터 인덱스 만들기
CREATE VECTOR INDEX idx_Products_DescriptionVector
ON dbo.Products(DescriptionVector)
WITH (METRIC = 'cosine', TYPE = 'DiskANN');
SQL Server는 가까운 벡터로 빠르게 탐색할 수 있는 그래프 구조를 빌드하는 DiskANN 알고리즘을 사용합니다. 인덱스가 존재하면 VECTOR_SEARCH 함수를 사용하여 근사 검색을 수행합니다.
DECLARE @query VECTOR(1536) = '[0.1, 0.2, ...]';
SELECT t.ProductID, t.Name, s.distance
FROM VECTOR_SEARCH(
TABLE = dbo.Products AS t,
COLUMN = DescriptionVector,
SIMILAR_TO = @query,
METRIC = 'cosine',
TOP_N = 10
) AS s
ORDER BY s.distance;
각 방법을 사용할 시기 결정
정확한 검색과 대략적인 검색 간의 선택은 데이터 세트 크기 및 정확도 요구 사항에 따라 달라집니다.
다음과 같은 경우 정확한 검색(VECTOR_DISTANCE)을 사용합니다.
- 테이블에 50,000개 미만의 벡터가 있습니다.
- 쿼리 필터는 후보 집합을 몇 개의 행으로 줄입니다.
- 정확한 결과가 보장되어야 하며 더 긴 쿼리 시간을 허용할 수 있습니다.
다음과 같은 경우 대략적인 검색(인덱스와 VECTOR_SEARCH)을 사용합니다.
- 테이블에는 수십만 또는 수백만 개의 벡터가 있습니다.
- 쿼리 속도는 완벽한 정확도보다 중요합니다.
- 가장 가까운 이웃을 발견할 수 있도록 1에 가까운 리콜 값이 허용됩니다.
재현율은 근사 검색이 정확한 검색 대비 실제 가장 가까운 이웃 중 몇 개를 올바르게 반환하는지를 나타내는 지표입니다. DiskANN은 일반적으로 높은 재현율을 달성합니다. 즉, 그 결과는 정확한 검색 결과에 매우 가깝습니다.
인덱스 제한 사항 고려
SQL Server의 벡터 인덱스에는 다음 사항에 유의해야 하는 특정 요구 사항이 있습니다.
- 테이블에 클러스터형 인덱스가 있는 단일 열 정수 기본 키가 있어야 합니다.
- 인덱스가 있는 동안 벡터 인덱스가 있는 테이블은 읽기 전용이 됩니다. 데이터를 수정하려면 인덱스를 삭제한 다음 다시 만들어야 합니다.
- 벡터 인덱스를 분할할 수 없습니다.
비고
벡터 인덱스는 현재 미리 보기로 제공됩니다. Microsoft Fabric의 Azure SQL Database 및 SQL 데이터베이스에서는 ALLOW_STALE_VECTOR_INDEX 데이터베이스 범위 구성 ON 을 통해 쓰기 작업을 허용할 수 있으나, 인덱스를 재구성하기 전까지는 새로운 데이터가 반영되지 않습니다. 이 옵션은 현재 SQL Server 2025에서 사용할 수 없습니다. 이러한 제한 사항에 대한 최신 내용은 현재 설명서를 확인하세요.
이러한 제한 사항은 테이블 및 유지 관리 워크플로를 디자인하는 방법에 영향을 줍니다. 자주 변경되는 테이블의 경우 데이터가 안정화될 때까지 정확한 검색을 사용한 다음 벡터 인덱스를 추가할 수 있습니다.
주요 내용
벡터 검색을 위해 SQL을 준비한다는 것은 사용할 데이터 형식 및 차원, 포함 모델과 일치하는 거리 메트릭, 정확한 검색 또는 근사 검색이 데이터 세트 크기에 적합한지 여부 등 세 가지 결정을 내리는 것을 의미합니다. 정확한 검색은 VECTOR_DISTANCE 더 작은 데이터 세트 또는 필터링된 쿼리에 적합하지만 근사 검색과 VECTOR_SEARCH DiskANN 인덱스는 더 큰 데이터 세트를 효율적으로 처리합니다. 다음 단원에서는 벡터 검색을 실행하기 위한 특정 함수 및 쿼리 패턴을 알아봅니다.