
1. FAISS란?
- Facebook AI Similarity Search
- 페이스북에서 만든 고차원 벡터 계산용 라이브러리
- GPU를 사용하여 빠른 벡터 탐색 및 유사도 계산이 가능
2. FAISS의 벡터 표현 방법
2-1. Index란?
- 벡터 DB에서 벡터를 저장하고 검색하는 구조를 의미
- FAISS에서는 여러개의 Index 형식을 지원
2-2. Vector Index의 종류
- IndexFlatL2
- 모든 벡터를 순차적으로 비교하는 단순한 인덱스
- L2(유클리드) 거리를 사용하여 벡터 간의 거리를 계산
- 데이터셋이 작을 때 정확한 검색을 제공하지만, 대규모 데이터셋에서는 비효율
- IndexIVFFlat
- 인버스 파일 시스템(IVF)과 Flat 구조를 결합한 인덱스
- 벡터를 여러 클러스터로 나누고, 각 클러스터 내에서 검색을 수행하여 검색 속도를 높임
- 주로 대규모 데이터셋에서 사용
- IndexIVFPQ
- IVF와 제품 양자화(Product Quantization, PQ)를 결합한 인덱스
- 벡터를 압축하여 메모리 사용량을 줄이고, 검색 속도를 높이기 위해 IVF 구조를 사용
- 대규모 데이터셋에 적합
- IndexHNSW
- 히에라키컬 네비게이블 소월드 그래프(HNSW)를 사용한 인덱스
- 그래프 기반의 검색 방법으로, 매우 큰 데이터셋에서도 빠른 검색 성능을 제공
- IndexLSH
- 로컬리티 민감 해시(Locality Sensitive Hashing, LSH)를 사용한 인덱스
- 특정 거리 메트릭에 기반한 근사 검색을 빠르게 수행
index = faiss.IndexFlatL2(32)
index.add(vector)
3. FAISS로 검색하기
search
method 사용
- 입력: 쿼리의 임베딩 벡터 & 출력 문서 갯수
- 출력: 문서들과의 거리 & 유사한 문서의 인덱스
k = 5
Distance, Index = faiss_index.search(query_vector.numpy(), k)
4. FAISS vector DB 저장하기
import faiss
import pickle
faiss.write_index(index, "index.faiss")
with open("docs.pickle", "wb") as f:
pickle.dump(documents, f)
5. FAISS vector DB 불러오기
import faiss
import pickle
index_loaded = faiss.read_index("index.faiss")
with open("docs.pickle", "rb") as f:
loaded_documents = pickle.load(f)
참고 자료