벡터 색인 만들기 및 관리

이 페이지에서는 근사 최근접 이웃 (ANN) 검색과 트리 기반 구조를 사용하여 데이터의 벡터 유사성 검색을 가속화하는 Spanner 벡터 색인을 만들고 관리하는 방법을 설명합니다.

Spanner는 특수한 벡터 색인을 사용하여 근사 최근접 이웃 (ANN) 벡터 검색 시간을 단축합니다. 이 색인은 매우 효율적인 최근접 이웃 알고리즘인 Google 연구팀의 확장 가능한 최근접 이웃 (ScaNN)을 활용합니다.

벡터 색인은 트리 기반 구조를 사용해서 데이터를 파티셔닝하고 더 빠른 검색을 지원합니다. Spanner는 2단계 및 3단계 트리 구성을 모두 제공합니다.

  • 2단계 트리 구성: 리프 노드(num_leaves)에 해당 중심과 함께 밀접하게 관련된 벡터 그룹이 포함됩니다. 루트 레벨은 모든 리프 노드의 중심으로 구성됩니다.
  • 3단계 트리 구성: 2단계 트리와 개념이 비슷하지만 리프 노드 중심이 추가로 파티셔닝되어 루트 레벨(num_leaves)을 구성하는 추가 브랜치 레이어(num_branches)가 도입되었습니다.

Spanner에서 색인을 자동으로 선택합니다. 하지만 특정 색인이 가장 효과적이라는 것을 알고 있으면 FORCE_INDEX 힌트를 사용하여 사용 사례에 가장 적합한 벡터 색인을 사용할 수 있습니다.

자세한 내용은 VECTOR INDEX을 참조하세요.

제한사항

  • 벡터 색인을 사전 분할할 수 없습니다. 자세한 내용은 사전 분할 개요를 참조하세요.

벡터 색인 만들기

벡터 색인의 재현율과 성능을 최적화하려면 다음을 수행하는 것이 좋습니다.

  • 임베딩이 포함된 대부분의 행이 데이터베이스에 작성된 후에 벡터 색인을 만듭니다. 또한 새 데이터를 삽입한 후 벡터 색인을 주기적으로 다시 빌드해야 할 수 있습니다. 자세한 내용은 벡터 색인 다시 빌드를 참조하세요.

  • STORING 절을 사용하여 벡터 색인에 열 사본을 저장합니다. 열 값이 벡터 색인에 저장되면 Spanner는 색인 리프 수준에서 필터링을 수행하여 쿼리 성능을 향상시킵니다. 필터링 조건에 사용되는 경우 열을 저장하는 것이 좋습니다. 색인에서 STORING을 사용하는 방법에 대한 자세한 내용은 색인 전용 스캔에 대한 색인 만들기를 참조하세요.

테이블을 만들 때 임베딩 열은 FLOAT32(권장) 또는 FLOAT64 데이터 유형의 배열이어야 하며 벡터 크기를 나타내는 vector_length 주석이 있어야 합니다.

다음 DDL 문은 벡터 길이가 포함된 임베딩 열 DocEmbedding이 있는 Documents 테이블을 만듭니다.

CREATE TABLE Documents (
  UserId INT64 NOT NULL,
  DocId INT64 NOT NULL,
  Author STRING (1024),
  DocContents Bytes(MAX),
  DocEmbedding ARRAY<FLOAT32>(vector_length=>128) NOT NULL,
  NullableDocEmbedding ARRAY<FLOAT32>(vector_length=>128),
  WordCount INT64,
) PRIMARY KEY (DocId);

Documents 테이블을 채운 후 코사인 거리를 사용하여 임베딩 열 DocEmbedding이 포함된 Documents 테이블에 2단계 트리와 1, 000개 리프 노드가 있는 벡터 색인을 만들 수 있습니다.

CREATE VECTOR INDEX DocEmbeddingIndex
  ON Documents(DocEmbedding)
  STORING (WordCount)
  OPTIONS (distance_type = 'COSINE', tree_depth = 2, num_leaves = 1000);

임베딩 열이 테이블 정의에서 NOT NULL로 표시되지 않으면 벡터 색인 정의에서 WHERE COLUMN_NAME IS NOT NULL 절을 사용하여 선언해야 합니다. 여기서 COLUMN_NAME는 임베딩 열의 이름입니다. 코사인 거리를 사용하여 null 허용 임베딩 열 NullableDocEmbedding에 3단계 트리와 1,000,000개 리프 노드가 있는 벡터 색인을 만들려면 다음 안내를 따르세요.

CREATE VECTOR INDEX DocEmbeddingThreeLevelIndex
  ON Documents(NullableDocEmbedding)
  STORING (WordCount)
  WHERE NullableDocEmbedding IS NOT NULL
  OPTIONS (distance_type = 'COSINE', tree_depth = 3, num_branches=1000, num_leaves = 1000000);

벡터 색인 필터링

필터링된 벡터 색인을 만들어 필터 조건과 일치하는 데이터베이스에서 가장 유사한 항목을 찾을 수도 있습니다. 필터링된 벡터 색인은 지정된 필터 조건을 충족하는 행을 선택적으로 색인화하여 검색 성능을 개선합니다.

다음 예시에서 Documents2 테이블에는 Category이라는 열이 있습니다. 벡터 검색에서는 '기술' 카테고리를 색인으로 만들려고 하므로 카테고리 조건이 충족되지 않으면 NULL로 평가되는 생성된 열을 만듭니다.

CREATE TABLE Documents2 (
  DocId INT64 NOT NULL,
  Category STRING(MAX),
  NullIfFiltered BOOL AS (IF(Category = 'Tech', TRUE, NULL)) HIDDEN,
  DocEmbedding ARRAY<FLOAT32>(vector_length=>128),
) PRIMARY KEY (DocId);

그런 다음 필터를 사용하여 벡터 색인을 만듭니다. TechDocEmbeddingIndex 벡터 색인은 '기술' 카테고리의 문서만 색인화합니다.

CREATE VECTOR INDEX TechDocEmbeddingIndex
  ON Documents2(DocEmbedding)
  STORING(NullIfFiltered)
  WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
  OPTIONS (...);

TechDocEmbeddingIndex와 일치하는 필터가 있는 다음 쿼리를 Spanner가 실행하면 TechDocEmbeddingIndex가 자동으로 선택되고 TechDocEmbeddingIndex에 의해 가속화됩니다. 이 쿼리는 '기술' 카테고리의 문서만 검색합니다. {@FORCE_INDEX=TechDocEmbeddingIndex}를 사용하여 Spanner가 TechDocEmbeddingIndex를 명시적으로 사용하도록 강제할 수도 있습니다.

SELECT *
FROM Documents2
WHERE DocEmbedding IS NOT NULL AND NullIfFiltered IS NOT NULL
ORDER BY APPROX_(....)
LIMIT 10;

다음 단계