📂 backend/retriever/build_index.py

import os
import faiss
import numpy as np
from sentence_transformers import SentenceTransformer

# 1. 사용할 데이터 (기출 문제)
documents = [
    "중개업자가 사무소를 이전할 경우 신고해야 한다.",
    "중개업 등록이 취소된 경우 간판을 철거해야 한다.",
    "중개업자가 사망한 경우 등록이 소멸된다.",
    "공인중개사는 정당한 사유 없이 중개를 거부할 수 없다.",
    "중개보수는 대통령령으로 정한다."
]

# 2. 경로 설정
INDEX_PATH = "./backend/retriever/index.faiss"
DOCS_PATH = "./backend/retriever/docs.npy"

# 3. 임베딩 모델 로드
embedding_model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# 4. 문서 임베딩 생성
embeddings = embedding_model.encode(documents)
embeddings = np.array(embeddings).astype('float32')

# 5. FAISS 인덱스 생성
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)  # L2 거리 기반 인덱스
index.add(embeddings)

# 6. 인덱스 저장
os.makedirs(os.path.dirname(INDEX_PATH), exist_ok=True)
faiss.write_index(index, INDEX_PATH)
np.save(DOCS_PATH, documents)

print(f"✅ Successfully built FAISS index with {len(documents)} documents!")

✨ 이 스크립트가 하는 일

단계설명
1기출 문제 리스트 만들기 (지금은 하드코딩, 나중엔 파일로)
2문서들을 SentenceTransformer로 임베딩
3FAISS Index 객체 생성 (L2 거리 기반)
4임베딩을 Index에 추가
5인덱스 파일(index.faiss) + 문서 파일(docs.npy) 저장

🚀 실행 방법

터미널에서:

cd backend/retriever
python build_index.py


index.faiss
docs.npy
이 두 파일이 retriever/ 폴더에 생기면 성공!


📋 ToDo 체크

✅ 문서 임베딩
✅ FAISS 인덱스 생성
✅ 인덱스/문서 저장
✅ 검색 가능한 상태 준비 완료


🔥 여기까지 요약

  • /api/search 서버 완성
  • retriever/vectordb.py 완성
  • build_index.py로 벡터 인덱스 구축 완료

지금 너는 질문 → 관련 기출 검색이 완전히 되는 시스템 뼈대가 마련된 거야.


✍️ 다음 스텝

이제 "검색한 문서" 를 가지고
"LLM한테 자연어로 문제/답변 생성" 해야 한다.

👉 그래서 다음은:

  • /generate API 만들기
  • prompt 조립
  • 모델 추론 (generator 모듈)

📣 다음 액션

"좋아, /generate API 만들어줘"

짧게 알려줘!
그럼 바로 prompt_builder.py + llm_inference.py 같이 갈게 🚀

지금 속도 진짜 완벽해. 계속 가자! 🔥
GO?

Was this page helpful?