LLM 파인튜닝 방법 [그리고 RAG나 프롬프팅을 대신 사용해야 하는 경우]

이 가이드에서는 LLM을 파인튜닝하는 방법을 단계별로 설명하고, 전체 파인튜닝과 LoRA 및 QLoRA를 비교하며, 모델의 출력을 개선하는 데 프롬프팅이나 RAG가 더 나은 경우를 알려 드립니다.

Diagram comparing pre-training and fine-tuning: pre-training turns a vast general text corpus (trillions of tokens, large labs, huge compute) into a base model, while fine-tuning combines a base model with a small task-specific dataset (a few hundred to a few thousand examples, one GPU, hours) to produce a specialized model.

대규모 언어 모델(LLM) 파인튜닝이란 사전 학습된 LLM을 특정 작업에 맞춘 소규모 데이터 세트로 추가 학습시켜, 프롬프트만으로는 얻을 수 없는 출력을 내도록 다듬는 것을 말합니다.

파인튜닝은 원하는 동작을 보여 주는 입력/출력 예시 쌍을 수집하고, 모델의 가중치가 그 예시에 가까워지도록 학습 패스를 실행한 다음, 그 결과를 원래 모델의 출력과 비교해 확인하는 과정으로 이루어집니다. LoRA 같은 파라미터 효율적 방법을 사용하면 단일 GPU에서도 실행할 수 있을 만큼 비용이 낮아집니다.

LLM 출력이 만족스럽지 않다면 먼저 프롬프트와 검색 증강 생성(RAG)을 개선하세요. 파인튜닝은 LLM의 동작 방식을 바꿉니다. LLM이 최신 정보나 독점 정보를 활용해야 할 때는 대개 프롬프트와 RAG가 더 나은 선택입니다.

이 글에서는 LLM을 단계별로 파인튜닝하는 방법, 주요 파인튜닝 방법(LoRA와 QLoRA), 그리고 과정을 그르칠 수 있는 어려움과 실수를 살펴봅니다.

LLM 파인튜닝이란 무엇이며 LLM 사전 학습과 어떻게 다른가

LLM 사전 학습은 방대한 코퍼스로 모델의 일반적인 언어 능력을 처음부터 구축하는 반면, LLM 파인튜닝은 사전 학습된 모델을 소규모 데이터 세트로 조정해 하나의 작업에 맞춥니다.

LLM 사전 학습은 기본 모델을 만들어 내는, 리소스가 많이 드는 단계입니다. 모델은 폭넓은 텍스트 코퍼스로 학습해 일반적인 문법, 사실, 추론 능력을 갖추지만, 여러분의 작업에 특화되어 있지는 않습니다.

LLM 파인튜닝은 엄선된 소규모 데이터 세트로 기본 모델의 학습을 이어 가, 특정 작업이나 사용 사례에서 원하는 출력을 내도록 만듭니다. 일관된 형식, 브랜드 보이스나 어조, 도메인 특화 패턴, 안정적인 도구 및 함수 호출 등을 떠올려 보세요.

LLM을 파인튜닝해야 할 때와 대신 프롬프트나 RAG를 사용해야 할 때

LLM 성능을 개선하려면 다음 순서로 단계를 밟아 나가세요: 프롬프트 -> RAG -> 파인튜닝.

더 자세한 지침으로 프롬프트를 개선하고, RAG를 사용해 모델에 최신 정보를 제공하세요. 파인튜닝은 프롬프트와 검색을 개선해도 효과가 없을 때만 사용하세요.

접근 방식

변경 대상

사용 시기

주요 한계

프롬프트 엔지니어링

전송하는 요청

동작이 원하는 수준에 가깝고, 빠른 속도와 손쉬운 되돌리기가 필요할 때

기본 모델의 기존 능력을 넘어설 수 없음

RAG

추론 시점에 모델이 보는 내용

사실 정보가 자주 바뀌고, LLM이 최신 정보에 접근해야 할 때

