← 뒤로

FLAT vs IVF: 역파일 인덱스의 작동 원리

동일한 데이터, 동일한 쿼리 — 하지만 다른 검색 전략입니다. 쿼리 지점을 드래그하고 조정 nprobe'검색 실행'을 눌러 ' IVF '가 대부분의 데이터를 건너뛰는 방식을 확인해 보세요.

nprobe2
8 개의 클러스터에 대한 검색 2
속도20ms
낮을수록 애니메이션 속도가 빠릅니다

FLAT — 전체 탐색

모든 점을 스캔합니다
비교
200 / 200
상태
✓ 완료
리콜
100%

IVF — 역파일 인덱스

nprobe 클러스터 검색
비교
33 / 33
상태
✓ 완료
리콜@5
100%

무슨 일이 일어나고 있는 걸까요?

  1. 구축 단계(이미 완료됨): K-means 알고리즘을 사용하여 200 의 점들을 8 개의 클러스터로 분할했습니다. 각 클러스터에는 중심점(× 표시)이 있습니다.
  2. 1단계 — 중심점 평가: ‘ IVF ’는 먼저 쿼리와 모든 중심점 간의 거리를 계산합니다. 이는 데이터셋의 크기와 관계없이 단 8 번의 비교만 수행하면 됩니다.
  3. 2단계 — 가장 가까운 ‘ nprobe ’ 클러스터를 선택하면 해당 클러스터가 강조 표시됩니다. 그 외의 모든 클러스터는 완전히 건너뜁니다.
  4. 3단계 — 선택된 클러스터 내의 점들을 스캔합니다: 200 의 점 중 약50 만 해당됩니다.

상충 관계: 더 많은 nprobe → 더 많은 클러스터가 스캔됨 → 리콜률은 높아지지만 속도는 느려집니다. 더 작음 nprobe → 속도는 빨라지지만, 스캔되지 않은 클러스터에 속한 진정한 이웃을 놓칠 수 있습니다. nprobe = 1 쿼리를 클러스터 경계 근처로 끌어다 놓아 리콜이 떨어지는지 확인해 보세요.

IVF (IFV) 인덱스란 무엇인가요?

IVF (Inverted File) 은 클러스터링 기반의 근사 최인접 이웃 인덱스입니다. 구축 시, k-means는 모든 벡터를 nlist 클러스터로 분할하며, 각 클러스터는 중심점(centroid)으로 표현됩니다. 쿼리 시, 검색은 먼저 쿼리를 중심점들과만 비교하여 가장 가까운 nprobe 클러스터를 선택한 뒤, 해당 클러스터 내의 벡터들만 스캔하며 나머지 모든 항목은 건너뜁니다.

Milvus 정확도를 위해 메모리 사용량을 희생하는 여러 가지 ‘ IVF ’ 변형을 제공합니다: IVF_FLAT 원시 벡터를 저장합니다(가장 정확함), IVF_SQ8 각 차원을 1바이트로 압축하며(메모리 사용량 약 4배 감소, 리콜 비용 소폭 증가), IVF_PQ 회수 비용은 더 크지만 훨씬 더 높은 압축률을 위해 곱 양자화를 적용합니다.

튜닝 nlist 및 nprobe

  • nlist (빌드 시간): k-means 클러스터의 수입니다. 일반적인 시작점은 N개의 벡터에 대해 4 × sqrt(N) 입니다. 클러스터 수가 많을수록 각 클러스터의 크기는 작아집니다. 즉, 스캔 속도는 빨라지지만, 중심점 스윕에 드는 비용이 증가하고 경계 효과가 커집니다.
  • nprobe (쿼리 시간): 쿼리당 스캔할 클러스터 수입니다. 이는 리콜/지연 시간 조절의 핵심 요소이며, 바로 위의 슬라이더가 제어하는 항목입니다. 약 nlist / 16 정도로 시작하여 리콜이 목표치에 도달할 때까지 점차 늘리십시오.
  • 변형 선택: IVF_FLAT 에서 시작하십시오. 메모리가 부족할 때는 IVF_SQ8 로 이동하고, 데이터셋이 SQ8 에 비해 너무 클 때만 IVF_PQ 로 이동하십시오. 또한 각 단계가 내려갈 때마다 자신의 데이터로 리콜을 확인하십시오.

