Downloads · 30 days
4
4% of all-time downloads
wooyeolj/gemma-3-4b-airecommender
gemma-3-4b-airecommender is a text generation model from wooyeolj. Use it when you need the model to write or continue text. It is set up for peft. The card lists the license as apache-2.0.
AI 도구 추천 도메인 최적화를 위한 Gemma-3-4b-it QLoRA 파인튜닝 기록
Downloads · 30 days
4
4% of all-time downloads
All-time downloads
93
Public
Repo size
165 MB
Likes
0
Public
Click a slice to open those files.
.safetensors65.7 MB · 66%
From the Hugging Face model README
AI 도구 추천 도메인 최적화를 위한 Gemma-3-4b-it QLoRA 파인튜닝 기록
LLM & AI Agent 추천 시스템 프로젝트에서 도메인 특화 응답 품질을 개선하기 위해 Google Colab 무료 환경(T4 GPU)에서 QLoRA 파인튜닝을 직접 진행
기존 프로젝트는 사용자 질문 → 분류 → ChromaDB 검색 → LLM 답변 생성 순서로 동작 LLM의 도메인 특화 어휘 학습 및 모델명과 추천이유로 이루어진 구조화된 답변 생성 품질 향상을 위한 파인튜닝 진행
파인튜닝 목적
| 항목 | 내용 |
|---|---|
| 베이스 모델 | google/gemma-3-4b-it |
| 학습 방식 | QLoRA (4-bit NF4 양자화 + LoRA rank=16) |
| 학습 환경 | Google Colab T4 GPU (15GB VRAM) |
| PEFT | 0.19.1 |
| TRL | 1.7.0 |
| Transformers | 5.12.1 |
| PyTorch | 2.11.0+cu128 |
AI 도구 추천 Q&A 60개로 구성
| 카테고리 | 개수 | 설명 |
|---|---|---|
| MODEL | 25개 | LLM/AI 모델 추천 요청 질문 |
| AGENT | 25개 | 에이전트 프레임워크 추천 요청 질문 |
| GENERAL | 10개 | AI 도구와 무관한 일상 질문 |
MODEL과 AGENT는 "구체적인 도구명 + 선택 근거 + 상황별 조건"을 함께 제시하는 일관된 답변 스타일로 작성
⚠️ 데이터셋 규모 한계 학습 데이터가 60개(학습 48 / 검증 12)로 적어, 파인튜닝 전후 변화 추이 확인용으로 활용하는 것을 권장
베이스 모델 (4-bit NF4 양자화)
↓
LoRA 어댑터 부착 (rank=16, Attention + FFN 전체)
↓
학습 가능 파라미터: 전체의 약 1%
↓
SFTTrainer 학습 (3 에포크)
↓
어댑터만 저장 (~수십 MB)
| 설정 | 값 | 설명 |
|---|---|---|
r | 16 | LoRA 행렬 rank |
lora_alpha | 32 | 스케일 팩터 (alpha/r = 2) |
target_modules | q, k, v, o, gate, up, down | Attention + FFN 전체 |
lora_dropout | 0.05 | 과적합 방지 |
learning_rate | 2e-4 | LoRA 권장 학습률 |
batch_size | 1 × accumulation 8 | 실질 배치 크기 8 |
optimizer | paged_adamw_8bit | 메모리 효율적 AdamW |
| 항목 | 파인튜닝 전 | 파인튜닝 후 | 변화 |
|---|---|---|---|
| Eval Loss | 4.99 | 1.27 | 약 75% 감소 |
| Perplexity | 148.04 | 3.57 | 약 98% 감소 |
| ROUGE-1 | 0.22 | 0.20 | 소폭 하락 |
| ROUGE-L | 0.18 | 0.17 | 소폭 하락 |
Train Loss는 5.08 → 1.22로 꾸준히 감소 (감소율 76%). Eval Loss와 비슷한 추세로, 과적합 징후 없이 학습되었음을 확인.

왼쪽: Train Loss(파란선)와 Eval Loss(빨간 점선)가 함께 우하향하며 수렴 오른쪽: Smoothed Loss로 전반적인 학습 추세 확인

파인튜닝 전은 장황하게 답변하는 반면, 파인튜닝 후는 핵심 도구명과 선택 근거만 간결하게 제시한다. 답변 포맷이 최적화되고, 필요한 토큰 수도 크게 줄었다.
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel
import torch
MODEL_ID = "google/gemma-3-4b-it"
ADAPTER_ID = "wooyeolj/gemma-3-4b-airecommender"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
# 1. 베이스 모델 로드
base_model = AutoModelForCausalLM.from_pretrained(
MODEL_ID,
quantization_config=bnb_config,
device_map="auto",
torch_dtype=torch.bfloat16,
)
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
# 2. HuggingFace Hub에서 어댑터 로드
model = PeftModel.from_pretrained(base_model, ADAPTER_ID)
# 3. 추론
SYSTEM_PROMPT = (
"당신은 AI 도구 전문 추천 어시스턴트입니다.\n"
"사용자의 질문의 목적을 LLM 모델 추천, AI 에이전트 프레임워크 추천, AI 도구 선택과 무관한 일반적인 질문으로 구분하고,\n"
"질문의 목적에 맞게 명확하게 답변합니다."
)
def generate_response(question, max_new_tokens=250):
prompt = (
f"<start_of_turn>user\n"
f"{SYSTEM_PROMPT}\n\n{question}"
f"<end_of_turn>\n"
f"<start_of_turn>model\n"
)
inputs = tokenizer(prompt, return_tensors="pt",
truncation=True, max_length=512).to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=False,
repetition_penalty=1.2,
pad_token_id=tokenizer.eos_token_id,
eos_token_id=tokenizer.eos_token_id,
)
generated = outputs[0][inputs["input_ids"].shape[-1]:]
return tokenizer.decode(generated, skip_special_tokens=True).strip()
print(generate_response("그림 잘 그리는 무료 AI 모델 추천해줘"))