오늘 끝나면
Fine-tuning & RAG
- ✓Fine-tuning & RAG의 핵심 문제를 한 문장으로 설명한다
- ✓오른쪽 실습에서 Fine이 어떻게 움직이는지 관찰한다
- ✓다음 강의와 이어지는 한계를 말할 수 있다
실습 미션
LoRA·QLoRA·RAG — 기업 도입 수요 최고 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.
성공 조건
- □실습의 기본값을 먼저 관찰
- □입력값이나 모드를 한 번 이상 바꿔 결과 비교
- □왜 결과가 바뀌었는지 한 문장으로 설명
AI · Day 21 / 실무
모델에 지식을
넣는 두 가지 길
범용 LLM을 "우리 회사의 뇌"로 만드는 길은 둘이다.
Fine-tuning(LoRA·QLoRA)은 가중치를 바꾼다.
RAG는 모델 밖 지식을 검색해 넣는다.
오늘은 둘 다 바닥부터 조립한다. 뭘 제안할지 고르는 프레임까지 챙긴다.
회사 규정을 모르는 GPT
한 금융사가 사내 챗봇을 GPT-4로 만들었다.
첫날 임원이 물었다. "우리 퇴직연금 DC형 수수료 얼마지?"
GPT가 존재하지 않는 수수료율을 자신만만하게 답했다.
챗봇은 그날로 신뢰를 잃었다.
모델이 그 회사 규정을 배운 적이 없기 때문이다.
범용 LLM에는 한계가 셋 있다. 도메인 용어를 모르고, 학습 컷오프 이후를 모르며, 모르는 것을 그럴싸하게 지어낸다.
지어내는 이유는 학습 방식에 있다. LLM은 P(다음 토큰 | 앞 토큰)만 최대화하고, 사실을 검증하는 회로는 없다. 학습 분포를 따라갈 뿐 진실의 분포는 따르지 않는다.
해법은 두 갈래다. 가중치에 박아넣는 Fine-tuning, 생성 시점에 주입하는 RAG.
Q. 가장 먼저 던져야 할 의사결정 질문은?
"이건 스타일 문제인가, 지식문제인가?" 톤·포맷·JSON 출력 같은 형식이면 Fine-tuning이다. 최신 정보·사내 문서·사실 정확도면 RAG다. 둘 다면 Hybrid다.세 한계의 해법은 가중치에 박거나(FT) 생성 때 주입하는 것(RAG)이다
LoRA, 100배 싸게 튜닝하기
2020년, GPT-3(175B)가 나왔다.
기업들이 "우리 도메인에 맞게 튜닝하자"며 들썩였다.
그런데 현실은 A100 80GB 16장에 수천만 원이었다. 거의 불가능이었다.
2021년, Microsoft가 던진 통찰은 한 줄이다.
"학습으로 생기는 가중치 변화 ΔW는 본래 저차원이다."
그래서 거대한 W는 통째로 얼린다.
작은 두 행렬의 곱으로 변화만 학습한다. W' = W + B·A.
A는 가우시안으로, B는 0으로 초기화한다.
그래서 처음엔 모델이 그대로다.
숫자로 보면 차이가 크다.
d=k=4096, r=8이면 Full은 1,677만 개를 학습한다.
LoRA는 65,536개뿐이다. 약 256배, 즉 0.39%만 건드린다.
그래도 성능은 거의 같다.
실제로 대기업 HR 챗봇 견적이 1억 2천만 원이었다.
LoRA로 1,200만 원까지 떨어진 적이 있다.
거대한 W는 얼리고 작은 B·A만 학습한다. 0.39%로 거의 같은 성능이다
QLoRA, GPU 한 장의 시대
2023년 5월, Tim Dettmers의 QLoRA 논문이 커뮤니티를 뒤집었다.
"LLaMA 65B를 A6000 48GB 한 장에서 튜닝 가능."
전엔 최소 8장이 필요했던 일이다.
비결은 셋이다.
4bit NF4는 정규분포 분위수에 16레벨을 배치한다.
신경망 가중치가 정규분포 모양이라, 균등 int4보다 손실이 적다.
Double Quantization은 양자화 스케일 값마저 다시 양자화한다.
Paged Optimizer는 메모리가 튈 때만 CPU로 페이징한다.
이걸로 OOM을 막는다.
결과적으로 7B 튜닝 VRAM이 약 120GB에서 약 15GB로 내려간다.
RTX 3090·4090 같은 소비자급 한 장이면 충분하다.
클라우드를 못 쓰는 금융·공공도 이제 서버룸 GPU 한두 장으로 자체 LLM을 가질 수 있다.
파이썬 코드 보기
# QLoRA 핵심 세팅 (bitsandbytes)
cfg = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # 정규분포 4bit
bnb_4bit_use_double_quant=True, # 스케일도 양자화
bnb_4bit_compute_dtype="bfloat16",
)
# optim="paged_adamw_8bit" -> gradient spike만 페이징| 7B 메모리 | Full | LoRA | QLoRA |
|---|---|---|---|
| Base Model | 28GB | 14GB | 4GB |
| Gradients | 28GB | 0.2GB | 0.2GB |
| Optimizer | 56GB | 0.4GB | 0.4GB |
| Activations | 10GB | 10GB | 10GB |
| 합계 | 약 120 | 약 25 | 약 15 |
RTX 3090·4090(24GB) 한 장으로 7B를 튜닝한다. 단일 GPU의 시대다
RAG, 외우지 말고 찾게 하자
2020년, Meta의 Patrick Lewis 팀이 발상을 바꿨다.
"모델이 다 외우게 하지 말고, 필요할 때 찾아보게 하자."
사람이 검색하고 요약하듯 LLM에 retrieval 단계를 붙인 것이다.
파이프라인은 이렇게 흐른다.
먼저 문서를 잘게 자른다(Chunking).
벡터로 임베딩해 Vector DB에 넣는다.
질문이 오면 코사인 유사도로 후보를 검색(Retrieval)한다.
Reranker로 정밀하게 추린다.
그 근거만 넣어 LLM이 답한다.
그래서 환각이 줄고, 최신성이 생기고, 근거(citation)까지 붙는다.
RAG 품질의 80%는 Chunking과 Reranking에서 나온다.
모델을 바꾸기 전에 이 둘부터 튜닝하자.
Retrieval은 Recall을 위해 느슨하게 top-20을 뽑는다.
Reranker가 Precision을 위해 top-3로 좁힌다.
이 분업이 정석이다. Reranker만 더해도 faithfulness가 10~20%p 오른다.
Q. exact match가 중요할 땐 무엇을 더하나요?
제품 코드·사번·법조문 번호처럼 정확한 토큰이 핵심이면 Hybrid Search(BM25 키워드 + Vector 의미)가 Vector 단독보다 월등하다.언제 무엇을 쓰나, 황금률
황금률은 한 줄이다.
"Fine-tuning은 모델의 성격을, RAG는 모델의 기억을 바꾼다."
성격은 자주 바꿀 일이 아니다. 그런데 기억은 매일 업데이트된다.
그래서 대부분의 엔터프라이즈 프로젝트는 RAG로 시작한다.
문서가 자주 바뀌는 사내 FAQ는 RAG로 간다.
브랜드 톤을 강제하는 마케팅 카피는 LoRA로 간다.
최신 판례를 반영하면서 법무 톤도 지켜야 하면 Hybrid로 간다.
클라우드를 못 쓰는 보안 극강 환경이면 QLoRA 온프렘 + 로컬 RAG로 간다.
마지막으로 "감"이 아니라 지표로 평가하자.
Ragas의 세 숫자가 의사결정을 만든다.
faithfulness는 환각 여부를 본다.
context_precision은 검색 적절성을 본다.
context_recall은 누락 여부를 본다.
Q. LLaMA-2 7B를 RTX 3090(24GB) 한 장에서 튜닝하려면?
QLoRA(NF4 4bit + LoRA r=16 + paged AdamW 8bit)를 쓴다. 예상 VRAM은 약 10~15GB다. batch size 2에 grad accumulation 4 정도를 권한다.| 요구 | FT | RAG | Hybrid |
|---|---|---|---|
| 최신 정보 | ✕ | ○ | ○ |
| 환각 감소 | △ | ○ | ◎ |
| 말투·포맷 | ◎ | ✕ | ○ |
| 도메인 용어 | ○ | △ | ○ |
| 구축 비용 | 중 | 저 | 중 |
| 업데이트 | 몇 주 | 즉시 | 즉시 |
성격은 FT, 기억은 RAG로 바꾼다. 대부분 RAG로 시작하고 필요하면 LoRA를 얹는다