IVF vs HNSW vs DiskANN

IVF 생성 속도가 빠르고, 벡터에 추가되는 메모리 오버헤드가 적으며, 이해하기 쉽습니다. 하지만 동일한 리콜 목표치에서 HNSW 는 일반적으로 메모리 내에서 쿼리에 더 빠르게 응답합니다. 인덱스를 자주 재구축해야 할 때(빠른 생성 속도가 중요할 때), 메모리가 제한적일 때(IVF_SQ8/IVF_PQ), 또는 예측 가능하고 조정 가능한 스캔 동작을 원할 때는 IVF 를 선택하십시오. 메모리 내 쿼리 지연 시간을 최소화하려면 HNSW 를 선택하고, 벡터가 RAM 에 전혀 들어가지 않을 때는 DiskANN 를 선택하십시오.

자주 묻는 질문

IVF_FLAT, IVF_SQ8, IVF_PQ 의 차이점은 무엇인가요?

세 클러스터 모두 벡터를 동일한 방식으로 클러스터링하지만, 클러스터 내부에서 벡터를 저장하는 방식은 다릅니다. ‘ IVF_FLAT ’는 원시 부동소수점 벡터를 유지합니다(최고의 리콜). ‘ IVF_SQ8 ’는 각 차원을 8비트로 양자화하여, 리콜 손실을 약간 감수하는 대신 메모리 사용량을 약 4배 줄입니다. ‘ IVF_PQ ’는 벡터를 짧은 곱 양자화 코드로 대체하여, 가장 높은 압축률을 달성하지만 리콜 손실도 가장 큽니다.

nlist 와 nprobe 중 어떤 것을 선택해야 할까요?

일반적인 경험칙은 N개의 벡터에 대해 nlist = 4 × sqrt(N)이며, 쿼리 시점에 nprobe 를 조정합니다. nprobe 가 클러스터 수( )가 클수록 더 많은 클러스터를 스캔하므로, 리콜(recall)은 높아지지만 지연 시간(latency)도 증가합니다. nlist/16 정도에서 시작하여, 제외된 쿼리 세트(held-out query set)에 대한 리콜이 목표치에 도달할 때까지 값을 늘리십시오.

왜 ‘ IVF ’가 일부 진정한 최인접 이웃을 놓치는가?

이는 클러스터 경계 때문입니다. 쿼리가 클러스터 가장자리 근처에 위치할 경우, 쿼리의 실제 이웃 중 일부는 스캔된 nprobe 클러스터에 포함되지 않은 인접 클러스터에 위치할 수 있습니다. nprobe = 1인 경계 근처로 쿼리 지점을 드래그하면 시각화에서 이를 확인할 수 있습니다.

IVF 와 HNSW 중 어떤 것을 사용해야 할까요?

동일한 리콜(recall) 조건에서, HNSW 는 일반적으로 메모리 내 검색에 더 빠르지만 더 많은 메모리를 사용하고 구축 속도가 더 느립니다. IVF 는 구축 속도가 빠르며, 메모리가 부족한 경우 양자화(SQ8/PQ)와 잘 어울립니다. RAM 를 완전히 초과하는 데이터셋의 경우, 대신 DiskANN 를 고려해 보십시오.

더 자세히 알아보기: 인덱스 매개변수에 대해서는 ` IVF_FLAT ` 문서를 참조하거나, 전체 결정 가이드를 보려면 ` Index Explained `를 참조하십시오.

계속 탐색해 보세요