15차시. 기본 RAG 앱 만들기
3. 실습 ① — config.py
출처: 원본 PDF 15차시_기본RAG앱만들기.pdf 6쪽 · 쪽 그림 6쪽
14차시에서 만든 것을 그대로 씁니다. 모든 숫자와 문자열이 여기 모입니다.
📝 config.py
# ══════════════════════════════════════════
# RAG 설정 — 튜닝은 이 파일만 고치면 됩니다
# 최종 결정 : 2026-08-03 (14차시 벤치마크)
# 성능 : 질문 20개 기준 90% (기준선 60%)
# ══════════════════════════════════════════
from pathlib import Path
BASE = Path(__file__).parent
# ── 문서 ──
DOC_PATH = BASE / "data" / "manual.pdf"
CHUNK_SIZE = 300
CHUNK_OVERLAP = 30
# ── 임베딩 · 저장소 ──
EMBED_MODEL = "text-embedding-3-small" # ⚠ 변경 시 인덱스 재생성
INDEX_PATH = str(BASE / "faiss_index")
# ── 검색 ──
TOP_K = 5
MIN_SCORE = 0.47
# ── 생성 ──
LLM_MODEL = "gpt-4o-mini"
TEMPERATURE = 0
PROMPT_VER = "v3"
# ── 메시지 ──
MSG_NO_DOC = "관련 자료를 찾지 못했습니다."
MSG_ERROR = "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."💡 Path를 쓰는 이유
"data/manual.pdf" 같은 상대 경로는
어디서 실행하느냐에 따라 달라집니다.
src/ 안에서 실행 → 찾음
프로젝트 루트에서 실행 → FileNotFoundError
Path(__file__).parent를 쓰면
실행 위치와 무관하게 항상 같은 곳을 가리킵니다.
이 사소한 처리가 많은 에러를 막아줍니다.
실습 코드 · rag_app/config.py
실습 코드: 실습/src/rag_app/config.py · 위의 원본 PDF 15차시 6쪽 「3️⃣ 실습 ① — config.py」과 이어집니다.
# ==============================================================
# 15차시. PPT 15차시_기본RAG앱만들기. 코드 폴더는 src/rag_app
# PPT: 15차시 문서 질의응답
# 역할: 문서 앱의 경로·청크·모델·검색 기준 상수. LangGraph State는 쓰지 않습니다.
# 읽는 키: 없음
# 쓰는 키: 없음
# 그래프:
# 앱 흐름에서 이 파일의 위치
# indexer가 DOC_PATH, CHUNK_*, EMBED_MODEL, INDEX_PATH를 읽음
# rag.py가 TOP_K, MIN_SCORE, LLM_MODEL, TEMPERATURE, PROMPT_VER, 안내 문장을 읽음
# --------------------------------------------------------------
# BASE는 이 파일이 있는 rag_app 폴더입니다.
# DOC_PATH는 그 상위 두 단계의 data/manual.pdf 입니다.
# MIN_SCORE는 -0.01 입니다. 24차시 config의 0.1과 숫자가 다릅니다.
# INDEX_PATH 이름만 있고, 인덱스 파일 자체는 이 교안 복사본에 넣지 않습니다.
# ==============================================================
from pathlib import Path
BASE = Path(__file__).resolve().parent
# ── 문서 처리 ──
DOC_PATH = BASE.parent.parent / "data/manual.pdf"
CHUNK_SIZE = 500 # 500→300: +10%p, 토큰 33% 절감
CHUNK_OVERLAP = 50 # chunk_size의 10%
# ── 임베딩 · 저장소 ──
EMBED_MODEL = "text-embedding-3-small" # ⚠ 변경 시 인덱스 재생성
INDEX_PATH = "faiss_index"
# ── 검색 ──
TOP_K = 5 # 3→5: +10%p (k=8은 노이즈로 하락)
MIN_SCORE = -0.01 # 9차시 실측값
SEARCH_TYPE = "similarity"
# ── 생성 ──
LLM_MODEL = "gpt-4o-mini"
TEMPERATURE = 0
PROMPT_VER = "v3" # v2→v3: +10%p, 토큰 증가 없음
# ── 메시지 ──
MSG_NO_DOC = "관련 자료를 찾지 못했습니다."
MSG_ERROR = "일시적인 오류가 발생했습니다. 잠시 후 다시 시도해주세요."실행 결과 샘플 (교안 기록. API 키가 필요한 코드는 키 없이 맞춘 예시이고, 모델의 답은 실행할 때마다 달라집니다)
===== 실행 결과 샘플 =====
직접 실행 시 출력 없음
상수만 있어서 직접 실행해도 출력이 없습니다.코드 해설
문서 앱의 경로·청크·모델·검색 기준 상수. LangGraph State는 쓰지 않습니다.
코드 앞에서 고정해 두는 말입니다.
- 읽는 키: 없음
- 쓰는 키: 없음
- 그래프:
- 앱 흐름에서 이 파일의 위치
- indexer가 DOC_PATH, CHUNK_*, EMBED_MODEL, INDEX_PATH를 읽음
- rag.py가 TOP_K, MIN_SCORE, LLM_MODEL, TEMPERATURE, PROMPT_VER, 안내 문장을 읽음
- BASE는 이 파일이 있는 rag_app 폴더입니다.
- DOC_PATH는 그 상위 두 단계의 data/manual.pdf 입니다.
함수로 나누지 않고 위에서 아래로 실행됩니다.
DOC_PATH = BASE.parent.parent / "data/manual.pdf"— ── 문서 처리 ──EMBED_MODEL = "text-embedding-3-small" # ⚠ 변경 시 인덱스 재생성— ── 임베딩 · 저장소 ──TOP_K = 5 # 3→5: +10%p (k=8은 노이즈로 하락)— ── 검색 ──LLM_MODEL = "gpt-4o-mini"— ── 생성 ──MSG_NO_DOC = "관련 자료를 찾지 못했습니다."— ── 메시지 ──
파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.