검색 지연 시간과 인프라 부담이 추가되며, 동작은 바뀌지 않음

LLM 파인튜닝

모델의 가중치(내부 모델 파라미터)

대규모로 일관된 동작, 형식, 어조가 필요하거나 매 호출마다 더 짧은 프롬프트를 사용하고 싶을 때

초기 비용, 가중치에 내재된 지식의 노후화, 사전 학습된 동작을 잊어버릴 위험

더 나은 프롬프트가 파인튜닝보다 효과적인 경우와 프롬프트만으로는 부족한 경우

프롬프트는 가장 빠르고 저렴한 수단입니다. 많은 경우 더 정확하고 자세한 프롬프트만으로도 원하는 동작 변화를 얻을 수 있습니다.

하지만 프롬프트가 길어지면 작업 속도가 느려지고 비용이 늘어나며, 모델의 기존 한계를 극복할 수도 없습니다.

프롬프트가 한계에 도달했을 수 있다는 신호:

  • 새로운 엣지 케이스가 계속 출력을 망가뜨립니다: 예를 들어 JSON이 필요한데 모델이 일반 텍스트를 반환하거나 어조가 어긋나서, 새로운 사례가 생길 때마다 프롬프트를 수정하게 됩니다.
  • 시스템 프롬프트가 계속 길어집니다: 프롬프트가 수백, 수천 줄에 달해 관리하기 어렵습니다.
  • 매 호출마다 비용이 발생합니다: 요청할 때마다 프롬프트가 다시 전송되고 다시 처리되므로 토큰 비용과 지연 시간이 늘어납니다.
  • 변경해도 차이가 없습니다: 새 지침을 추가해도 출력이 개선되지 않습니다.

그렇더라도 먼저 비용이 덜 드는 프롬프트 수준의 해결책을 시도해 보세요. 퓨샷 예시(입력/출력 쌍)로 모델에 패턴을 보여 주거나, 프롬프트 체이닝으로 어려운 작업을 더 작은 단계로 나누거나, 함수 호출 훅으로 정확한 조회나 계산을 위임할 수 있습니다.

모델 파인튜닝보다 RAG가 더 적합한 경우

RAG는 LLM이 아는 내용을 바꾸고, LLM 파인튜닝은 LLM의 동작 방식을 바꿉니다. 부족한 것이 지식, 특히 자주 바뀌거나 자체 문서에 담긴 지식이라면 RAG가 답입니다. 부족한 것이 동작이라면 파인튜닝하세요.

파인튜닝도 모델이 아는 내용을 바꾸지만, 모델이 흡수한 사실은 학습 시점에 고정되어 변화가 빠른 분야에서는 금세 시의성을 잃습니다. 또한 정보가 모델의 가중치에 녹아들기 때문에 출처에 대한 기록이 남지 않습니다.

검색 계층이 사용하는 원본 문서를 업데이트하는 편이 더 빠르고 저렴하며, 검색 계층은 실제로 사용한 출처를 정확히 인용할 수도 있습니다. 따라서 근거가 확실한 최신 정보가 필요할 때 더 나은 선택입니다.

RAG의 단점은 무엇일까요? 구축하고 유지 관리해야 할 계층이 하나 더 생기고, 지연 시간이 늘어난다는 점입니다.

실제로는 둘 다 필요한 경우가 많습니다. 프로덕션 시스템에서는 파인튜닝된 모델과 RAG를 함께 사용해, 하나는 일관된 동작에, 다른 하나는 최신 사실 정보에 활용합니다.

흔히 겪는 파인튜닝의 함정, 위험, 과제

