적용 대상: SQL Server 2025(17.x)
Microsoft Fabric에서Azure SQL Database
Azure SQL Managed Instance
SQL 데이터베이스 미리 보기
벡터는 일부 데이터에 대한 정보를 나타낼 수 있는 정렬된 숫자 배열(일반적으로 부동 소수)입니다. 예를 들어 이미지를 픽셀 값의 벡터로 표시하거나 텍스트 문자열을 ASCII 값의 벡터로 나타낼 수 있습니다. 데이터를 벡터로 변환하는 프로세스를 벡터화라고 합니다.
비고
- 벡터는 미리 보기로 지원되며 변경될 수 있습니다. 온라인 서비스에 대한 SLA(서비스 수준 계약)에서 미리 보기 사용 약관을 읽어야 합니다.
- 벡터 기능은 Always-up-to-date 정책으로 구성된 Azure SQL Managed Instance에서 사용할 수 있습니다.
임베딩
포함은 데이터의 중요한 기능을 나타내는 벡터입니다. 임베딩은 딥 러닝 모델을 사용하여 학습되는 경우가 많으며, 기계 학습 및 인공지능(AI) 모델은 이를 기능으로 활용합니다. 포함은 유사한 개념 간의 의미 체계 유사성을 캡처할 수도 있습니다. 예를 들어 단어 person
및 human
에 대한 포함을 생성할 때 단어가 의미상 유사하므로 해당 포함(벡터 표현)이 값에서 유사할 것으로 예상합니다.
Azure OpenAI는 텍스트 데이터에서 포함을 만들기 위한 모델을 제공합니다. 서비스는 텍스트를 토큰으로 나누고 OpenAI에서 미리 학습한 모델을 사용하여 포함을 생성합니다. 자세한 내용은 Azure OpenAI를 사용하여 임베드 만들기를 참조하세요.
임베딩이 생성이 완료되면 SQL Server 데이터베이스에 저장할 수 있습니다. 이를 통해 임베딩을 나타내는 데이터와 함께 저장하고 벡터 검색 쿼리를 수행하여 유사한 데이터 요소를 찾을 수 있습니다.
벡터 검색
벡터 검색은 특정 쿼리 벡터와 유사한 데이터 세트의 모든 벡터를 찾는 프로세스를 나타냅니다. 따라서 단어 human
에 대한 쿼리 벡터는 전체 데이터 세트에서 유사한 벡터를 검색하므로 유사한 단어를 검색합니다. 이 예제에서는 단어를 person
가까운 일치 항목으로 찾아야 합니다. 이 근접성 또는 거리는 코사인 거리와 같은 거리 메트릭을 사용하여 측정됩니다. 벡터가 가까울수록 더 유사합니다.
SQL Server는 벡터 데이터 형식을 통해 벡터에 대한 기본 제공 지원을 제공합니다. 벡터는 최적화된 이진 형식으로 저장되지만 편의를 위해 JSON 배열로 노출됩니다. 벡터의 각 요소는 단정밀도(4바이트) 부동 소수점 값을 사용하여 저장됩니다. 데이터 형식과 함께 벡터에서 작동하는 전용 함수가 있습니다. 예를 들어 VECTOR_DISTANCE 함수를 사용하여 두 벡터 사이의 거리를 찾을 수 있습니다. 이 함수는 지정한 거리 메트릭에 따라 두 벡터 사이의 거리가 있는 스칼라 값을 반환합니다.
벡터는 일반적으로 부동 소수 자릿수 배열로 관리되므로 벡터 만들기는 단순히 JSON 배열을 벡터 데이터 형식으로 캐스팅하기만 하면 됩니다. 예를 들어 다음 코드는 JSON 배열에서 벡터를 만듭니다.
SELECT
CAST('[1.0, -0.2, 30]' AS VECTOR(3)) AS v1,
CAST(JSON_ARRAY(1.0, -0.2, 30) AS VECTOR(3)) AS v2;
암시적 캐스팅을 사용하거나
DECLARE @v1 VECTOR(3) = '[1.0, -0.2, 30]';
DECLARE @v2 VECTOR(3) = JSON_ARRAY(1.0, -0.2, 30);
SELECT @v1 as v1, @v2 as v2;
벡터를 JSON 배열로 변환하는 경우도 마찬가지입니다.
DECLARE @v VECTOR(3) = '[1.0, -0.2, 30]';
SELECT
CAST(@v AS NVARCHAR(MAX)) AS s,
CAST(@v AS JSON) AS j
정확한 검색 및 벡터 거리(정확히 가장 가까운 이웃)
k-NN(k-Nearest Neighbor) 검색이라고도 하는 정확한 검색에는 지정된 벡터와 데이터 세트의 다른 모든 벡터 사이의 거리를 계산하고, 결과를 정렬하고, 지정된 거리 메트릭에 따라 가장 가까운 인접 항목을 선택하는 작업이 포함됩니다. 이 메서드는 가장 가까운 인접 항목의 정확한 검색을 보장하지만 특히 큰 데이터 세트의 경우 계산 집약적일 수 있습니다.
벡터 거리 함수는 벡터 간의 근접성을 측정하는 데 사용됩니다. 일반적인 거리 메트릭에는 유클리드 거리, 코사인 유사성 및 점 제품이 포함됩니다. 이러한 함수는 k-NN 검색을 수행하고 정확한 결과를 보장하는 데 필수적입니다.
정확한 ENN(인접 항목) 벡터 검색은 모든 인덱싱된 벡터에서 전체 거리 계산을 수행하여 지정된 거리 메트릭을 기반으로 가장 가까운 인접 항목의 검색을 보장합니다. 이 메서드는 정확하지만 리소스를 많이 사용하므로 정확도가 가장 중요한 더 작은 데이터 세트 또는 시나리오에 적합합니다.
SQL Database 엔진에서 k-NN 검색은 VECTOR_DISTANCE 함수를 사용하여 수행할 수 있습니다. 이를 통해 벡터 간 거리를 효율적으로 계산하고 가장 가까운 인접 항목을 쉽게 검색할 수 있습니다.
다음 예제에서는 k-NN을 수행하여 테이블에 저장된 content_vector
가장 유사한 상위 10개의 벡터를 지정된 쿼리 벡터 @qv
로 반환하는 방법을 보여 줍니다.
DECLARE @qv VECTOR(1536) = AI_GENERATE_EMBEDDING(N'Pink Floyd music style' USE MODEL Ada2Embeddings);
SELECT TOP (10) id, VECTOR_DISTANCE('cosine', @qv, [content_vector]) AS distance, title
FROM [dbo].[wikipedia_articles_embeddings]
ORDER BY distance
검색할 벡터가 많지 않은 경우(일반적인 권장 사항으로 50,000개 미만의 벡터) 정확한 검색을 사용하는 것이 좋습니다. 검색 조건자가 인접 검색에 사용할 벡터 수를 50,000개 이하로 줄이는 한 테이블에 더 많은 벡터가 포함될 수 있습니다.
근사 벡터 인덱스 및 벡터 검색(근사 최근접 이웃)
지정된 쿼리 벡터에 가까운 모든 벡터를 식별하려면 쿼리 벡터와 테이블에 저장된 벡터 사이의 거리를 계산하는 데 상당한 리소스가 필요합니다. 지정된 쿼리 벡터에 가까운 모든 벡터를 검색하려면 테이블의 전체 검사와 상당한 CPU 사용량이 포함됩니다. 이를 "K-가장 가까운 인접" 또는 "KNN" 쿼리라고 하며 가장 가까운 "k" 벡터를 반환합니다.
벡터는 사용자 쿼리에 응답하기 위해 AI 모델에 대한 유사한 데이터를 찾는 데 사용됩니다. 여기에는 점(내부) 제품, 코사인 유사성 또는 유클리드 거리와 같은 거리 메트릭을 사용하여 쿼리 벡터에 가장 가까운 "k" 벡터에 대한 데이터베이스 쿼리가 포함됩니다.
KNN 쿼리는 확장성에 어려움을 겪는 경우가 많기 때문에 많은 경우 상당한 속도 향상을 위해 일부 정확도, 특히 회수를 절상하는 것이 허용됩니다. 이 메서드는 근사 최근접 이웃(ANN)으로 알려진 메서드입니다.
회수는 벡터와 임베딩을 사용하거나 사용하려는 모든 사용자에게 익숙해져야 할 중요한 개념입니다. 실제로 리콜은 철저한 검색이 반환하는 정확한 최근접 이웃과 비교하여 알고리즘이 식별한 근사 최근접 이웃의 비율을 측정합니다. 따라서 알고리즘이 수행하는 근사치의 품질을 잘 측정합니다. 근사치가 전혀 없는 완벽한 재현율은 1입니다.
AI 애플리케이션의 경우 절충안이 매우 합리적입니다. 벡터 임베딩은 이미 개념을 대략적으로 표현하기 때문에 재현율이 1에 가까우면 ANN을 사용해도 결과에 크게 영향을 미치지 않습니다. 이렇게 하면 반환된 결과가 KNN의 결과와 매우 유사하지만 성능이 크게 향상되고 리소스 사용량이 크게 감소하므로 운영 데이터베이스에 매우 유용합니다.
벡터 인덱스를 참조하는 데 사용할 때 "index"라는 용어는 관계형 데이터베이스에서 작업하는 데 사용되는 인덱스와 다른 의미를 갖는다는 것을 이해하는 것이 중요합니다. 실제로 벡터 인덱스가 대략적인 결과를 반환합니다.
MSSQL 엔진에서 벡터 인덱스는 DiskANN 알고리즘을 기반으로 합니다. DiskANN은 그래프를 만들어 모든 인덱싱된 벡터를 빠르게 탐색하여 지정된 벡터와 가장 가까운 일치 항목을 찾습니다. DiskANN은 제한된 계산 리소스를 사용하여 큰 벡터 데이터 집합을 인덱싱하고 검색하기 위한 그래프 기반 시스템입니다. SSD와 최소 메모리를 효율적으로 사용하여 메모리 내 인덱스보다 훨씬 더 많은 데이터를 처리하는 동시에 QPS(초당 높은 쿼리 수)와 짧은 대기 시간을 유지하여 메모리, CPU 및 I/O 사용량과 검색 성능 간의 균형을 유지합니다.
근사한 인접 알고리즘 검색은 먼저 CREATE VECTOR INDEX T-SQL 명령을 사용하여 벡터 인덱스를 만든 다음 VECTOR_SEARCH T-SQL 함수를 사용하여 대략적인 검색을 실행할 수 있습니다.
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