콘텐츠로 이동

Vamana

Vamana는 L2 distance 기반 workload에 사용하는 ANN 인덱스입니다. 인덱스 생성 옵션과 검색 시점 GUC는 적용 시점이 다릅니다.

Note

Vamana 문서와 예제는 vector_l2_ops<->를 사용합니다.

Vamana 인덱스 생성

CREATE INDEX items_embedding_vamana_idx
  ON items
  USING vectoron (embedding vector_l2_ops)
  WITH (options = $$
    [indexing.vamana]
    alpha = 1.2
    r = 32
    l_search = 64
    phase = 1
  $$);

Build-time 옵션

Build-time option은 인덱스를 만들 때 적용됩니다. 값을 바꾸려면 인덱스를 다시 만들어야 합니다.

Option Default 설명
indexing.vamana.alpha 1.2 그래프 pruning 동작에 영향을 줍니다. recall, build time, index size에 미치는 영향은 데이터셋에 따라 달라집니다.
indexing.vamana.r 32 각 노드가 유지하는 neighbor 수의 상한입니다. 값이 클수록 graph edge 수, memory 사용량, build cost가 증가합니다.
indexing.vamana.l_search 64 인덱스 구축 중 후보를 탐색하는 폭입니다. 검색 시점의 탐색 폭이 아닙니다.
indexing.vamana.phase 1 인덱스 구축 phase입니다.

Search-time 옵션

검색 시점에는 vectoron.vamana_l_search를 조정합니다. indexing.vamana.l_search와 이름은 비슷하지만 적용 시점이 다릅니다.

GUC Default 설명
vectoron.vamana_l_search 100 Vamana 검색 중 후보 탐색 폭입니다. 값이 클수록 더 많은 후보를 평가하므로 CPU 작업량과 latency가 증가할 수 있습니다.

vectoron.vamana_l_search 값을 조정할 때에는 recall과 latency 변화를 확인하며 적절한 값을 찾으시기 바랍니다.

세션 전체에 적용하려면 SET을 사용합니다.

SET vectoron.vamana_l_search = 100;

SELECT id
  FROM items
 ORDER BY embedding <-> '[0.1,0.2,0.3]'::vector
 LIMIT 10;

한 쿼리에만 적용하려면 SET LOCAL을 transaction 안에서 사용합니다.

BEGIN;
SET LOCAL vectoron.vamana_l_search = 200;

SELECT id
  FROM items
 ORDER BY embedding <-> '[0.1,0.2,0.3]'::vector
 LIMIT 10;
COMMIT;

튜닝 기준

Vamana tuning에서는 인덱스 그래프를 바꾸는 값과 검색 폭을 바꾸는 값을 구분합니다.

Setting 적용 시점 확인할 것
r 인덱스 생성 build time, memory/index size, recall
alpha 인덱스 생성 recall과 build/search cost 변화
indexing.vamana.l_search 인덱스 생성 build time과 검색 품질
vectoron.vamana_l_search 검색 실행 recall, latency, CPU 사용량

실제 filter 조건과 데이터 분포에 가까운 query set으로 recall과 latency 변화를 확인하며 적절한 값을 찾으시기 바랍니다.