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 변화를 확인하며 적절한 값을 찾으시기 바랍니다.