RAG2026-5일15차시 · 기본 RAG 앱 만들기6 / 19← 이전목차다음 →MetaContents

15차시. 기본 RAG 앱 만들기

3. 실습 ① — config.py

출처: 원본 PDF 15차시_기본RAG앱만들기.pdf 6쪽 · 쪽 그림 6쪽

14차시에서 만든 것을 그대로 씁니다. 모든 숫자와 문자열이 여기 모입니다.

📝 config.py

Python
# ══════════════════════════════════════════
#  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」과 이어집니다.

Python
# ==============================================================
# 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 = "관련 자료를 찾지 못했습니다." — ── 메시지 ──

파일 맨 아래 실행 결과 샘플 주석은 실행되지 않습니다. 화면 출력은 다음 절에 다시 적어 두었습니다.

← 이전 절15차시 · 2. 목표 구조 — 4개 모듈다음 절 →15차시 · 4. 실습 ② — indexer.py