근사 최근접 이웃 (ANN) 찾기 및 벡터 임베딩 쿼리

이 페이지에서는 ANN 거리 함수를 사용하여 근사 최근접 이웃 (ANN)을 찾고 벡터 임베딩을 쿼리하는 방법을 설명합니다.

데이터 세트가 작으면 K-최근접 이웃(KNN)을 사용하여 정확한 K-최근접 벡터를 찾을 수 있습니다. 하지만 데이터 세트가 증가하면 KNN 검색의 지연 시간과 비용도 증가합니다. ANN을 사용하면 지연 시간과 비용을 크게 줄이면서 근사 K-최근접 이웃을 찾을 수 있습니다.

ANN 검색에서는 근사 거리를 계산하고 데이터 세트의 모든 벡터를 확인하지 않을 수 있으므로 k-반환 벡터가 실제 Top-K-최근접 이웃이 아닙니다. Top-K-최근접 이웃에 없는 일부 벡터가 반환되는 경우가 있습니다. 이를 리콜 손실이라고 부릅니다. 허용되는 리콜 손실 양은 사용 사례에 따라 다릅니다. 하지만 대부분의 사례에서 약간의 리콜 감소가 데이터베이스 성능 향상으로 이어진다면 합리적인 것으로 간주됩니다.

Spanner에서 지원되는 근사 거리 함수에 대한 자세한 내용은 다음 GoogleSQL 참조 페이지를 참고하세요.

벡터 임베딩 쿼리

Spanner는 벡터 색인을 사용하여 근사 최근접 이웃 (ANN) 벡터 검색 시간을 단축합니다. 벡터 색인을 사용하여 벡터 임베딩을 쿼리할 수 있습니다. 벡터 임베딩을 쿼리하려면 먼저 벡터 색인을 만들어야 합니다. 그런 다음 세 가지 근사 거리 함수 중 하나를 사용하여 ANN을 찾을 수 있습니다.

근사 거리 함수를 사용할 때의 제한사항은 다음과 같습니다.

  • 근사 거리 함수는 임베딩 열과 상수 표현식(예: 파라미터 또는 리터럴) 간의 거리를 계산해야 합니다.
  • 근사 거리 함수 출력은 ORDER BY 절에서 유일한 정렬 키로 사용되어야 하며 LIMITORDER 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

다음 단계