Developer's Development
3.3.16 [LLM] 파인튜닝 본문
파인튜닝 개요
파인 튜닝(Fine-tuning)은 이미 학습된 대규모 언어 모델(LLM)을 특정 작업이나 데이터셋에 맞춰 재학습시키는 과정이다. 이는 모델이 특정 도메인 또는 작업에서 최적의 성능을 발휘하도록 조정하는 기술이다.
👉🏻 파인튜닝의 필요성
일반적인 LLM은 특정 도메인에서 최적의 성능을 내지 못한다. (ex) 법률 문서 요약, 의료 진단 등)
프롬프트 엔지니어링만으로 해결하기 어려운 문제가 존재한다. (ex) 특정 용어 학습, 도메인별 맥락 이해 등)
→ 파인튜닝을 통해 작업별 특화 모델을 구축하여 효율성과 정확도를 향상할 수 있다.
ex)
기본 LLM: "의료기기의 승인 절차를 알려줘." → 일반적인 설명
파인튜닝된 LLM: "의료기기 2등급의 국내 식약처 허가 절차를 단계로 정리해줘." → 상세한 절차와 지역 정보까지 제공 가능
- 프롬프트 엔지니어링 vs 파인튜닝
👉🏻 프롬프트 엔지니어링 (Zero-shot / Few-shot Learning)
- 모델을 추가로 학습시키지 않고, 압력을 조정하여 원하는 결과를 얻는 방법이다.
- 비용이 적게 들고 빠르게 실행 가능하나, 복잡한 작업에서는 한계가 있다.
👉🏻 파인튜닝
- 모델을 재학습하여 특정 작업이나 도메인에 최적화하는 방법이다.
- 특정 데이터에서 더 높은 정확도와 일관성을 제공할 수 있지만, 데이터 준비와 학습 비용이 많이 든다.
| 구분 | 프롬프트 엔지니어링 | 파인튜닝 |
| 데이터 필요 여부 | 필요 없음 | 특정 데이터 필요 |
| 비용 | 낮음 | 높음 |
| 응용 분야 | 일반 작업 | 특정 도메인/작업 |
| 수정 방식 | 입력 조정 | 모델 파라미터 재학습 |
- 파인튜닝의 주요 기법
👉🏻 PERT(Parameter-Efficient Fine-Tuning)
- 거대한 모델 전체를 재학습하지 않고, 일부 파라미터만 조정하여 효율적으로 성능을 개선하는 기법
- 대표적 기법: LoRA (Low-Rank Adaption)
- 특징
- 전체 LLM을 학습하는 Full Fine-tuning 대비 계산량과 메모리 요구량이 현저히 낮음
- 소량 데이터로도 특정 태스크에 맞는 모델 성능 확보 가능
- 일반 사용자의 GPU 환경에서도 학습 가능
👉🏻 RLHF (Reinforcement Learning with Human Feedback)
- 사람이 선호하는 응답을 기반으로 보상 신호를 학습에 반영하는 강화학습 기반 파인튜닝 기법
- 주요 원리
1. 모델이 다양한 답변을 생성
2. 사람이 가장 적절한 답변을 선택
3. 보상 신호를 이용해 모델을 최적화
- 활용 분야
- 대화형 AI (ChatGPT, Claude 등)
- 윤리적 AI 모델 개발
- 사용자 맞춤형 추천 시스템
소규모 언어모델 (sLLM) 파인튜닝
- sLLM 개요
LLM의 축소판으로, 학습과 배포 비용을 줄이기 위해 설계되었다. sLLM은 파인튜닝이 비교적 간단하고 리소스가 적게 든다.
소규모 언어모델(sLLM)은 주로 제한된 연산 리소스를 가진 환경에서 활용된다.
👉🏻 장점
- 학습 및 배포 비용을 절감할 수 있다.
- 특정 도메인에 맞춰 빠르게 파인튜닝이 가능하다.
👉🏻 적절한 사용 사례
- 모바일 및 엣지 디바이스 (AI 비서, 음성 인식)
- 클라우드 비용 절감을 위한 경량 모델 사용
- 데이터 프라이버스 보호를 위한 로컬 환경 AI
- 주요 sLLM
👉🏻 Llama 1 & Llama 2
- 메타(Meta)에서 개발한 소규모 언어모델로 고성능과 효율성을 자랑한다.
- Llama 2는 Llama 1에 비해 더 많은 파라미터와 높은 정확도를 제공한다.
👉🏻 Alpaca
- Llama 모델을 기반으로 스탠포드 대학에서 파인튜닝한 모델이다.
- 주로 대화형 작업에 최적화되어 있다.
| 모델명 | 특징 | 사용 사례 |
| Llama 1 | 기본 LLM, 소규모로 최적화 | 일반 NLP 작업 |
| Llama 2 | 더 많은 데이터와 파라미터로 성능 개선 | 복잡한 대화형 작업 |
| Alpaca | Llama 기반, 대화형 작업에 최적화 | 고객 지원, 챗봇 개발 |
파인튜닝 모델 평가
- 평가 기준
| 지표 | 설명 |
| 정확도 (Accuracy) | 올바르게 예측한 비율 |
| 정밀도 (Precision) | 모델이 예측한 값 중 실제로 올바른 비율 |
| 재현율 (Recall) | 실제 정답을 모델이 얼마나 잘 찾아냈는지 |
| F1 스코어 | 정밀도와 재현율의 균형을 평가하는 지표 |
| BLEU, ROUGE | 텍스트 생성 모델 평가 지표 (자연어 처리 모델에 활용) |
- 평가 프로세스
1. 테스트 데이터를 준비한다.
2. 모델의 응답 또는 결과와 실제 데이터를 비교한다.
3. 지표를 계산하여 성능을 평가한다.
파인튜닝의 활용 사례
- 주요 적용 분야
| 분야 | 활용 사례 |
| 의료 | 의료 기록 분석, 환자 상담 챗봇 |
| 법률 | 법률 문서 분석, 계약서 요약 |
| 고객 지원 | 고객 문의 응답 자동화 |
| 금융 | 시장 분석, 자동 보고서 생성 |
| 교육 | 맞춤형 학습 AI, 자동 채점 시스템 |
- 실제 적용 사례 추가
| 분야 | 실제 적용 사례 |
| 의료 | Google Med-PaLM: 의료 문서 분석 및 진단 지원 |
| 법률 | Casetext의 AI 모델: 법률 판례 요약 및 법률 상담 |
| 고객 지원 | Zendesk AI 챗봇: 고객 지원 자동화 |
| 금융 | JP Morgan의 AI 모델: 시장 분석 및 리스크 평가 |
| 교육 | Duolingo AI: 맞춤형 언어 학습 보조 |
실습 (GPT Fine-tuning (by OpenAI platform))
- 데이터 준비
jsonl 형식
messages 배열 기준으로 작성
- system, user, assistant
- Fine-tuning 학습
👉🏻 Optimize > Fine-tuning | 학습 job 생성
로그인 > 상단 Dashboard > 왼쪽 사이드바 맨 아래 Optimize - Fine-tuning > Create
- Base Model: gpt-3.5-turbo-0125, Suffix: sarcastic, Seed: 0, Training data: jsonl file upload, 나머지 default
- Fine-tuned 모델 추론
from dotenv import load_dotenv
load_dotenv()
system_pronpt = "너는 사실을 말하는 챗봇이지만, 빈정대거나 비꼬는 말투로 응답하는 고장난 챗봇이다."
# prompt = "아이폰은 어느 회사 거야?"
prompt = "아이폰이랑 갤럭시 중에 뭐가 더 좋아?"
from openai import OpenAI
base_model = 'gpt-3.5-turbo-0125'
client = OpenAI()
response = client.chat.completions.create(
model=base_model,
messages=[
{"role":"system", "content":system_pronpt},
{"role":"user", "content":prompt}
]
)
print(response.choices[0].message.content)
# 아이폰이랑 갤럭시는 각각의 장단점이 있는데, 어느 것이 더 좋냐고 물어보면 뭐가 먼지 모르는 사람이나 책임질 수 없는 사람이 답하는 질문이네. 사용자가 원하는 기능과 선호하는 디자인에 따라 선택하면 될 거야.
# 학습 완료된 모델
from openai import OpenAI
ft_model = '모델명'
client = OpenAI()
ft_response = client.chat.completions.create(
model=ft_model,
messages=[
{"role":"system", "content":system_pronpt},
{"role":"user", "content":prompt}
]
)
print(ft_response.choices[0].message.content)
# 뭐든 각자 장단점이 있지. 맘대로 골라, 어차피 내가 할말은 마찬가지일테니.
실습 (GPT Fine-tuning by KorQUAD)
- 데이터셋 준비
!pip install gdown
!gdown https://raw.githubusercontent.com/korquad/korquad.github.io/refs/heads/master/dataset/KorQuAD_v1.0_dev.json
- 데이터 준비
import json
with open('KorQuAD_v1.0_dev.json', 'r', encoding='utf-8') as f:
dev_data = json.load(f)
# dev_data['data'][0]
items = [item for topic in dev_data['data'] for item in topic['paragraphs']]
# items[0] # 배열에 딕셔너리 형태가 쌓인 형태
# 데이터 정제
qa_dict = {}
for item in items:
for entry in item['qas']:
question = entry['question']
answer = [ans['text'] for ans in entry['answers']][0]
qa_dict[question] = answer
# qa_dict
len(qa_dict) # 5764
# 20건만 활용
qa_dict = dict(list(qa_dict.items())[:20])
qa_dict
# jsonl 형태로 변환하기 위한 list 생성
results = []
for q, a in qa_dict.items():
qa = {
"messages": [
{"role": "system", "content": ""},
{"role": "user", "content": q},
{"role": "assistant", "content": a}
]
}
results.append(qa)
results
# jsonl 형태로 저장
with open('korquad_data.jsonl', 'w', encoding='utf-8') as f:
for qa in results:
json_str = json.dumps(qa, ensure_ascii=False)
f.write(json_str + '\n')
- Fine-tuning 학습
👉🏻 Optimize > Fine-tuning 학습 job 생성
- Base Model: gpt-3.5-turbo-0125, Suffix: sarcastic, Seed: 0, Training data: 방금 생성한 jsonl file upload, 나머지 default
- Fine-tuned 모델 추론
from dotenv import load_dotenv
load_dotenv()
prompt = '법무부 장관을 제쳐놓고 민정수석이 개정안을 설명하는 게 이해가 안 된다고 지적한 경희대 석좌교수 이름은?'
# 기존 모델
base_model = 'gpt-3.5-turbo-0125'
client = OpenAI()
response = client.chat.completions.create(
model=base_model,
messages=[
{"role":"system", "content":""},
{"role":"user", "content":prompt}
]
)
# 파인튜닝 모델
ft_model = 'ft:gpt-3.5-turbo-0125:skn17:korquad:CDhwTnlD'
client = OpenAI()
ft_response = client.chat.completions.create(
model=ft_model,
messages=[
{"role":"system", "content":""},
{"role":"user", "content":prompt}
]
)
print("기본 모델:")
print(response.choices[0].message.content)
print()
print("파인튜닝 모델:")
print(ft_response.choices[0].message.content) # 특정 내용에 대해서 잘 응답하도록 만들어줌
"""
기본 모델:
경희대 석좌교수인 안종석 교수입니다.
파인튜닝 모델:
허영
"""
'LLM' 카테고리의 다른 글
| 3.3.18 [LLM] 파인튜닝 기법: RLHF (0) | 2025.09.14 |
|---|---|
| 3.3.17 [LLM] 파인튜닝 기법: PEFT (0) | 2025.09.14 |
| 3.3.15 [LLM] 프롬프트 엔지니어링 응용: CoT (0) | 2025.09.14 |
| 3.3.14 [LLM] 프롬프트 엔지니어링 응용: RAG (1) | 2025.09.13 |
| 3.3.13 [LLM] 프롬프트 엔지니어링 응용: LangChain (2) | 2025.09.13 |