FAISS 인덱스

5단 분석법

순서
분석
단어
내용
1
일반 명사
FAISS Index
-
2
고유 명사
FAISS
개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있는, 페이스북에서 개발한 라이브러리
Index
배열에서의 위치를 가리키는 숫자
FAISS Index
벡터 데이터의 유사도를 빠르게 검색하기 위해 Facebook에서 개발한 라이브러리 FAISS에서 사용하는 데이터 구조
3
사용 이유
FAISS Index
대규모 벡터 데이터를 빠르고 정확하게 검색할 수 있기 때문에
4
사용 방법
FAISS Index
벡터 데이터를 추가하고, 유사도 검색을 수행
5
다른 기술과의 비교
FAISS Index
-

정의

고유 명사

FAISS
개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있는, 페이스북에서 개발한 라이브러리
Index
배열에서의 위치를 가리키는 숫자
FAISS Index
벡터 데이터의 유사도를 빠르게 검색하기 위해 Facebook에서 개발한 라이브러리 FAISS에서 사용하는 데이터 구조
FAISS는 개발자가 서로 유사한 멀티미디어 문서의 임베딩을 빠르게 검색할 수 있는, 페이스북에서 개발한 라이브러리 입니다.
Index는 배열에서의 위치를 가리키는 숫자를 뜻합니다.
FAISS Index는 벡터 데이터의 유사도를 빠르게 검색하기 위해 Facebook에서 개발한 라이브러리 FAISS에서 사용하는 데이터 구조를 말합니다.

사용 이유

FAISS Index
대규모 벡터 데이터를 빠르고 정확하게 검색할 수 있기 때문에
주요 이유
설명
대규모 벡터 검색 최적화
수백만 개의 텍스트 임베딩 벡터에서 빠르게 유사성을 찾아냅니다. 이는 대규모 문서 검색에 필수적입니다.
메모리 효율성
고차원 벡터를 압축 저장하여 대용량 데이터를 제한된 메모리에서 효과적으로 처리합니다.
랭체인 통합 용이성
랭체인의 벡터 저장소로 쉽게 통합되어, 복잡한 자연어 처리 파이프라인 구축을 단순화합니다.

사용 방법

FAISS Index
벡터 데이터를 추가하고, 유사도 검색을 수행

1. 라이브러리 임포트 및 데이터 생성

!pip install faiss-cpu
JSON
복사
import faiss import numpy as np
Python
복사
faiss: Facebook AI Research에서 개발한 빠르고 효율적인 벡터 검색 라이브러리입니다.
numpy: 수치 계산을 위한 파이썬 라이브러리입니다.
d = 64 # 차원 수 (열) nb = 100000 # 학습할 벡터 수 (행) nq = 10000 # 쿼리 벡터 수 (행) np.random.seed(1234) # 재현성을 위해 시드 설정 xb = np.random.random((nb, d)).astype('float32') xb[:, 0] += np.arange(nb) / 1000. # ':'는 모든행을 의미 , 0 은 첫 번째 열을 의미 xq = np.random.random((nq, d)).astype('float32') xq[:, 0] += np.arange(nq) / 1000.
Python
복사
차원 수(d): 각 벡터의 차원(길이)을 설정합니다. 여기서는 64차원 벡터를 사용합니다.
학습할 벡터 수(nb): 인덱스에 추가할 벡터의 개수를 설정합니다.
쿼리 벡터 수(nq): 검색에 사용할 쿼리 벡터의 개수를 설정합니다.
np.random.seed(1234): 난수 생성기의 시드를 설정하여 결과의 재현성을 보장합니다.
벡터 생성:
xb: nb개의 64차원 랜덤 벡터를 생성하고 첫 번째 차원에 작은 값을 더합니다.
xq: nq개의 64차원 랜덤 쿼리 벡터를 생성하고 첫 번째 차원에 작은 값을 더합니다.

2. 인덱스 생성 및 학습

index = faiss.IndexFlatL2(d) # L2 거리(metric)를 사용하는 인덱스 , d열만큼 사용할 인덱스 구조 정의 print(index.is_trained) # True, is_trained: 거리계산에 대한 학습 여부를 말함. #true 학습 과정이 필요없다는 것. 왜 필요없냐면, 벡타를 평탄화를 하였기 때문에 평평한 구조로 되어있어 학습할 필요가 없음 # 다른 복잡한 인덱스들(예: PQ 인덱스 또는 IVF 인덱스)은 벡터를 효율적으로 검색할 수 있도록 벡터들을 군집화하거나 압축하는 학습 과정이 필요할 수 있음
Python
복사
IndexFlatL2(d): L2(유클리드) 거리를 사용하여 평평한(단순한) 인덱스를 생성합니다.
d: 벡터의 차원 수.
index.is_trained: IndexFlatL2는 별도의 학습 과정이 필요 없으므로 True를 반환합니다.
index.add(xb) # 인덱스에 벡터 추가 print(index.ntotal) # 100000
Python
복사
index.add(xb): 생성한 벡터 xb를 인덱스에 추가합니다.
index.ntotal: 인덱스에 추가된 벡터의 총 개수를 반환합니다. 여기서는 100000개가 추가되었습니다.

