Fine-tuning
사전 학습된 모델을 특정 도메인/태스크 데이터로 추가 학습. 모델의 동작 방식 자체를 변경.
RAG vs Fine-tuning
| 항목 | RAG | Fine-tuning |
|---|---|---|
| 목적 | 지식 주입 | 스타일/동작 변경 |
| 최신 정보 반영 | 쉬움 (DB 업데이트) | 어려움 (재학습 필요) |
| 비용 | 추론 비용 | 학습 비용 (GPU) |
| 데이터 필요량 | 불필요 | 필요 (수백~수천 샘플) |
| 적합한 경우 | 사실 기반 QA | 특정 형식/어조, 분류 태스크 |
Fine-tuning 기법
Full Fine-tuning
모든 파라미터 업데이트. 최고 성능이지만 비용 큼.
PEFT (Parameter-Efficient Fine-Tuning)
일부 파라미터만 학습해 효율적으로 미세조정.
LoRA (Low-Rank Adaptation)
— 가중치 행렬에 저랭크 행렬 삽입
— 학습 파라미터 수 대폭 감소 (1~5%)
— 가장 널리 사용
QLoRA
— LoRA + 4비트 양자화
— 소비자급 GPU(24GB)에서 13B 모델 파인튜닝 가능
Prefix Tuning / Prompt Tuning
— 입력에 학습 가능한 소프트 토큰 추가
데이터 형식 (Instruction Tuning)
// JSONL 형식
{"messages": [
{"role": "system", "content": "당신은 전문 번역가입니다."},
{"role": "user", "content": "Hello, how are you?"},
{"role": "assistant", "content": "안녕하세요, 잘 지내고 있습니다."}
]}OpenAI Fine-tuning
from openai import OpenAI
client = OpenAI()
# 파일 업로드
file = client.files.create(
file=open("training_data.jsonl", "rb"),
purpose="fine-tune"
)
# 파인튜닝 시작
job = client.fine_tuning.jobs.create(
training_file=file.id,
model="gpt-4o-mini"
)
# 완료 후 사용
response = client.chat.completions.create(
model=job.fine_tuned_model,
messages=[{"role": "user", "content": "..."}]
)LoRA 구현 (Hugging Face)
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.2-3B")
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # 랭크
lora_alpha=32, # 스케일링
target_modules=["q_proj", "v_proj"],
lora_dropout=0.1,
)
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 4,194,304 || all params: 3,215,617,024 || trainable%: 0.13%학습 팁
- 데이터 품질 > 데이터 양
- 최소 수백 개 샘플 권장 (태스크 복잡도에 따라 다름)
- 학습률은 사전학습보다 낮게 (1e-4 ~ 1e-5)
- Overfitting 주의 — validation loss 모니터링