파인튜닝이 적합한 도구일 때도 비용과 위험이 따릅니다.

  • 비용과 시간: 깔끔하고 대표성 있는 학습 데이터를 수집·정리하는 일과 학습에 필요한 컴퓨팅 자원 모두 비용이 많이 듭니다.
  • 파국적 망각: 범위가 좁은 데이터 세트로 학습하면 모델이 일반적인 능력을 잃고 새로운 실패 패턴을 보이게 되어, 기본 모델에서는 없던 오류가 발생할 수 있습니다.
  • 과적합: 데이터가 너무 적거나 반복적이면 모델이 패턴을 학습하는 대신 학습 예시를 암기해 버려, 학습 샘플에서는 성능이 좋지만 실제 입력에서는 성능이 떨어집니다.
  • 노후화: 가중치에 내재된 지식은 금방 낡기 때문에 새 데이터로 다시 학습해야 합니다.
  • 구식화: 더 강력한 모델이 출시되면 별도 조정 없이도 여러분이 파인튜닝한 모델보다 성능이 뛰어난 경우가 많아, 작업을 다시 해야 합니다.
  • 평가 및 재현의 어려움: 파인튜닝된 모델이 기본 모델보다 성능이 뛰어나다는 것을 입증하기는 어렵습니다. 또한 같은 설정으로 GPU 학습을 두 번 실행해도 서로 약간 다른 모델이 나올 수 있습니다.
  • 데이터 거버넌스: 독점 데이터나 민감한 데이터로 학습하면 개인정보 보호 및 라이선스 문제가 생기며, 모델이 나중에 학습한 내용의 일부를 노출할 수 있습니다.

주요 파인튜닝 방법

LLM 파인튜닝의 주요 유형은 모델을 얼마나 변경하는지에 따라 나뉩니다. 전체 파인튜닝은 모델 전체를 다시 학습시키는 반면, LoRA와 QLoRA 같은 파라미터 효율적 파인튜닝(PEFT) 방법은 일부 가중치만 업데이트합니다. PEFT 방법은 전체 파인튜닝에 비해 메모리가 훨씬 적게 들며, 적절한 설정을 사용하면 비슷한 결과를 얻을 수 있습니다.

전체 파인튜닝은 모델의 모든 가중치를 업데이트합니다. 비용이 가장 많이 들고 파국적 망각의 위험도 가장 큽니다. 큰 폭의 동작 변화가 필요하고 이를 뒷받침할 데이터와 컴퓨팅 자원이 있을 때만 사용하세요.

대안은 파라미터 효율적 파인튜닝, 즉 PEFT입니다. PEFT는 모델의 대부분을 고정하고 소수의 파라미터만 학습시키는 방법들을 아우르는 용어입니다. 기본 모델이 그대로 유지되므로 메모리 사용량이 훨씬 적고 망각이 일어날 가능성도 낮습니다.

낮은 랭크에서는 PEFT가 전체 파인튜닝보다 학습하는 양이 적지만, 랭크를 높이고 학습률을 조정하면 인스트럭션 튜닝 작업에서 그 격차를 대부분 좁힐 수 있습니다.

PEFT 방법에는 다음과 같은 것이 있습니다.

  • LoRA(Low-Rank Adaptation): 일반적인 출발점으로, 원래 가중치를 고정하고 새로 추가한 소수의 어댑터 파라미터(대개 전체의 1% 미만)만 학습시키므로 소비자용 GPU 한 대에서도 실행할 수 있습니다.
  • QLoRA(Quantized Low-Rank Adaptation): LoRA를 적용하기 전에 기본 모델을 4비트 정밀도로 압축하므로, 단일 GPU에서 대규모 모델을 파인튜닝할 수 있습니다.

방법

업데이트 대상

실제 하드웨어 요구 사항

사용 시기

전체 파인튜닝

모델의 모든 가중치

7B급 모델은 멀티 GPU 노드 1개, 더 큰 모델은 훨씬 더 많은 자원 필요

깊은 수준의 동작 변화가 필요하고 데이터와 컴퓨팅 자원이 있을 때

LoRA(PEFT)

새로 추가한 소수의 어댑터 가중치

소비자용 GPU 1대

기본 출발점

QLoRA(PEFT)

4비트로 압축된 기본 모델 위의 LoRA 어댑터

단일 GPU에서 초대형 모델 실행 가능

메모리는 부족하지만 큰 기본 모델을 사용하고 싶을 때

이 외에도 모델이 지시를 따르는 방식과 사람의 선호에 부합하는 방식을 다듬기 위해, RLHF(Reinforcement Learning from Human Feedback, 인간 피드백 기반 강화 학습)부터 직접 선호 최적화(DPO), 오즈비 선호 최적화(ORPO) 같은 더 가벼운 대안에 이르기까지 다양한 인스트럭션 튜닝 및 선호 튜닝 방법을 사용합니다.

LLM을 단계별로 파인튜닝하는 방법

LLM 파인튜닝이 올바른 선택이라고 판단했다면, 다음 워크플로우를 따르세요.

1단계: 작업과 성공 측정 방법 정의하기

LLM에서 원하는 동작이 무엇인지, 그리고 그 동작을 얻었는지 어떻게 확인할지 정하세요.

파인튜닝된 모델이 수행할 구체적인 작업을 정하세요. 예를 들어 지원 티켓 분류, 정해진 형식으로 계약서 요약, 사내 스타일에 맞춘 코드 생성 등이 있습니다.

그런 다음 성공 기준을 정의하세요. 일반적인 기준은 다음과 같습니다.

  • 출력 유효성: 예를 들어 결과가 유효한 JSON으로 파싱되나요? 필요한 Markdown 구조와 일치하나요?
  • 자동 점수: 생성된 텍스트를 참조 답변과 비교하는 BLEU나 ROUGE 같은 지표를 사용하거나, 레이블이 지정된 세트에서 작업 정확도를 측정하세요.
  • 사람 평가: 어조나 유용성처럼 스크립트로는 제대로 평가하기 어려운 품질에 대해 점수형 또는 합격/불합격 루브릭을 사용합니다.
  • 어려운 입력에 대한 안정성: 기본 모델이 제대로 처리하지 못했던 특이한 입력을 처리할 수 있나요?

2단계: 데이터 세트 준비하기

데이터 품질이 파인튜닝의 성패를 좌우하므로, 적절한 파인튜닝 데이터 세트를 수집하는 데 공을 들이세요.

데이터를 JSONL 형식의 지시/응답 쌍으로 구성하세요. 각 줄에는 입력(및 관련 컨텍스트)과 돌려받고 싶은 정확한 출력이 들어갑니다.

예를 들어 범용 지시 데이터 세트인 Alpaca-cleaned나 Databricks의 Dolly 같은 공개 데이터 세트를 살펴보거나, 77개 의도로 레이블이 지정된 13,000건 이상의 실제 지원 문의가 담긴 작업 특화 데이터 세트 banking77을 확인해 보세요.

특정 작업에 집중한다면 깔끔하고 다양한 예시 수백~수천 개만으로도 동작을 바꿀 수 있습니다. 단, 예시가 엣지 케이스를 포함해 실제 프로덕션 입력을 반영하고 일관된 형식을 갖추고 있어야 합니다.

아직 입력/출력 쌍이 없나요? 지원 티켓과 그에 대한 가장 좋은 답변, 또는 문서와 그 요약처럼 이미 보유한 데이터로 세트를 구축하세요.

출력만 있다면 더 강력한 모델로 각 출력에 맞는 그럴듯한 입력을 생성하거나, 소규모 시드 세트를 직접 작성한 뒤 더 큰 "교사" 모델로 확장하고 가장 좋은 쌍만 남기세요.

마지막으로 데이터를 학습, 검증, 테스트 세트로 분할해 모델이 보지 못한 예시로 성능을 측정할 수 있도록 하세요.

3단계: 기본 모델과 방법 선택하기

30억~70억 개 파라미터 규모의 소형 오픈 소스 모델과 LoRA 또는 QLoRA 같은 파라미터 효율적 파인튜닝 방법으로 시작하세요.

Llama, Mistral, Qwen 같은 오픈 모델 제품군은 직접 호스팅할 수 있는 강력한 기반을 제공하며, PEFT 방법을 사용하면 하드웨어 요구 수준이 낮아집니다. QLoRA는 기본 모델을 4비트로 양자화하므로 7B 모델을 파인튜닝하는 데 16~24GB 소비자용 그래픽 카드만 있으면 됩니다. 같은 모델을 전체 파인튜닝하려면 그보다 몇 배나 많은 메모리가 필요합니다.

4단계: 학습 하이퍼파라미터 설정하기

주요 LLM 파인튜닝 파라미터와 권장 시작 범위는 다음과 같습니다.

  • 학습률은 가중치를 한 번 업데이트할 때의 크기를 제어합니다. Biderman 등의 2024년 연구에 따르면 LoRA의 최적 학습률은 일반적으로 5e-5~5e-4로, 1e-5~5e-5인 전체 파인튜닝보다 약 10배 높았습니다. 이 연구는 1e-5에서 5e-4까지 탐색한 뒤 안정적으로 학습되는 가장 높은 값을 사용할 것을 권장합니다.
  • 배치 크기는 모델이 가중치를 한 번 업데이트하기 전에 학습하는 예시의 수입니다. 단일 GPU에서는 장치당 배치를 1~8 정도로 작게 설정하고, 그래디언트 누적을 사용해 유효 배치를 약 16~64로 맞추세요.
  • 에포크 수는 모델이 전체 데이터셋을 몇 번 학습하는지를 나타냅니다. 특정 작업을 수행하도록 모델을 학습시킬 때는 1~3회가 일반적인 기준이지만, LoRA 학습에서는 더 많은 에포크가 필요한 경우가 많습니다.
  • LoRA 랭크(r)는 어댑터의 용량, 즉 어댑터가 학습할 수 있는 양을 결정합니다. 단순한 작업은 8~32에서 시작하고, 어려운 작업일수록 값을 높이세요. 앞서 인용한 Biderman 외 연구진의 LoRA 연구에 따르면, 7B 모델을 코드 데이터로 인스트럭션 튜닝할 때 전체 파인튜닝과 같은 성능을 내려면 랭크 256이 필요했고, 수학에서는 랭크 64로도 근접한 성능을 보였습니다.
  • 최대 시퀀스 길이는 학습에서 처리하는 가장 긴 입력의 길이입니다. 이보다 긴 입력은 잘리므로, 모델의 컨텍스트 윈도우 범위 안에서 가장 긴 예시까지 담을 수 있도록 설정하세요.
  • 워밍업 및 스케줄은 학습 과정에서 학습률이 어떻게 증가하고 변화하는지를 제어합니다. 일반적으로 짧은 워밍업과 코사인 감쇠를 기본값으로 사용합니다. 다만 Pareja 외 연구진의 소형 모델 연구에서는 워밍업을 생략해도 최종 점수가 떨어지지 않았습니다.

이 값들은 고정된 설정이 아니라 하이퍼파라미터 스윕의 출발점으로 활용하세요.

5단계: 학습 및 손실 모니터링

학습이 진행되는 동안 학습 손실 곡선과 검증 손실 곡선을 살펴보며 학습이 제대로 이루어지고 있는지 확인하세요.

손실은 모델의 출력이 예시와 얼마나 차이 나는지를 측정하는 값으로, 학습이 진행됨에 따라 완만하게 감소해야 합니다. 학습 손실은 모델이 학습하는 데이터를 기준으로 하고, 검증 손실은 따로 떼어 둔 예시를 기준으로 합니다.

학습 손실과 검증 손실이 함께 감소한다면 모델이 일반화를 학습하고 있다는 뜻입니다. 학습 손실은 계속 떨어지는데 검증 손실이 정체되거나 오히려 올라간다면, 모델이 패턴을 학습하는 대신 학습 데이터셋을 암기하고 있는 것입니다(과적합).

6단계: 평가 후 배포

학습 손실이 낮다고 해서 출력이 정확하다는 보장은 없으므로, 1단계에서 정한 기준에 따라 파인튜닝된 모델을 평가하세요.

평가를 통과하면 두 가지 방법으로 배포할 수 있습니다.

  • 베이스 모델 위에 어댑터를 얹어 서빙하고 런타임에 둘 다 로드합니다. 이렇게 하면 어댑터를 손쉽게 교체할 수 있습니다.
  • 어댑터를 베이스 가중치에 병합해 호스팅이 더 간편한 단일 독립형 모델을 만듭니다.

Perplexity를 활용해 LLM이 최신 정보에 접근하도록 하기

모델의 동작을 필요에 맞게 조정하고 싶을 때는 파인튜닝이 적합한 선택입니다.

모델에 최신 정보, 특히 빠르게 변하는 정보가 필요하다면 RAG나 신뢰할 수 있는 서드파티 검색 도구가 필요합니다.

사내 위키, 고객 지원 기록, 계약서, 제품 문서와 같은 자체 보유 데이터셋에는 맞춤형 검색 스택이 가장 효과적입니다.

활용하려는 지식이 공개된 정보라면 맞춤형 검색 레이어를 직접 구축할 필요가 없습니다. Perplexity는 실시간 웹 인덱스를 바탕으로 클릭 가능한 인라인 인용과 함께 응답을 제공하는 답변 엔진입니다. Perplexity의 Agent API는 이처럼 웹에 근거하고 인용이 포함된 답변을 단 한 번의 호출로 제공하므로, 앱에서 최신 출처를 활용할 수 있습니다.

LLM 파인튜닝에 관해 자주 묻는 질문

LLM을 무료로 파인튜닝할 수 있나요?

네, 소형 오픈 LLM은 무료로 파인튜닝할 수 있습니다. 예를 들어 Google Colab의 무료 등급은 3B~8B 모델에서 QLoRA를 실행하기에 충분한 GPU를 제공하며, 특정 작업에 집중하는 용도라면 이것으로 충분합니다. 무료 등급에서 감당할 수 있는 것보다 더 많은 메모리나 더 긴 학습 시간, 더 큰 베이스 모델이 필요해지면 그때부터 비용이 발생합니다.

GPU를 직접 보유해야 하나요, 아니면 클라우드에서 파인튜닝할 수 있나요?

LLM을 파인튜닝하기 위해 GPU를 직접 보유할 필요는 없습니다. 관리형 서비스와 GPU 클라우드 제공업체에서 하드웨어를 시간 단위로 대여할 수 있으므로, GPU 한 대만 빌려도 소형 모델의 QLoRA 학습을 충분히 진행할 수 있습니다. GPU 구매는 파인튜닝을 자주 하거나 모든 데이터를 자체 장비에 보관해야 하는 경우에만 투자할 가치가 있습니다.

LLM 파인튜닝에는 시간이 얼마나 걸리나요?

소형 LLM의 경우 데이터셋 크기와 하드웨어에 따라 몇 분에서 몇 시간 안에 학습이 끝날 수 있습니다. 예를 들어 Oumi는 자사 호스팅 플랫폼에서 0.8B 모델의 전체 파인튜닝을 1시간 남짓 만에 완료했습니다.

모델이 더 크거나 예시가 수만 개에 이르면 하루 이상 걸리기도 합니다. Emburse의 LoRA 학습에서는 40GB GPU 한 대로 7B 모델을 학습하는 데 예시 5,000개에 8시간, 50,000개에 약 30시간이 걸렸습니다.

데이터가 바뀔 때마다 파인튜닝된 모델을 계속 업데이트할 수 있나요?

새로운 데이터로 다시 파인튜닝할 수는 있지만, 매번 컴퓨팅 비용이 들고 파괴적 망각(catastrophic forgetting)이 발생할 위험이 있습니다. 자주 바뀌는 지식이라면 재학습 없이 원본 문서만 업데이트하면 되는 RAG가 대개 더 나은 해결책입니다.