이 웹페이지에는 FAISS 완전 정복: 인덱스 종류부터 선택 기준, 튜닝까지 에 대한 전문적이고 자세한 글이 작성되어 있습니다. 자세한 내용은 아래에서 확인할 수 있습니다.





FAISS 완전 정복: 인덱스 종류부터 선택 기준, 튜닝까지


1. FAISS란 무엇인가요?

FAISS(Facebook AI Similarity Search)는 Facebook AI Research에서 만든 벡터 검색 라이브러리입니다. 쉽게 말해, 수많은 문장이나 이미지 같은 고차원 벡터들 사이에서 가장 유사한 항목(Nearest Neighbor)을 빠르게 찾아주는 도구예요. 내적 (Inner Product), L2 거리, 코사인 유사도 등 다양한 유사도 방식 지원 CPU/GPU 모두 지원 수십억 개의 벡터도 빠르게 검색 가능 텍스트 임베딩, 추천 시스템, 이미지 검색, 이상탐지 등 정말 다양한 곳에 쓰입니다.

2. 인덱스의 두 축: Flat vs Approximate

FAISS에서 가장 중요한 개념은 "인덱스"입니다. 벡터를 어떻게 저장하고, 어떤 방식으로 검색할 것인지를 정하는 구조이죠. FAISS의 인덱스는 크게 두 종류로 나눌 수 있어요. (1) Flat 인덱스: 정확도 100%, 하지만 느림 IndexFlatL2: 유클리디안 거리(L2) IndexFlatIP: 내적(Inner Product) – 코사인 유사도와 조합하여 사용 IndexFlat: 기본 형태 이 인덱스들은 모든 벡터를 하나하나 비교하는 방식이기 때문에 **정확도는 100%**지만, 데이터가 많아질수록 느려지고 메모리도 많이 잡아먹습니다. (2) Approximate 인덱스: 근사 검색, 빠름 IndexIVF (Inverted File Index): 벡터를 여러 개의 클러스터로 나눈 후 검색 (대량 처리에 적합) IndexHNSW (Hierarchical Navigable Small World): 그래프 기반, 실시간 검색에 빠름 IndexPQ (Product Quantization): 압축된 벡터로 저장하여 메모리 절약 Approximate 인덱스는 정확도는 조금 희생되지만, 속도와 확장성에서 훨씬 우수합니다.

3. 주요 인덱스 유형 살펴보기

✅ IndexFlatL2 모든 벡터와 거리 비교 L2 (유클리디안 거리) 정확도 100% 소규모 데이터에 적합 ✅ IndexFlatIP 내적(Inner Product) 기반 정규화된 벡터에서 코사인 유사도처럼 작동 검색 정확도 최상 실시간 분류, 문서 추천 등에 적합 ✅ IndexIVFFlat 벡터를 K개의 클러스터로 나눈 뒤, 일부 클러스터만 탐색 속도 개선 가능 훈련 필요 (index.train(vectors) 필수) 대규모 벡터셋(10만~수천만)에 적합 ✅ IndexIVFPQ IVF + PQ(Product Quantization) 메모리 절약, 압축 효율적 속도 빠르고 정확도 중간 CPU/GPU 모두 사용 가능 ✅ IndexHNSWFlat 그래프 기반 인덱스 실시간 응답 속도 우수 소중규모 (수천수십만 벡터)에서 특히 강력 efSearch, efConstruction, M 같은 하이퍼파라미터로 조정 가능 ✅ IndexLSH 해시 기반 근사 검색 속도는 빠르지만 정확도 낮음 잘 쓰이지 않음

4. 거리(metric) 종류

FAISS는 인덱스를 만들 때 어떤 유사도를 기준으로 할지도 지정할 수 있어요. faiss.METRIC_L2: 유클리디안 거리 faiss.METRIC_INNER_PRODUCT: 내적 faiss.METRIC_Jaccard, faiss.METRIC_Hamming: 희소 벡터 전용 (less common)

5. 튜닝 포인트 (IVF, HNSW)

FAISS에서 성능을 제대로 뽑으려면 인덱스마다 조정 가능한 값이 있어요. 🔧 IVF 설정: nlist: 클러스터 개수 → 많을수록 정확도 높고, 느려짐 nprobe: 탐색할 클러스터 개수 → 많을수록 정확도↑, 속도↓ 🔧 HNSW 설정: M: 연결 노드 수 (기본 32) → 작으면 메모리 절약, 크면 정확도↑ efConstruction: 인덱스 생성 깊이 → 보통 M의 2~4배 efSearch: 검색 탐색 깊이 → 정확도에 가장 큰 영향

6. 언제 어떤 인덱스를 써야 할까?

간단하게 이렇게 정리할 수 있어요: IndexFlat: 정확도가 최우선이고, 데이터가 적을 때 IndexHNSWFlat: 빠른 응답 속도와 적절한 정확도를 동시에 원할 때 IndexIVFFlat / IVFPQ: 수십만~수억 벡터 검색 시 GPU 사용 가능: 대규모 벡터에선 반드시 고려

결론

FAISS는 검색 속도, 정확도, 메모리 효율을 모두 고려한 최적화 도구입니다. 하지만 인덱스를 잘못 고르면 "정확도는 좋은데 너무 느려" 혹은 "빠른데 결과가 엉뚱해" 같은 상황이 생기기 쉽죠. 자신의 데이터 크기, 실시간성 여부, 정확도 우선순위, 메모리 여유를 고려해서 인덱스를 선택해야 합니다.

[블로그 홈으로 가기] [더 많은 글 보기]