Skip to content

한국어 · English

tiny-skill-distill

에이전트 스킬에서 LLM이 꼭 필요한 반복 워커 부분만 초소형 파인튜닝 모델로 증류해 온프레미스에서 돌리고, 큰 모델은 진짜 판단과 창작이 필요한 일에만 쓴다.

이 저장소는 하나의 운영 원칙을 재현 가능한 실험으로 증명한다.

스킬은 먼저 큰 모델로 만든다. 포맷·라우팅·집계 같은 결정론적인 부분은 코드로 프로그램화한다. 그중 언어모델이 실제로 필요한 좁은 분류·태깅·매칭 워커만 작은 모델(≤1B, 4비트)로 파인튜닝해 배선한다. 그러면 비용을 아끼고 전부 온프레미스/온디바이스로 돌릴 수 있으며, 큰 모델은 고부가 작업에만 투입된다.

모든 수치는 예측이 아니라 실측 before/after다.

무엇을 측정했나

각 결과는 저장소 루트의 스크립트가 만들어 results/에 JSON으로 저장한다. 전체 표는 RESULTS.md 참고.

  1. 스킬별 증류 (run_matrix.py) — 베이스라인(few-shot) vs QLoRA 파인튜닝, held-out 정확도, 모델×태스크별.
  2. Teacher-label 일치도 (teacher_eval.py) — 신뢰도 지표. 초소형 모델이 자연스러운(템플릿이 아닌) 실입력에서 실제 스킬의 판단을 복제하는가? gold는 큰 모델이 실제 스킬 루브릭을 적용해 2표 합의로 라벨링. 정확도 + Cohen's κ 보고.
  3. 조인트 멀티태스크 (run_joint.py) — 전 스킬 데이터를 합쳐 어댑터 하나로 학습 후 스킬별 평가. 하나의 제너럴리스트 초소형 모델이 스킬별 정확도를 유지하는가, 아니면 간섭이 생기는가? (LoRA는 스페셜리스트 N개를 핫스왑하거나 하나로 합칠 수 있지만, 풀 파인튜닝은 제너럴리스트를 강제한다. 그래서 이 실험이 결정적이다.)
  4. 양자화 열화 (quant_sweep.py) — 같은 파인튜닝 모델을 fp16 / int8 / int4(nf4)로, 정확도 + 최대 GPU 메모리. 온디바이스 배포용 정직한 INT4 열화.
  5. 풀 파인튜닝 vs LoRA (full_ft.py) — 전체 파라미터 학습 vs 0.14% LoRA 어댑터. 정확도·아티팩트 크기·학습 시간.
  6. 처리량 + 비용 (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-270m
  • google/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_secresults/ 참고). 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)를 따른다.

About

Distill the LLM-bound worker sub-tasks of an agent skill into tiny (≤1B, 4-bit) fine-tuned models — run them on-prem, keep the frontier model for real judgment. Reproducible before/after benchmarks.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages