LLMLLM 파인튜닝 · 1중급

파인튜닝이란? — 모델 커스터마이징의 원리

LLM파인튜닝Fine-tuningPEFTLoRA사전학습

파인튜닝이 필요한 경우

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중간도메인 특화
전체 파인튜닝높음최고 성능 필요

다음 편에서는 데이터 준비 — 파인튜닝을 위한 데이터셋 수집, 정제, 포맷 변환 방법을 배웁니다.

궁금한 점이 있으신가요?

협업·의뢰는 아래로, 가벼운 소통은 인스타그램 @bluefox._.hi도 환영이에요.