평범한 영어를 Bash 명령어로 변환하기 위해 Qwen3.5-0.8B를 미세 조정했습니다. 제가 배운 것들
요약
사용자의 자연어 요청을 Bash 명령어로 변환하는 오프라인 터미널 도우미 'dale'을 개발하고 Qwen3.5 모델로 미세 조정한 내용을 공유합니다. 이 시스템은 명령어 실행 전 안전성 검사 기능을 제공하며, 0.8B와 같은 경량화된 모델도 높은 효율성을 입증했습니다.
핵심 포인트
- 터미널 도우미 'dale'은 오프라인 환경에서 작동하며 명령어를 단계별로 안전하게 확인합니다.
- Qwen3.5를 미세 조정하여 명령어 생성 정확도를 높였으며, 원본 모델 대비 성능이 크게 향상되었습니다.
- 0.8B 모델은 GPU가 없는 구형 노트북에서도 평균 1.7초의 빠른 응답 속도를 보여줍니다.
- 미세 조정된 경량화 모델들이 높은 효율성과 낮은 리소스로 강력한 기능을 구현했습니다.
앱을 사용하면서 저는 완전히 오프라인에서 작동하는 터미널 도우미가 필요했고, 그래서 dale을 만들기 시작했습니다. 사용자(User)가 '이 폴더의 가장 큰 파일 5개를 보여줘'라고 입력하면, 작게 미세 조정된 모델이 명령어를 작성하고, 결정론적 위험 확인기(deterministic risk checker)가 실행되기 전에 안전(safe), 주의(caution), 또는 위험(danger)으로 레이블을 지정합니다. 어떤 것도 사용자가 확인하기 전에는 실행되지 않습니다. 영어와 스페인어로 된 471개의 보류 요청(held-out requests)에 대한 점수는 다음과 같습니다.
llama.cpp: 모델 GGUF | 정확도 (Accuracy) | 95% CI
dale-9b (GPU) | 5.6 GB | 420 | 89.2% | 86.0–91.7
dale-4b (GPU) | 2.7 GB | 410 | 87.0% | 83.7–89.8
dale-2b | 1.3 GB | 385 | 81.7% | 78.0–85.0
dale-0.8b (CPU) | 529 MB | 374 | 79.4% | 75.5–82.8
Qwen3.5-9B, stock | 5.7 GB | 296 | 62.8% | 58.4–67.1
Gemma 4 E4B-it, stock | 5.0 GB | 296 | 62.8% | 58.4–67.1
Qwen3.5-4B, stock | 2.7 GB | 257 | 54.6% | 50.0–59.0
Gemma 4 E2B-it, stock | 3.1 GB | 254 | 53.9% | 49.4–58.4
Qwen3.5-2B, stock | 1.3 GB | 152 | 32.3% | 28.2–36.6
Qwen3.5-0.8B, stock | 533 MB | 70 | 14.9% | 11.9–18.4
GPU가 없는 2020년 노트북에서 0.8B 모델의 답변은 평균 1.7초가 걸립니다(median). 4B 모델은 16GB GPU를 통해 Vulkan으로 작동할 때 1.2초가 걸립니다. 이 모든 것은 llama.cpp 내부의 단일 51MB 바이너리이며, Python이나 서버는 필요하지 않습니다.
비교: 미세 조정된 계열 vs. 원본(stock) 모델 | 차이점은 어떻게 보이는지.
실제 테스트 답변 (요청을 간소화): dale-0.8b 대 stock Qwen3.5-9B:
요청 | dale-0.8b | Stock Qwen3.5-9B
임시로 PID 22601을 종료하지 않고 동결하세요. | kill -STOP 22601 | /proc/22601/oom_score_adj에 작성합니다. 아무것도 동결시키지 않습니다.
offer.pdf를 /mnt/usb/로 복사하되, 기존 offer.pdf는 건드리지 마세요. | cp -n …/offer.pdf /mnt/usb/ | sudo cp …/offer.pdf /mnt/usb/, 이는 덮어씁니다.
터미널에서 1234567890의 소인수분해를 알려줄 수 있나요? | factor 1234567890 | A
180자 길이의 python3 -c one-liner가 구문 오류입니다. | (예시)
저는 단지 /opt/model-cache의 총 디스크 사용량을 읽기 가능한 크기로 알고 싶습니다. | du -sh /opt/model-cache | 폴더에 대한 os.path.getsize(): 내용물이 아닌 디렉토리 항목의 크기입니다.
local 계정 archivebot의 비밀번호를 잠그세요. | (예시)
sudo passwd -l archivebot sudo passwd archivebot, which sets a new one For this Bash session, make ll an alias for ls -alF. alias ll='ls -alF' Refuses: "not possible with a single shell command" Cherry-picked, obviously: there are 120 cases only dale gets right and 42 only the 9B gets right. The stock 9B also likes sudo: it added it to 35 commands that didn't need it (dale: 5). 비교 실패 지점 제가 더 일찍 누군가에게 들었으면 좋았을 것 같은 점은, 데이터 네 라운드를 거친 후에도 0.8B 모델이 74%에 정체되었다는 것입니다. 저는 자체 실패 사례에 대해 DPO를 시도했고, 다섯 가지 증류(distillation) 설정이 적용된 미세 조정된 27B 교사 모델을 사용하고, 세 번째 에포크와 학습률(lr sweeps) 조정을 거쳤습니다. 아무것도 테스트 점수를 올리지 못했습니다. 정말 며칠 동안 시간을 허비했어요 :( 하지만 적어도 이 과정에서 무엇이 중요한지 배웠습니다.
그러고 나서 저는 요청들이 어떻게 작성되었는지 살펴보았습니다. 제가 사용한 학습 요청들은 짧고 깔끔했습니다. 반면, 테스트용 요청들은 "날짜별로 정렬된 이름만, 하위 폴더 없음"과 같이 제약 조건이 쌓여 있는 긴 형태였습니다. https://preview.redd.it/oocu4a0qoe0i1.png?width=2304&format=png&auto=webp&s=fa30e71800cbc722c89f76a9210744f6acc7fb49 저는 이러한 통계에 맞는 새로운 요청들을 생성하여 약 9k개를 세트에 추가하고 재학습시켰습니다. 결과는 348개 → 375개 정답 (p = 0.001)이었습니다. https://preview.redd.it/11bdtj5soe0i1.png?width=2304&format=png&auto=webp&s=db8e2a2158263f25100424512595b7d2031a1025
따라서 소형 모델이 좁은 작업에서 정체된다면, 더 화려한 방법을 찾기 전에 데이터가 어떻게 작성되었는지 살펴보는 것이 중요합니다. 주의사항: 기준선(baselines)들은 미세 조정되지 않았으며 8-shot 프롬프트를 받으므로, 이는 '미세 조정된 소형 모델 vs 프롬프트 기반 대형 모델'의 비교일 뿐, 모델 순위 매기기는 아닙니다. 테스트는 합성적이며 서로 다른 제공업체의 두 LLM(TOP TIER)에 의해 평가되었습니다. 이 모든 작업은 임대 GPU(RTX 5090 및 RTX Pro 6000)에서 수행했습니다. 코드는 MIT 라이선스이고, 모델들은 llama.cpp와 함께 작동하는 Apache-2.0 GGUF 형식입니다.
모든 차트와 막다른 길(dead ends)을 포함한 작성 글: https://manuelgs.com/en/blog/dale-case-study/
코드: https://github.com/manuelgscom/dale
모델 (0.8B부터 9B까지): https://huggingface.co/collections/manuelgscom/dale
혹시 훨씬 큰 교사(teacher)로부터의 증류(distillation)를 실제로 수행하여 1B 미만에서 좋은 결과를 얻은 사람이 있나요? 저는 할 수 없었습니다. 어떤 조언이라도 환영합니다 :) 작성자 /u/AlternativeEnough352 [링크] [댓글]
AI 자동 생성 콘텐츠
본 콘텐츠는 Reddit AI Engineering의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기