이 페이지에서는 ANN 거리 함수를 사용하여 근사 최근접 이웃 (ANN)을 찾고 벡터 임베딩을 쿼리하는 방법을 설명합니다.
데이터 세트가 작으면 K-최근접 이웃(KNN)을 사용하여 정확한 K-최근접 벡터를 찾을 수 있습니다. 하지만 데이터 세트가 증가하면 KNN 검색의 지연 시간과 비용도 증가합니다. ANN을 사용하면 지연 시간과 비용을 크게 줄이면서 근사 K-최근접 이웃을 찾을 수 있습니다.
ANN 검색에서는 근사 거리를 계산하고 데이터 세트의 모든 벡터를 확인하지 않을 수 있으므로 k-반환 벡터가 실제 Top-K-최근접 이웃이 아닙니다. Top-K-최근접 이웃에 없는 일부 벡터가 반환되는 경우가 있습니다. 이를 리콜 손실이라고 부릅니다. 허용되는 리콜 손실 양은 사용 사례에 따라 다릅니다. 하지만 대부분의 사례에서 약간의 리콜 감소가 데이터베이스 성능 향상으로 이어진다면 합리적인 것으로 간주됩니다.
Spanner에서 지원되는 근사 거리 함수에 대한 자세한 내용은 다음 GoogleSQL 참조 페이지를 참고하세요.
벡터 임베딩 쿼리
Spanner는 벡터 색인을 사용하여 근사 최근접 이웃 (ANN) 벡터 검색 시간을 단축합니다. 벡터 색인을 사용하여 벡터 임베딩을 쿼리할 수 있습니다. 벡터 임베딩을 쿼리하려면 먼저 벡터 색인을 만들어야 합니다. 그런 다음 세 가지 근사 거리 함수 중 하나를 사용하여 ANN을 찾을 수 있습니다.
근사 거리 함수를 사용할 때의 제한사항은 다음과 같습니다.
- 근사 거리 함수는 임베딩 열과 상수 표현식(예: 파라미터 또는 리터럴) 간의 거리를 계산해야 합니다.
- 근사 거리 함수 출력은
ORDER BY
절에서 유일한 정렬 키로 사용되어야 하며LIMIT
가ORDER BY
뒤에 지정되어야 합니다. - 쿼리는 색인이 생성되지 않은 행을 명시적으로 필터링해야 합니다. 즉, 대부분의 경우 열이 테이블 정의에서 이미
NOT NULL
로 표시되어 있지 않는 한 벡터 색인 정의와 일치하는WHERE <column_name> IS NOT NULL
절이 쿼리에 포함되어야 합니다.
자세한 제한사항 목록은 근사 거리 함수 참조 페이지를 참조하세요.
예시
DocContents
바이트 열에서 미리 계산된 텍스트 임베딩의 DocEmbedding
열과 null일 수 있는 다른 소스에서 채워진 NullableDocEmbedding
열이 있는 Documents
테이블을 가정해 보겠습니다.
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocId INT64 NOT NULL,
Author STRING(1024),
DocContents BYTES(MAX),
DocEmbedding ARRAY<FLOAT32> NOT NULL,
NullableDocEmbedding ARRAY<FLOAT32>,
WordCount INT64
) PRIMARY KEY (UserId, DocId);
[1.0, 2.0, 3.0]
에 가장 가까운 벡터 100개를 검색하려면:
SELECT DocId
FROM Documents
WHERE WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], DocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
임베딩 열이 null을 허용하는 경우:
SELECT DocId
FROM Documents
WHERE NullableDocEmbedding IS NOT NULL AND WordCount > 1000
ORDER BY APPROX_EUCLIDEAN_DISTANCE(
ARRAY<FLOAT32>[1.0, 2.0, 3.0], NullableDocEmbedding,
options => JSON '{"num_leaves_to_search": 10}')
LIMIT 100
다음 단계
Spanner 벡터 색인 자세히 알아보기
GoogleSQL
APPROXIMATE_COSINE_DISTANCE()
,APPROXIMATE_EUCLIDEAN_DISTANCE()
,APPROXIMATE_DOT_PRODUCT()
함수 자세히 알아보기GoogleSQL
VECTOR INDEX
문 자세히 알아보기벡터 색인 권장사항에 대해 자세히 알아보세요.
Spanner 벡터 검색 시작하기에서 ANN 사용 단계별 예시 확인해 보기