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

33차시. Modular RAG 최적화

퀴즈 1 — 노드별 시간 비중 계산하기

(노드 이름, 걸린 초) 기록 목록을 받아 노드별 호출 수, 총시간, 비중(%)을 계산하세요. 총시간이 큰 노드부터 돌려주세요.

빈칸 코드에서 시작합니다.

Python
def profile(records):
    pass
결과 보기 (예시 풀이)
Python
# records: (노드 이름, 걸린 시간 초) 기록 목록
# 노드별 호출 수, 총시간, 비중(%)을 계산해 총시간이 큰 순서로 돌려줍니다.
def profile(records):
    times = {}
    calls = {}
    # 같은 노드의 시간과 호출 수를 모읍니다.
    for node, sec in records:
        times[node] = times.get(node, 0.0) + sec
        calls[node] = calls.get(node, 0) + 1

    total = sum(times.values())
    rows = []
    for node in times:
        # 비중 = 이 노드의 총시간 / 전체 시간 * 100
        share = times[node] / total * 100 if total else 0.0
        rows.append((node, calls[node], round(times[node], 1), round(share)))

    # 총시간이 큰 노드가 위로 오게 정렬합니다. 이것이 병목 후보 순서입니다.
    def sort_key(row):
        return -row[2]
    rows.sort(key=sort_key)
    return rows

# 질문 두 개를 돌렸다고 치고 만든 가짜 기록입니다.
records = [
    ("classify", 0.4), ("retrieve", 0.1), ("generate", 1.9), ("verify", 1.0),
    ("classify", 0.3), ("retrieve", 0.1), ("generate", 2.1), ("verify", 1.1),
    ("generate", 1.8), ("verify", 0.9),   # 두 번째 질문에서 재생성이 한 번 일어남
]

# 1) 표 모양으로 출력해 병목이 맨 위에 오는지 봅니다.
for node, n, sec, share in profile(records):
    print(f"{node:<10} 호출 {n}회  총 {sec:4.1f}s  비중 {share:>2}%")

# 2) 비중을 모두 더하면 100 근처여야 합니다(반올림 때문에 1 정도 차이 날 수 있음).
print("비중 합:", sum(row[3] for row in profile(records)))

# 3) 기록이 비어 있어도 오류 없이 빈 목록이 나와야 합니다.
print("빈 기록:", profile([]))

실행 결과

출력
generate   호출 3회  총  5.8s  비중 60%
verify     호출 3회  총  3.0s  비중 31%
classify   호출 2회  총  0.7s  비중  7%
retrieve   호출 2회  총  0.2s  비중  2%
비중 합: 100
빈 기록: []

채점 기준: 같은 노드의 시간을 합치고, 비중을 전체 시간으로 나눠 구하며, 총시간 내림차순으로 정렬하면 정답이다.

관련 교안: 33차시 「1. 최적화의 제1원칙 — 먼저 측정하라」 › 1-2) 프로파일링 코드

← 이전 절33차시 · 체크리스트와 과제다음 절 →33차시 · 퀴즈 2 — 통과한 답만 담는 캐시 만들기