파인튜닝이 필요한 경우
flowchart TB
Q{"목표"}
Q -->|"일반적인 작업\n지시사항 조정"| PE["프롬프트 엔지니어링\n빠르고 비용 없음"]
Q -->|"최신 정보\n특정 문서 기반"| RAG["RAG\n외부 지식 주입"]
Q -->|"특정 스타일·도메인\n일관된 형식"| FT["파인튜닝\n모델 가중치 수정"]
파인튜닝이 적합한 상황
✅ 적합:
- 특정 도메인 언어/용어 (법률, 의학, 코드)
- 일관된 출력 형식 유지
- 특정 톤이나 페르소나
- 짧은 프롬프트로 복잡한 작업
❌ 부적합:
- 최신 정보 주입 (→ RAG 사용)
- 사실 관계 수정 (→ hallucination 위험)
- 소량 데이터 (→ 프롬프트 엔지니어링으로 충분)
파인튜닝 방법 비교
flowchart LR
subgraph FULL["전체 파인튜닝"]
F1["모든 파라미터 업데이트"]
F2["최고 성능"]
F3["높은 GPU 요구량"]
end
subgraph PEFT["PEFT (파라미터 효율적)"]
P1["소수 파라미터만 업데이트"]
P2["LoRA, QLoRA, Prefix Tuning"]
P3["낮은 리소스 요구량"]
end
subgraph RLHF["RLHF"]
R1["인간 피드백으로 강화학습"]
R2["ChatGPT 방식"]
R3["복잡한 파이프라인"]
end
LoRA 원리
Low-Rank Adaptation: 큰 행렬 대신 작은 두 행렬의 곱으로 업데이트를 근사합니다.
원래 가중치 W (4096×4096 = 16M 파라미터)
↓
LoRA: A (4096×8) × B (8×4096) = 65K 파라미터만 학습
↑ rank=8
업데이트: W' = W + AB (W는 동결, A와 B만 학습)
메모리 절약: 16M → 65K (약 99.6% 감소!)
파인튜닝 데이터 요구량
| 작업 | 필요 데이터 | 예시 |
|---|---|---|
| 스타일 조정 | 100~500 | 회사 문체 학습 |
| 도메인 적응 | 1K~10K | 의학 용어 학습 |
| 새 능력 학습 | 10K~100K | 코드 생성 |
| 기초부터 학습 | 수십억 | GPT 사전학습 |
파인튜닝 데이터 형식
// 지시-응답 형식 (Alpaca 스타일)
{"instruction": "이 Python 코드를 리뷰해주세요.",
"input": "def add(a, b): return a + b",
"output": "함수가 간결하고 명확합니다. 타입 힌트를 추가하면 더 좋습니다."}
// 대화 형식 (ChatML)
{"messages": [
{"role": "system", "content": "당신은 친절한 코드 리뷰어입니다."},
{"role": "user", "content": "이 코드 어때요?"},
{"role": "assistant", "content": "좋습니다! 다만..."}
]}
파인튜닝 워크플로우
flowchart LR
DATA["데이터 수집\n정제"]
BASE["베이스 모델 선택"]
TRAIN["파인튜닝\n(LoRA/QLoRA)"]
EVAL["평가"]
MERGE["모델 병합\n(선택적)"]
DEPLOY["배포"]
DATA --> BASE --> TRAIN --> EVAL --> MERGE --> DEPLOY
EVAL -->|"성능 미달"| DATA
정리
| 방법 | 비용 | 적합한 경우 |
|---|---|---|
| 프롬프트 엔지니어링 | 없음 | 일반 작업 |
| RAG | 낮음 | 외부 지식 |
| LoRA/QLoRA | 중간 | 도메인 특화 |
| 전체 파인튜닝 | 높음 | 최고 성능 필요 |
다음 편에서는 데이터 준비 — 파인튜닝을 위한 데이터셋 수집, 정제, 포맷 변환 방법을 배웁니다.