RAG2026-5일33차시 · Modular RAG 최적화4 / 19← 이전목차다음 →MetaContents

33차시. Modular RAG 최적화

1. 최적화의 제1원칙 — 먼저 측정하라

출처: 원본 PDF 33차시_ModularRAG최적화.pdf 3쪽 · 쪽 그림 3쪽

14차시에서 배운 원칙이 여기서도 그대로입니다. 측정 없는 최적화는 추측일 뿐입니다.

1-1) 흔한 착각

⚠️ 감으로 최적화하면
"검색이 느린 것 같으니 FAISS 인덱스를 튜닝하자"
→ 실제로 검색은 전체의 3%였습니다
→ 이틀을 썼는데 체감 개선이 없습니다
"chunk_size를 줄이면 빨라지겠지"
→ 조각 수가 늘어 오히려 느려졌습니다
병목이 아닌 곳을 최적화하면
시간만 쓰고 효과가 없습니다.

1-2) 프로파일링 코드

📝 src/profile_graph.py

Python
import time
from collections import defaultdict
from graph import app
from state import init_state

# 노드별 LLM 호출 여부 (비용 계산용)
LLM_NODES = {"classify", "generate", "verify", "rewrite"}

def profile(questions):
    times = defaultdict(float)
    calls = defaultdict(int)

    for q in questions:
        prev = time.time()
        for step in app.stream(init_state(q),
                               {"recursion_limit": 30}):
            for node in step:
                now = time.time()
                times[node] += now - prev
                calls[node] += 1
                prev = now
    total = sum(times.values())
    print(f"{'노드':<12}{'호출':>5}{'총시간':>9}{'비중':>7}  LLM")
    print("-" * 48)
    def sort_key(n):
        return -times[n]
    for node in sorted(times, key=sort_key):
        bar = "█" * int(times[node] / total * 20)
        mark = "●" if node in LLM_NODES else " "
        print(f"{node:<12}{calls[node]:>5}{times[node]:>8.1f}s"
              f"{times[node]/total*100:>6.0f}%  {mark} {bar}")
    print("-" * 48)
    print(f"{'합계':<12}{sum(calls.values()):>5}{total:>8.1f}s")
← 이전 절33차시 · 이번 차시에서 배우는 것다음 절 →33차시 · 2. 프로파일링 결과 읽기