📂 backend/retriever/vectordb.py
import faiss
import numpy as np
import os
from sentence_transformers import SentenceTransformer
# 1. 임베딩 모델 로드
embedding_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# 2. 벡터DB (FAISS Index) 초기화
INDEX_PATH = "./backend/retriever/index.faiss"
DOCS_PATH = "./backend/retriever/docs.npy"
if os.path.exists(INDEX_PATH) and os.path.exists(DOCS_PATH):
index = faiss.read_index(INDEX_PATH)
documents = np.load(DOCS_PATH, allow_pickle=True)
else:
index = None
documents = None
print("No FAISS index or docs found. Please build the index first.")
# 3. 검색 함수
def search_documents(query: str, top_k: int = 5):
if index is None or documents is None:
raise ValueError("Index or documents not loaded. Build the FAISS index first.")
query_vector = embedding_model.encode([query])
query_vector = np.array(query_vector).astype('float32')
distances, indices = index.search(query_vector, top_k)
results = []
for idx in indices[0]:
if idx < len(documents):
results.append(documents[idx])
return results
- ✨ 구조 설명
부분 | 설명 |
---|---|
SentenceTransformer | 쿼리를 벡터로 변환 |
faiss.read_index | 사전 저장된 벡터 인덱스 로딩 |
np.load | 문서 내용 (문자열 리스트) 로딩 |
search_documents | 쿼리 → 임베딩 → FAISS 검색 → 문서 리스트 반환 |
- 📋 ToDo 체크
✅ 임베딩 모델 로딩
✅ FAISS 인덱스 & 문서 리스트 로딩
✅ 검색 함수 완성
✅ /api/search
연동 가능 상태
- 🚨 주의
처음 프로젝트 세팅할 때 FAISS 인덱스가 없으면 index=None
상태가 된다.
그래서 반드시 build_index.py 같은 스크립트로 인덱스를 미리 만들어야 해.
이거 다음에 할 거야.
- 🏁 지금까지 연결된 그림
POST /api/search
➔ search_documents(query)
➔ embedding + FAISS search
➔ 관련 문서 리스트 반환
- 🛠️ 다음 스텝
build_index.py
만들어서- 기출 문제 데이터 → 임베딩 → FAISS 저장하는 스크립트 작성
(= 인덱스를 실제로 만들어야 검색이 된다!)
- ✍️ 다음 질문
build_index.py