📂 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

Was this page helpful?