Spanner Omni의 벡터 검색은 고성능의 내장 기능으로, 고차원 벡터 데이터에 대한 시맨틱 검색과 유사성 매칭을 지원합니다. 트랜잭션 데이터베이스 내에 직접 벡터 임베딩을 저장하고 색싱함으로써 Spanner Omni는 별도의 벡터 데이터베이스와 복잡한 추출, 변환, 로드 (ETL) 파이프라인을 없애줍니다.
이 문서의 주제는 Spanner에 적용되는 방식과 동일하게 Spanner Omni에도 적용됩니다.
벡터 검색 개요
벡터 검색을 사용하면 데이터를 숫자 벡터 (임베딩)로 표현하여 의미적으로 유사한 항목을 찾을 수 있습니다. Spanner Omni는 다음과 같은 두 가지 기본 검색 방법을 지원합니다.
K-최근접 이웃 (KNN): 쿼리와 데이터 세트의 모든 벡터 간 거리를 계산하여 정확한 검색을 실행합니다. 재현율이 가장 높지만 대규모 데이터 세트의 경우 계산 비용이 많이 들 수 있습니다.
근사 최근접 이웃 (ANN): 벡터 색인을 사용하여 대규모 데이터 세트에서 빠르게 일치 항목을 찾습니다. 속도와 확장성을 높이기 위해 정확성 (재현율)을 약간 포기합니다.
벡터 검색은 다른 기능과 결합할 때 특히 강력합니다.
| 조합 | 이점 |
|---|---|
| SQL 필터링을 사용한 벡터 검색 | 벡터 검색과 필터를 효율적으로 결합합니다 (예: '카테고리가 '신발'이고 가격이 100 미만인 유사한 이미지 찾기'). |
| 벡터 검색 + 전체 텍스트 검색 | 상호 순위 융합 (RRF)을 사용하여 시맨틱 유사성과 키워드 정확성을 결합하여 검색 관련성을 개선하세요. |
| 벡터 + 그래프 | 벡터 검색을 사용하여 속성 그래프에서 관련 진입점 (노드)을 찾은 다음 복잡한 관계를 탐색합니다. |
자세한 내용은 Spanner 문서의 Spanner 벡터 검색 개요를 참고하세요.
K-최근접 이웃 검색 실행
Spanner Omni는 내장 거리 함수를 사용하여 K-최근접 이웃 (KNN) 검색을 지원합니다. 벡터 임베딩을 입력 매개변수로 제공하여 N차원 공간에서 가장 가까운 벡터를 찾을 수 있습니다.
다음 거리 함수를 사용할 수 있습니다.
COSINE_DISTANCE(): 두 벡터 간 각도의 코사인을 측정합니다.EUCLIDEAN_DISTANCE(): 두 벡터 간의 최단 직선 거리를 측정합니다.DOT_PRODUCT(): 벡터 크기의 곱에 각도의 코사인 값을 곱하여 계산합니다 (정규화된 데이터에 적합).
자세한 내용은 Spanner 문서의 K-최근접 이웃을 찾아 벡터 유사성 검색 수행을 참고하세요.
최적의 벡터 거리 함수 선택
적절한 거리 함수를 선택하는 것은 데이터와 임베딩을 생성하는 데 사용된 모델에 따라 달라집니다.
| 함수 | 설명 | 유사성 증가와의 관계 |
|---|---|---|
| 내적 | 각도에 해당 벡터 크기의 곱을 곱하여 코사인을 계산합니다. | 증가 |
| 코사인 거리 | 두 벡터 간 각도의 코사인 (1 - 코사인 유사도)을 측정합니다. | 감소 |
| 유클리드 거리 | 두 벡터 간의 직선 거리를 측정합니다. | 감소 |
임베딩이 정규화된 경우 (크기 = 1.0) 일반적으로 DOT_PRODUCT()가 효율적인 선택입니다. 정규화되지 않은 데이터의 경우 COSINE_DISTANCE() 또는 EUCLIDEAN_DISTANCE()를 실험하여 사용 사례에 더 나은 결과를 제공하는 방식을 결정하세요.
자세한 내용은 Spanner 문서의 벡터 거리 함수 중에서 선택을 참고하세요.
근사 최근접 이웃(ANN)
ANN 검색은 정확한 KNN 검색이 너무 느리거나 비용이 많이 드는 매우 큰 데이터 세트를 위해 설계되었습니다. 벡터 색인을 사용하여 재현율을 약간만 낮추고 빠른 결과를 제공합니다.
Spanner Omni의 근사 최근접 이웃 (ANN) 검색은 길이가 최대 128차원인 벡터에 대해 최대 100만 개의 벡터로 구성된 데이터 세트를 지원합니다. 벡터의 차원이 많을수록 지원되는 벡터 수가 비례적으로 감소합니다.
벡터 색인으로 ANN 검색 실행
ANN 검색을 실행하려면 APPROX_COSINE_DISTANCE(), APPROX_EUCLIDEAN_DISTANCE() 또는 APPROX_DOT_PRODUCT()과 같은 근사 거리 함수를 사용합니다. 이러한 함수에는 다음이 필요합니다.
임베딩 열의 기존 벡터 색인입니다.
근사 거리 함수를 사용하는
ORDER BY절결과의 수를 지정하는
LIMIT절
자세한 내용은 Spanner 문서의 근사 최근접 이웃 (ANN) 찾기 및 벡터 임베딩 쿼리를 참고하세요.
벡터 색인 만들기 및 관리
벡터 색인을 만들 때는 삽입 열의 vector_length를 지정해야 하며 STORING 절을 사용하여 더 빠른 필터링을 위해 추가 열을 포함할 수 있습니다.
다음은 벡터 색인을 만드는 방법의 예입니다.
CREATE VECTOR INDEX INDEX_NAME
ON TABLE_NAME(EMBEDDING_COLUMN)
OPTIONS (distance_type = 'DISTANCE_TYPE', tree_depth = 2, num_leaves = 1000);
자세한 내용은 Spanner 문서의 벡터 색인 만들기 및 관리를 참고하세요.
벡터 색인 생성 권장사항
높은 검색 성능과 재현율을 유지하려면 다음을 따르세요.
색인 옵션 조정: 데이터 크기 및 성능 요구사항에 따라
num_leaves및num_leaves_to_search를 조정합니다.정기적으로 다시 빌드: 시간 경과에 따라 벡터의 분포가 크게 변경되는 경우 색인을 다시 빌드합니다.
필터링 효과적으로 사용: 검색 효율성을 높이기 위해 자주 필터링되는 열을 색인에 저장합니다.
자세한 내용은 Spanner 문서의 벡터 색인 권장사항을 참고하세요.