3. 검색

k = 4 # 검색할 최근접 이웃의 수 D, I = index.search(xq, k) # 쿼리 벡터 xq에 대해 검색 print(I[:5]) # 첫 5개의 쿼리에 대한 결과 print(D[:5]) # 첫 5개의 쿼리에 대한 거리
Python
복사
k: 각 쿼리 벡터에 대해 검색할 최근접 이웃의 수를 설정합니다.
index.search(xq, k): 쿼리 벡터 xq에 대해 k개의 최근접 이웃을 검색합니다.
D: 쿼리 벡터와 검색된 최근접 이웃 간의 거리.
I: 검색된 최근접 이웃의 인덱스.
결과 출력:
I[:5]: 첫 5개의 쿼리 벡터에 대한 검색 결과(인덱스)를 출력합니다.
설명 : 벡터의 위치
D[:5]: 첫 5개의 쿼리 벡터에 대한 검색 결과(거리)를 출력합니다.
설명 : 벡터간의 거리
최근접 이웃이란?
주어진 쿼리 벡터에 가장 가까운(유사한) 벡터를 의미합니다.
벡터 공간에서 거리가 가장 짧은 벡터를 찾는 것을 말합니다.
벡터 간의 거리는 일반적으로 유클리드 거리(L2 거리)나 코사인 유사도와 같은 지표를 사용해서 계산됩니다.

Google Colab

결과 설명

print(index.is_trained) # True
Python
복사
결과: True
이는 faiss.IndexFlatL2 인덱스가 학습된 상태라는 것을 의미합니다.
IndexFlatL2는 단순한 최근접 이웃 검색을 수행하며, 데이터 포인트 간의 L2 거리(유클리드 거리)만 계산합니다. 이 인덱스는 데이터 포인트를 단순히 저장하고 거리를 계산하는 기능만 필요하기 때문에 별도의 학습 단계가 필요 없습니다.
print(index.ntotal) # 100000
Python
복사
결과: 100000
이는 인덱스에 추가된 벡터의 총 개수가 100,000개임을 나타냅니다. 즉, 인덱스에 100,000개의 학습 벡터가 성공적으로 추가되었습니다.
print(I[:5]) # 첫 5개의 쿼리에 대한 결과
Python
복사
결과
[[ 381 207 210 477] [ 526 911 142 72] [ 838 527 1290 425] [ 196 184 164 359] [ 526 377 120 425]]
Plain Text
복사
이 배열은 첫 5개의 쿼리 벡터에 대해 검색된 4개의 최근접 이웃의 인덱스를 나타냅니다.
예를 들어, 첫 번째 쿼리 벡터(xq[0])에 대한 최근접 이웃의 인덱스는 [381, 207, 210, 477]입니다.
두 번째 쿼리 벡터(xq[1])에 대한 최근접 이웃의 인덱스는 [526, 911, 142, 72]입니다.
각 행은 쿼리 벡터 하나에 대한 결과를 나타내고, 각 열은 해당 쿼리 벡터에 대해 가장 가까운 벡터의 인덱스를 의미합니다.
print(D[:5]) # 첫 5개의 쿼리에 대한 거리
Python
복사
결과
[[6.815506 6.8894653 7.3956795 7.4290257] [6.6041145 6.679699 6.7209625 6.828678 ] [6.4703865 6.8578644 7.0043755 7.036564 ] [5.573681 6.4075394 7.1395187 7.3555946] [5.409401 6.232216 6.4173393 6.5743675]]
Plain Text
복사
이 배열은 첫 5개의 쿼리 벡터에 대해 검색된 4개의 최근접 이웃과의 거리를 나타냅니다.
예를 들어, 첫 번째 쿼리 벡터(xq[0])와 가장 가까운 벡터(xb[381]) 사이의 거리는 6.815506입니다.
두 번째로 가까운 벡터(xb[207])와의 거리는 6.8894653입니다.
각 행은 쿼리 벡터 하나에 대한 결과를 나타내고, 각 열은 해당 쿼리 벡터와 최근접 이웃 간의 거리를 의미합니다.

결과 요약

벡터 인덱스 생성 및 학습: 100,000개의 벡터를 인덱스에 추가하여 faiss.IndexFlatL2 인덱스를 생성하였습니다.
최근접 이웃 검색: 10,000개의 쿼리 벡터에 대해 각 쿼리 벡터와 가장 가까운 4개의 이웃 벡터를 검색하였습니다.
검색 결과
첫 5개의 쿼리 벡터에 대한 최근접 이웃의 인덱스와 거리를 출력하였습니다.
I 배열은 각 쿼리 벡터에 대해 검색된 이웃 벡터의 인덱스를 나타냅니다.
D 배열은 각 쿼리 벡터와 이웃 벡터 간의 거리를 나타냅니다.