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 배열은 각 쿼리 벡터와 이웃 벡터 간의 거리를 나타냅니다.