FAISS

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)를 사용한 인덱스
    • 특정 거리 메트릭에 기반한 근사 검색을 빠르게 수행

# 예시 32차원 벡터 인덱스 사용 
# 본 예시에서는 IndexFlatL2 사용 

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 

# Index 및 vector 저장 
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 및 vector 불러오기 
index_loaded = faiss.read_index("index.faiss")

# 매칭되는 문서 불러오기 
with open("docs.pickle", "rb") as f: 
	loaded_documents = pickle.load(f)


참고 자료



0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN