한국어 · English
에이전트 스킬에서 LLM이 꼭 필요한 반복 워커 부분만 초소형 파인튜닝 모델로 증류해 온프레미스에서 돌리고, 큰 모델은 진짜 판단과 창작이 필요한 일에만 쓴다.
이 저장소는 하나의 운영 원칙을 재현 가능한 실험으로 증명한다.
스킬은 먼저 큰 모델로 만든다. 포맷·라우팅·집계 같은 결정론적인 부분은 코드로 프로그램화한다. 그중 언어모델이 실제로 필요한 좁은 분류·태깅·매칭 워커만 작은 모델(≤1B, 4비트)로 파인튜닝해 배선한다. 그러면 비용을 아끼고 전부 온프레미스/온디바이스로 돌릴 수 있으며, 큰 모델은 고부가 작업에만 투입된다.
모든 수치는 예측이 아니라 실측 before/after다.
각 결과는 저장소 루트의 스크립트가 만들어 results/에 JSON으로 저장한다. 전체 표는 RESULTS.md 참고.
- 스킬별 증류 (
run_matrix.py) — 베이스라인(few-shot) vs QLoRA 파인튜닝, held-out 정확도, 모델×태스크별. - Teacher-label 일치도 (
teacher_eval.py) — 신뢰도 지표. 초소형 모델이 자연스러운(템플릿이 아닌) 실입력에서 실제 스킬의 판단을 복제하는가? gold는 큰 모델이 실제 스킬 루브릭을 적용해 2표 합의로 라벨링. 정확도 + Cohen's κ 보고. - 조인트 멀티태스크 (
run_joint.py) — 전 스킬 데이터를 합쳐 어댑터 하나로 학습 후 스킬별 평가. 하나의 제너럴리스트 초소형 모델이 스킬별 정확도를 유지하는가, 아니면 간섭이 생기는가? (LoRA는 스페셜리스트 N개를 핫스왑하거나 하나로 합칠 수 있지만, 풀 파인튜닝은 제너럴리스트를 강제한다. 그래서 이 실험이 결정적이다.) - 양자화 열화 (
quant_sweep.py) — 같은 파인튜닝 모델을 fp16 / int8 / int4(nf4)로, 정확도 + 최대 GPU 메모리. 온디바이스 배포용 정직한 INT4 열화. - 풀 파인튜닝 vs LoRA (
full_ft.py) — 전체 파라미터 학습 vs 0.14% LoRA 어댑터. 정확도·아티팩트 크기·학습 시간. - 처리량 + 비용 (
throughput.py) — 온프레미스 4비트 모델의 워커 호출/초, 생성 tok/s, 온프레미스 $/1k호출 vs 프론티어 API 비용 추정(가정 명시).
분류형 예시 스킬 워커 4종 + 외적 타당성을 위한 한국어 공개 벤치 2종:
| 태스크 | 유형 | 클래스 | 라벨 출처 |
|---|---|---|---|
korean_tone |
한국어 말투(격식) 분류기 | 5 | 규칙기반(문법) + teacher 합의 held-out |
semantic_guard |
콘텐츠 안전 게이트 | 3 (SAFE / WARNING / BLOCKED) | 템플릿 + teacher 합의 held-out |
news_cat |
IT/클라우드 뉴스 분류기 | 6 | 템플릿 + teacher 합의 held-out |
paper_rel |
논문 관련성 필터 | 2 | 템플릿 + teacher 합의 held-out |
nsmc |
한국어 영화평 감성 (공개 벤치) | 2 | 사람 라벨링 (NSMC) |
klue_ynat |
한국어 뉴스 토픽 (공개 벤치) | 7 | 사람 라벨링 (KLUE-YNAT) |
정직성 노트. 스킬 워커 4종은 재현 가능한 생성기(run_matrix.py)의 합성 학습 데이터를 쓴다. gold 테스트 라벨은 held-out이며, teacher 평가에서는 큰 모델이 실제 스킬 루브릭을 적용해 2표 합의로 라벨링한다. nsmc/klue_ynat는 사람이 라벨링한 공개 벤치다. 파인튜닝이 도움이 안 되는 경우까지 before/after를 그대로 보고한다.
Qwen/Qwen3.5-0.8B-Base(~753M 파라미터)google/gemma-3-270mgoogle/gemma-3-1b-pt
전부 QLoRA로 파인튜닝(LoRA r=16, q/k/v/o 프로젝션, 4비트 nf4 베이스, double-quant, bf16 연산).
- NVIDIA A40 (48GB) 1장, CUDA 12.4
- PyTorch 2.6.0, Transformers, PEFT, bitsandbytes, datasets
- 학습·추론 어느 단계에서도 프론티어 API를 호출하지 않는다. 전부 단일 GPU에서 돈다. 이게 핵심이다. 워커는 자기 하드웨어, 온프레미스에서 동작한다.
학습 시간(A40 1장, 1 epoch): 스킬별 LoRA 어댑터는 모델·태스크에 따라 대략 10~40분에 학습된다(각 실행 wall_sec은 results/ 참고). LoRA가 파라미터의 ~0.14%만 건드리므로 각 스페셜리스트는 공유 베이스에 핫스왑되는 ~5MB 어댑터다.
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
# 스킬 하나, 모델 하나: 베이스라인 vs QLoRA
MODEL=Qwen/Qwen3.5-0.8B-Base TASK=korean_tone N_TRAIN=1800 N_TEST=800 EPOCHS=1 python run_matrix.py
# teacher-label 일치도 (어댑터가 만들어진 뒤)
MODEL=Qwen/Qwen3.5-0.8B-Base TASK=korean_tone python teacher_eval.py
# 전체 실행
bash run_all.sh어댑터와 결과는 runs/에, teacher gold 세트는 teacher/에 있다.
증류된 워커는 작은 베이스 위의 몇 MB 어댑터로, 흔한 온프레미스 GPU에서 서빙된다. 큰 모델은 0.3~1B 모델이 못 하는 판단·창작에만 남긴다. throughput.py가 온프레미스 1k호출당 비용을 프론티어 API 추정치와 나란히 실측한다. RESULTS.md 참고.
Apache-2.0. 이 저장소는 LLM 워커 서브태스크를 작은 온프레미스 모델로 옮기는 스킬 증류 패턴을 문서화한다. 베이스 모델은 각자의 라이선스(Qwen, Gemma)를 따른다.