📂 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로 임베딩 |
3 | FAISS 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?