🌏 LLM Fine-tuning이란?
✅ 개념
LLM(Fine-tuning)은 이미 사전 학습된 대규모 언어모델(Pre-trained LLM)을 특정 목적에 맞게 추가로 학습시키는 과정입니다.
쉽게 말해, GPT나 LLaMA 같은 모델이 이미 ‘언어의 일반적인 패턴’을 충분히 배웠다면, Fine-tuning은 여기에 도메인 지식, 기업 데이터 등을 추가해 모델이 더 내가 원하는 답을 정확하게 하는 것입니다.
예를 들어 GPT가 “일반적인 언어 전반”을 안다면, Fine-tuning된 모델은 “법률 문서 요약”이나 “우리 제품의 정보를 안 상태로 자동 고객 응대” 같은 특정 작업을 훨씬 더 잘하게 됩니다.
Fine-tuning은 거대한 언어모델을 다시 처음부터 가르치는 것이 아닙니다. 이미 똑똑한 모델에게 “우리 회사의 방식”이나 “특정 업무 스타일”을 익히게 하는 마무리 훈련에 가깝습니다.
다만 GPU 리소스 등을 고려해야 하며, 최근에는 RAG(Retrieval-Augmented Generation)와 병행해 추가적인 학습 없이도 도메인 지식을 확장하는 방법도 많이 쓰입니다. (맨 뒷 부분에서 비교해보겠습니다)
✅ Fine-tuning이 필요한 이유
- 특정 도메인 적응
- 일반 모델은 의료, 법률, 제조처럼 전문 용어가 많은 영역에서 성능이 떨어질 수 있습니다.
- Fine-tuning으로 그 분야의 텍스트를 학습시키면 맥락을 더 잘 이해하게 됩니다.
- 말투/일관성
- 예를 들어 기업 챗봇이라면 “친절하고 정중한 말투”로 답하도록 일관성을 부여할 수 있습니다.
- 모델의 행동 제어
- 일반 모델은 “추론형 답변”을 하거나 “창의적인 생성”을 하지만, Fine-tuning을 통해 “항상 JSON으로 대답”처럼 출력 형식과 행동을 제어할 수도 있습니다. (백엔드에서 LLM 호출값을 활용할 때 유용하겠쥬?)
✅ 파인튜닝 방법
Fine-tuning은 전체 파라미터를 학습시키는 Full Fine-tuning과, 일부만 조정하는 Parameter-efficient Fine-tuning(PEFT)으로 나뉩니다.
| 방법 | 특징 | 예시 |
|---|---|---|
| Full Fine-tuning | 모든 파라미터 업데이트 → 비용, 데이터 많음 | 대기업 모델 커스터마이징 |
| LoRA (Low-Rank Adaptation) | pre-trained model 파라미터는 모두 그대로!!! | |
| 모델 일부에 작은 가중치 행렬을 추가 | 효율적이고 경량화된 Fine-tuning | |
| Prefix / Adapter Tuning | 입력 앞뒤에 특수 토큰을 추가 | 빠른 도메인 적응, 재사용 쉬움 |
이제는 벌써 과거가 되어버린 GPT-3만 하더라도 파라미터가 175 Billion개인 것을 생각해보면 Full Fine Tuning은 조금 망설여볼 필요가 있습니다. 또 정말 냉정하게 내가 파인튜닝한 모델이 과연 현재 GPT의 일반적인 성능보다 좋을까도 잘 생각해볼 필요가 있습니다 (비싼 돈 들여 튜닝했는데 성능이 더 떨어질 수도 있습니당)
현재는 LoRA가 가장 널리 사용됩니다. GPU 메모리 사용이 적고, 기존 모델을 그대로 활용할 수 있기 때문입니다.
✅ Fine Tuning 데이터 구성
Fine-tuning의 성패는 데이터 품질에 달려 있습니다.
보통 아래 세 가지 형태로 데이터를 준비합니다.
- Instruction + Input + Output
- 예: “아래 문장을 요약해줘.” → “오늘 회의에서는 AI 모델 최적화가 논의됨.”
- 문답 데이터(QA 형태)
- 예: “RAG란 무엇인가요?” → “LLM이 외부 지식을 불러와 활용하는 구조입니다.”
- 대화형 데이터(Chat 형태)
- 예: 사용자와 모델 간 다턴 대화를 저장하여 학습
🌏 LoRA(Low-Rank Adaptation)
✅ 개념
LoRA(Low-Rank Adaptation)는 LLM 전체를 다시 학습하지 않고, 기존 모델의 일부 가중치만 추가로 학습시키는 방식입니다.
LLM의 파라미터는 수십억 개이기 때문에, 전체를 학습하려면 GPU 메모리와 시간이 엄청나게 듭니다.
LoRA는 기존 pre trained model의 거대한 가중치 W는 그대로 두고, 아주 작은 보정 행렬 ΔW만 학습하도록 만들어졌습니다. 즉, 모델은 그대로 두되, LoRA가 추가로 만든 조정 레이어만 훈련합니다.
기존 LLM (pre-trained model)
│
│ (기존 파라미터는 freeze)
↓
[LoRA 모듈 추가]
│
├── 작은 선형 레이어 A, B (low-rank 행렬)
├── ΔW = A * B 형태로 기존 가중치 보정
↓
Fine-tuning 수행
✅ 코드 예시
from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments
from peft import LoraConfig, get_peft_model
from datasets import load_dataset
# 1. 모델과 토크나이저 불러오기
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 2. LoRA 설정
lora_config = LoraConfig(
r=8, # rank 크기 (작을수록 경량)
lora_alpha=16, # scaling factor
lora_dropout=0.05, # dropout 비율
target_modules=["q_proj", "v_proj"] # 주로 Attention 레이어에 적용
)
# 3. LoRA 적용
model = get_peft_model(model, lora_config)
# 4. 데이터 로드
dataset = load_dataset("json", data_files={"train": "train.jsonl", "eval": "eval.jsonl"})
# 5. 토크나이징 함수
def tokenize_function(example):
text = f"{example['instruction']}\n{example['input']}\n{example['output']}"
return tokenizer(text, truncation=True)
tokenized_datasets = dataset.map(tokenize_function, batched=True)
# 6. 학습 설정
training_args = TrainingArguments(
output_dir="./lora-llm",
per_device_train_batch_size=2,
num_train_epochs=3,
logging_steps=10,
save_strategy="epoch",
fp16=True, # GPU 메모리 절약
)
# 7. Trainer 실행
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["eval"],
)
trainer.train()
🌏 Fine-Tuning vs RAG
Fine-tuning과 RAG 모두 LLM에게 더 내가 원하는 답변을 커스텀하기 위한 방법입니다.
초기 LLM(특히 GPT-2, GPT-3 시절)에는 컨텍스트 윈도우(context window) 한계가 컸습니다.
LLM이 몇백~몇천 토큰밖에 못 봤기 때문에, RAG로 긴 문서를 붙이면 정보가 잘리는 문제가 자주 생겼습니다. (긴 글을 프롬프트로 보내면 앞부분을 잊어버려서 앞뒤가 잘 안맞는 답변이 생성되는것)
그래서 외부에서 정보를 주입하기보다는 모델 자체에 지식을 내재화하는 것이 대세였고, 그래서 2021~2022년쯤은 LoRA, Adapter, Prefix 같은 Parameter-efficient Fine-tuning(PEFT) 연구가 많이 진행되었습니다.
하지만 LLM이 길고 복잡한 문맥을 이해할 수 있게 되면서 (GPT-4o, Claude 3, Gemini 1.5 등은 200k~1M 토큰까지 처리합니다.) 예전엔 문서 전체를 넣을 수 없었지만, 이제는 보고서 한 권 통째로 넣는 것도 가능합니다.
벡터 임베딩 품질이 좋아지고, re-ranking, graph-RAG, multi-hop retrieval 같은 기법이 나오면서
검색 결과가 문맥에 맞지 않는다는 문제도 줄었습니다.
또 모델이 커질수록 재학습이 너무 비싸졌습니다. GPU 1~2대로도 가능하던 시대에서 H100 클러스터 몇 대가 필요하게 되어서 파인튜닝이 부담이 점점 커지기 시작했습니다. 반면, RAG는 데이터만 바꾸면 즉시 적용 가능하기 때문에 최근에는 지식을 모델 안에 넣기보단, 밖에 두는 기업이 많아진 것 같습니다.
두가지를 함께 사용하더라도 좋은 결과를 충분히 얻을 수 있습니다.
(Fine Tuning은 가볍게, RAG를 통해 답변 보완)
| 구분 | Fine-tuning | RAG (Retrieval-Augmented Generation) |
|---|---|---|
| 방식 | 모델 자체를 다시 학습시켜 지식을 “내재화” | 외부 지식베이스를 “조회”하여 실시간으로 반영 |
| 데이터 저장 위치 | 모델 파라미터 내부 (Internal Memory) | 외부 DB / 벡터스토어 (External Memory) |
| 응답 시 동작 | 질문 → 모델이 자체 기억을 바탕으로 생성 | 질문 → 벡터 검색 → 관련 문서 불러와 함께 생성 |
| 업데이트 방식 | 재학습 필요 (비용↑) | 데이터베이스만 업데이트 (빠름) |
| 대표 활용 | 특정 말투, 도메인, 포맷 학습 | 최신 정보, 내부 문서, 회사 데이터 활용 |
| 예시 | “의학 논문 요약 모델”, “고객 응대 말투 모델” | “사내 위키 기반 질의응답”, “뉴스 기반 챗봇” |
✅ Fine-tuning의 장단점
장점
- 모델이 완전히 새롭게 도메인에 적응
- 응답 톤, 표현, 추론 스타일 모두 학습 가능
- RAG보다 일관된 답변과 자연스러운 문체
- 추론 속도가 빠름 (외부 검색 과정 없음)
단점
- 재학습 필요: GPU, 시간, 비용 부담
- 데이터 저작권, 라이선스 이슈 존재
- 최신 정보 반영이 어려움 (매번 재학습해야 함)
예시
- 말투나 스타일, 태스크 포맷을 통일해야 할 때
- 예. “AI 상담봇”, “요약/번역/리라이팅 전용 모델”
✅ RAG의 장단점
장점
- 학습 없이도 지식 확장 가능 (데이터만 추가)
- 최신 정보 반영이 즉시 가능
- 법적 리스크 적음 (모델 파라미터 변경 X)
단점
- 검색 품질에 따라 답변 품질이 좌우됨
- 문맥 결합(Context Fusion)이 어렵고 불안정할 수 있음
- 답변 톤이나 표현 방식은 제어가 약함
예시
- “사내 문서, 논문, 뉴스, 제품 매뉴얼” 등 지속적으로 갱신되는 데이터 기반 Q&A
- 예. 사내 지식 챗봇, 법률 질의응답, 연구 논문 검색 시스템

도움이 되었다면, 공감/댓글을 달아주면 깃짱에게 큰 힘이 됩니다!🌟
비밀댓글과 메일을 통해 오는 개인적인 질문은 받지 않고 있습니다. 꼭 공개댓글로 남겨주세요!
'AI > LLM' 카테고리의 다른 글
| [AI/LLM] LangChain & LangGraph: RAG 구현(LLM 파이프라인 설계)의 고통을 아시나요? (1) | 2025.11.28 |
|---|---|
| [AI/LLM] MCP(Model Context Protocol): LLM이 곧바로 DB에서 최신 데이터도 읽고, 메일도 보내준다고? (2) | 2025.11.21 |
| [AI/LLM] 거대한 LLM에서 가벼운 sLLM으로: LLM 경량화 필요성과 방법 (0) | 2025.10.20 |