맞춤형 경험을 위한 로컬 AI 모델 튜닝 방법 (API 키 불필요)
요약
개인정보 보호와 비용 절감을 위해 API 대신 로컬 AI 모델을 튜닝하는 네 가지 계층적 방법을 소개합니다. 양자화, Ollama 설정, QLoRA 미세 조정, abliteration 기술을 통해 스마트폰에서도 맞춤형 모델을 구축할 수 있습니다.
핵심 포인트
- 양자화(Quantization)를 통해 모델 크기를 줄여 온디바이스 실행 가능
- Ollama의 Modelfile을 활용한 프롬프트 및 파라미터 제어
- QLoRA를 이용한 개인 지식 기반의 효율적인 미세 조정
- Abliteration 기술을 통한 모델의 거부 메커니즘 수정
빠른 답변: 로컬 AI 모델은 네 가지 계층에서 튜닝합니다 — (1) 적절한 베이스 모델과 양자화(quantization) 선택 (4-bit에서도 품질을 유지하기 위해 importance-matrix / imatrix 양자화 사용), (2) Ollama의 Modelfile SYSTEM 프롬프트와 PARAMETER 노브(knobs)를 통한 동작 제어, (3) 개인적인 지식이 필요한 경우 QLoRA를 사용하여 작은 LoRA 어댑터 미세 조정(fine-tune), (4) 선택적으로 검열되지 않은 빌드를 위해 abliteration을 통해 거부(refusal) 방향성 제거. 이 모든 과정은 노트북이나 심지어 Termux를 통한 Android 스마트폰에서도 오프라인으로 실행 가능합니다.
대부분의 사람들은 "AI 모델을 튜닝한다"는 것이 GPU 클러스터와 연구 팀을 보유하는 것을 의미한다고 생각합니다. 그렇지 않습니다. 2026년에는 40억 파라미터(4-billion-parameter) 규모의 오픈 웨이트(open-weight) 모델을 가져와 스마트폰에서 실행하고, OpenAI나 Google에 단 하나의 토큰도 보내지 않고 모델이 말하는 방식, 거부하는 내용, 기억하는 내용을 재구성할 수 있습니다.
이 가이드는 다음과 같은 1차 자료를 바탕으로 작성되었습니다: llama.cpp quantize README, Ollama Modelfile reference, NousResearch llm-abliteration 저장소, 그리고 원본 QLoRA 논문 (Dettmers et al., 2023, arXiv:2305.14314). 저는 정확한 명령어, 솔직한 트레이드오프(trade-offs), 그리고 각 기술이 한계에 부딪히는 지점을 보여드릴 것입니다.
교육적 면책 조항: 이 기사는 개발자를 위한 모델 커스터마이징을 다룹니다. 이는 금융, 법률 또는 안전에 관한 조언이 아닙니다. abliteration과 같은 기술은 안전 거부(safety refusals)를 제거합니다 — 수정할 라이선스가 있는 모델에 대해서만 사용하고, 배포하는 모든 것에 대해 책임 있는 사용 정책을 유지하십시오.
API를 사용하는 대신 로컬 모델을 튜닝해야 하는 이유
세 가지 이유가 사람들을 온디바이스(on-device) LLM으로 이끕니다:
- 개인정보 보호(Privacy). 사용자의 프롬프트가 기기를 벗어나지 않습니다. 트레이딩 메모, 의료 초안 또는 고객 데이터의 경우, 이는 매우 중요한 문제입니다.
- 비용(Cost). 토큰당 과금이 없습니다. 4B 모델을 Q4_K_M으로 양자화할 경우 약 2.7 GB의 RAM이 필요하며 중급형 휴대폰에서도 실행 가능합니다.
- 제어(Control). 페르소나, 정지 단어(stop words), 컨텍스트 창, 그리고 요청 거부 여부를 사용자가 결정합니다.
문제는 4B 모델이 GPT 급은 아니라는 것입니다. 따라서 호스팅된 모델에게 다르게 행동해달라고 애원하는 대신, _사용자_의 특정 사용 사례에 맞춰 격차를 줄이는 것이 바로 '튜닝'입니다.
레이어 1 — 양자화(Quantization): 두뇌를 녹이지 않고 크기 줄이기
모델은 가중치(weights) 형태로 배포됩니다. 전체 정밀도(F16)의 Qwen3.5-4B는 약 8 GB에 달합니다. 하지만 이 정도 용량은 거의 필요하지 않습니다. **양자화(Quantization)**는 가중치를 4비트 또는 6비트로 압축하여 기기 메모리에 맞게 만듭니다.
imatrix 트릭 (이 부분은 건너뛰지 마세요)
단순한 4비트 양자화는 디테일을 잃습니다. 이를 해결하는 방법이 바로 **중요도 행렬(importance matrix)**인 imatrix입니다. 이는 어떤 가중치가 실제로 중요한지를 측정하는 보정 단계이며, 압축 과정에서 이들을 보호합니다.
Qwen llama.cpp docs에 따르면:
# 1. 보정 텍스트 파일로부터 중요도 행렬 구축
./llama-imatrix -m Qwen3-4B-F16.gguf \
-f calibration-text.txt --chunk 512 \
...
만약 미리 만들어진 GGUF 파일을 다운로드한다면, imatrix를 사용해 빌드된 것을 선호하세요 (보통 평판 좋은 양자화 도구에서 Q4_K_M으로 표시됨). llama.cpp README에는 1비트 또는 2비트 혼합의 경우 --imatrix를 생략하면 경고 메시지가 출력된다고 경고합니다. 이 경고가 곧 해당 양자화 모델이 거칠다는 신호입니다.
4B 모델에 대한 일반적인 규칙:
Q4_K_M(~2.7 GB) — 휴대폰에 가장 균형 잡힌 선택입니다.Q5_K_M(~3.3 GB) — RAM이 충분하다면, 약간 더 선명합니다.Q2_K/IQ2— 절박할 때만 사용하세요; 품질 저하가 빠릅니다.
레이어 2 — Modelfile: 재학습 없이 개성 제어하기
행동을 변경하기 위해 가중치 자체를 건드릴 필요는 없습니다. Ollama의 Modelfile은 기본 모델을 시스템 프롬프트, 매개변수 및 템플릿으로 감싸서 사용할 수 있게 해줍니다. 이것이 가장 빠르고 효과적인 '경험 맞춤화' 방법입니다.
Ollama Modelfile 참조에서 가져온 내용:
FROM qwen3.5:4b
# 어시스턴트의 동작 (Behavior of the assistant)
...
빌드 및 실행:
ollama create my-assistant -f Modelfile
ollama run my-assistant
각 조절 장치(knob)의 역할
| 매개변수 (Parameter) | 효과 (Effect) | 권장 시작 값 (Good starting value) |
|---|---|---|
temperature | 창의성 vs 일관성 (Creativity vs coherence) | 사실 기반은 0.2–0.4, 브레인스토밍은 0.8+ |
| ... |
SYSTEM 라인은 "맞춤형 경험 (customized experience)"이 구현되는 곳입니다. 인도 관객을 위해 힌글리시(Hinglish) 답변을 원하시나요? 시스템 프롬프트를 힌글리시로 작성하세요. 스크립트에 파이프라이닝하기 위해 JSON 전용 출력을 원하시나요? "유효한 JSON으로만 응답하세요."라고 명시하면 됩니다.
레이어 3 — QLoRA: 개인 지식 가르치기
프롬프트에 모든 것을 담을 수는 없습니다. 모델이 사용자의 데이터(주식 CSV, 고객 지원 티켓, 개인 메모 등)를 알아야(know) 한다면, QLoRA를 사용하여 **LoRA 어댑터 (LoRA adapter)**를 미세 조정(fine-tune)하세요.
QLoRA (Dettmers et al., 2023)는 이를 일반 소비자용 하드웨어에서 가능하게 만들었습니다. 이 방식은 기본 가중치(base weights)를 4-bit NF4로 동결하고, 16-bit에서 작은 저차원 어댑터(low-rank adapters)를 학습시킵니다. 논문에서는 65B 모델을 단일 48 GB GPU에서 미세 조정하였으며, Vicuna 벤치마크에서 ChatGPT 점수의 99.3%에 도달했습니다. 4B 모델의 경우 훨씬 적은 자원이 필요하며, 보통 8–12 GB VRAM이 필요하거나 인내심이 있다면 CPU만으로도 가능합니다.
최소한의 개념 (의사 코드, 실제 라이브러리: peft + bitsandbytes + transformers):
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
...
Ollama에서는 Modelfile에 ADAPTER ./my-adapter.gguf를 통해 병합된 어댑터를 연결합니다. 결과적으로 40억 개의 매개변수를 다시 학습시키지 않고도, 사용자의 말투로 글을 쓰고 도메인 지식을 회상하는 모델을 얻을 수 있습니다.
솔직한 한계: 4B 모델에 적용하는 QLoRA가 마법처럼 기본 모델보다 더 똑똑하게 만들어주지는 않습니다. 이는 모델이 원래 가지고 있지 않던 추론 능력을 만드는 것이 아니라, _사용자가 입력한 스타일과 사실(style and facts)_을 모델에 각인시키는 것입니다. 기대치를 현실적으로 유지하세요.
레이어 4 — Abliteration: 거부 방향 제거
일부 오픈 모델(open models)은 여전히 거부 반응을 보입니다 ("AI로서, 저는 ... 할 수 없습니다"). Abliteration은 가중치를 거부 방향에 대해 직교화(orthogonalizing)함으로써 활성화 공간(activation space) 내의 _거부 방향(refusal direction)_을 제거합니다 — 재학습(retraining) 없이, 텐서(tensors)를 한 번 훑는 것만으로 가능합니다.
NousResearch의 llm-abliteration 저장소(repo)가 이 작업을 수행합니다:
python ablate.py --model Qwen3.5-4B \
--refusal_direction refusal_dir.pt \
--output Qwen3.5-4B-uncensored.gguf
주의 사항 (필독)
Abliteration은 마법 같은 "검열 해제(uncensor)" 버튼이 아니며, 저장소에서도 이를 명확히 밝히고 있습니다:
- 검열의 완전한 제거를 보장하지 않습니다. 적절하게 Abliteration된 모델은 캡처된 데이터셋을 기반으로 명시적인 거부를 하지 않겠지만, 예외적인 사례(edge cases)는 남아 있을 수 있습니다.
- 품질이 저하될 수 있습니다. 더 적은 레이어(layers)에서 방향을 제거하면 품질은 유지되지만 일부 거부 반응이 남을 수 있고, 더 많은 레이어에 적용하면 거부 반응은 깨끗이 사라지지만 모델의 성능이 둔화될 수 있습니다.
- 이 방식은 모델이 _무엇을 아는지(what it knows)_가 아니라, _어떻게 응답하는지(how the model responds)_를 변화시킵니다.
Abliteration은 수정 권한이 있는 모델에만 사용해야 하며, 결과물을 배포할 경우 책임 있는 사용 정책(responsible-use policy)을 유지하십시오. 대부분의 개인적 용도라면, 가중치를 건드리지 않고도 잘 작성된 SYSTEM 프롬프트(레이어 2)만으로 90%의 목적을 달성할 수 있습니다.
레이어 5 — RAG: 학습 없이 메모리 부여하기
"맞춤형 경험"은 종종 _내 정보를 기억한다_는 의미와 같습니다. 이를 위해 파인튜닝(fine-tuning)을 할 필요는 없습니다 — **검색 증강 생성 (RAG, Retrieval-Augmented Generation)**을 사용하세요. 문서를 임베딩(Embed)하고, 쿼리 시점에 상위 k개(top-k)를 가져와 컨텍스트(context)에 집어넣으면 됩니다.
# 개념적 예시
context = vector_db.search(query, top_k=4)
prompt = f"다음 내용만을 사용하여 답변하세요:\n{context}\n\n질문: {query}"
이 방식은 베이스 모델(base model)을 건드리지 않고 유지하며, 데이터가 변경될 때 즉시 업데이트되고, "개인용" 어시스턴트를 만드는 가장 저렴한 경로입니다. 검색된 텍스트가 들어갈 수 있도록 Modelfile의 num_ctx를 8192 이상으로 설정하여 함께 사용하세요.
휴대폰에서도 실행 가능한 최소한의 RAG
벡터 DB (Vector DB) 서버는 필요하지 않습니다. 수백 권 정도의 문서라면, sentence-transformers (또는 작은 GGUF 임베더)와 플랫 numpy 인덱스 (flat numpy index)만으로도 충분합니다:
import numpy as np
from sentence_transformers import SentenceTransformer
...
핵심은 이렇습니다: RAG와 튜닝된 Modelfile을 결합하면, 재학습(retraining)이나 클라우드 없이도 개인적인 어시스턴트를 가질 수 있습니다. 만약 데이터가 매일 바뀐다면 (시장 노트처럼), RAG가 QLoRA보다 유리합니다. 별도의 학습 실행 없이 단순히 다시 임베딩 (re-embed)만 하면 되기 때문입니다.
엔드투엔드 워크스루: 다운로드부터 "나만의 모델"까지
다음은 Termux/Android 기기에서 처음부터 끝까지 진행하는 전체 순서입니다:
# 1. 설치 + 서버 시작
pkg install ollama
ollama serve &
...
이것으로 맞춤형 페르소나 (persona) 설정은 끝났습니다. 나중에 모델이 개인적인 사실을 알게 하고 싶다면, QLoRA 어댑터 (ADAPTER 라인)를 추가하거나 앞에 RAG를 연결하세요. SYSTEM 프롬프트가 한계에 부딪힐 때만 더 깊게 파고들면 되는데, 솔직히 그런 경우는 드뭅니다.
튜닝하지 말아야 할 때
- 일회성 답변만 필요한 경우 → API를 사용하거나 일반적인 로컬 실행을 사용하세요. Modelfile을 만들지 마세요.
- 기본 모델이 이미 검열되어 있고 톤(tone)만 바꾸고 싶은 경우 → Modelfile을 사용하고, 어블리터레이션 (abliteration)은 건너뛰세요.
- 예시 데이터가 100행 미만인 경우 → QLoRA가 아닌 RAG를 사용하세요 (과적합 (overfit) 방지).
- 신뢰할 수 없는 사용자에게 서비스를 제공하는 경우 → 어블리터레이션을 하지 마세요. 거절 (refusals) 기능이 법적으로 당신을 보호합니다.
튜닝은 사다리와 같습니다. 한 번에 한 칸씩 올라가세요: 페르소나 → 양자화 (quant) → 메모리 → 지식 → 검열 해제. 대부분의 프로젝트는 첫 번째 또는 두 번째 칸에서 충분히 잘 작동합니다.
Android (Termux)에서 실행하기
네, 휴대폰에서 4B 모델을 서비스할 수 있습니다. 검증된 경로는 다음과 같습니다:
- Termux에 Ollama 설치:
pkg install ollama실행 후ollama serve. - 4B GGUF 기반 모델 가져오기 (예:
ollama pull qwen3.5:4b또는 Modelfile을 통해 GGUF 임포트FROM ./model.gguf). - Q4_K_M (
2.7 GB) 설정 시 8 GB RAM을 가진 기기에서 실행 가능하며, CPU에서 초당 515 토큰 (tokens/sec) 정도를 예상할 수 있습니다.
이번 세션 초반에 저는 10 GB RAM과 166 GB의 여유 공간이 있는 Termux 기기에서 Ollama 0.30.10을 실행했습니다. 4B Q4 모델은 충분히 감당 가능한 수준입니다. 속도를 위해서는 Neural Engine 또는 NPU가 있는 기기가 도움이 되지만, 채팅 용도로는 CPU만으로도 작동합니다.
인도 트레이딩 보조 도구를 위한 실제 Modelfile (Hinglish 페르소나)
이것은 모델이 저처럼 말하고 수치에 대해 절제력을 유지하기를 원할 때 제가 사용하는 정확한 형태입니다:
FROM qwen3.5:4b
SYSTEM """Tu ek NIFTY option-trading research aide hai. Hinglish me jawab de.
...
빌드하기: ollama create nifty-aide -f Modelfile && ollama run nifty-aide. temperature 0.25 설정은 모델이 통계 수치를 환각 (hallucinating) 하지 않도록 유지하며, Hinglish로 작성된 SYSTEM 라인은 이 _경험_을 일반적인 챗봇이 아닌 당신만의 것으로 만듭니다. 이 단 하나의 파일이 "LLM"과 "나만의 LLM"을 가르는 차이점입니다.
흔한 실패 사례 해결 (Troubleshooting)
- 모델이 같은 문장을 반복함 →
repeat_penalty를 1.15–1.2로 높이거나temperature를 낮추세요. - 수치 계산 후 답변이 멍청해짐 →
Q2_K/IQ2를 사용했을 가능성이 큽니다. imatrix를 사용하여Q4_K_M으로 다시 양자화 (Re-quant) 하세요. - 문서 중간에 컨텍스트 (Context)가 잘림 →
num_ctx가 너무 작습니다. 8192 또는 16384로 높이세요 (더 많은 RAM이 필요합니다). - Ollama "could not connect to server" 오류 →
ollama serve가 백그라운드에서 실행 중이지 않습니다. 먼저 실행하세요. - Abliterated 모델이 여전히 가끔 거부함 → 예상된 결과입니다. 이 기술은 100% 완벽하지 않습니다 (Layer 4 참조). 백업용으로 더 강력한
SYSTEM프롬프트를 작성하세요. - QLoRA가 과적합 (Overfits) 됨 (몇 개의 예시를 앵무새처럼 따라 함) → 50개 미만의 행으로 학습했을 때 발생합니다. 200개 이상의 다양한 샘플을 확보하거나 대신 RAG를 사용하세요.
모바일 벤치마크 현실 (기대치)
| 기기 RAM | 모델 | 양자화 (Quant) | 속도 (CPU) | 사용 가능 여부? |
|---|---|---|---|---|
| 4 GB | 3B | Q4_K_M | 3–6 t/s | 채팅용으로 간신히 가능 |
| ... | ||||
| "t/s"는 초당 토큰 수 (tokens per second)를 의미합니다. 약 5 t/s 미만이면 느리게 느껴지므로 8 t/s 이상을 목표로 하세요. 휴대폰 RAM이 4 GB라면 3B 모델로 낮추세요 (Q4 기준 Llama-3.2-3B-Uncensored는 약 2.2 GB이며 채팅에 적합합니다). |
비교: 당신에게는 어떤 레이어가 필요한가요?
| 목표 | 최적의 레이어 | 노력 | 리스크 |
|---|---|---|---|
| 말투/페르소나 변경 | Modelfile SYSTEM | 낮음 | 없음 |
| ... | |||
| 레이어 2부터 시작하세요. "다르게 행동했으면 좋겠다"는 문제의 대부분은 거기서 해결됩니다. 프롬프트(Prompt)가 한계에 부딪힐 때만 더 낮은 레이어로 내려가세요. |
FAQ
Q: 로컬 모델을 튜닝하려면 GPU가 필요한가요?
A: 아니요. 양자화 (Quantization) 및 Modelfile 래핑 (Wrapping)은 CPU만으로도 가능합니다. QLoRA 미세 조정 (Fine-tuning)은 GPU에서 더 빠르지만 CPU에서도 실행 가능합니다. 단지 속도가 느릴 뿐입니다.
Q: Abliteration을 하면 모델이 안전하지 않게 되나요?
A: 거부 반응 (Refusals)을 제거하므로, 모델이 기본 모델(Base model)이 거절했던 질문에 답변하게 됩니다. 이는 사용자의 책임입니다. 경계를 테스트하고, 검증되지 않은 사용자에게 검열되지 않은(Uncensored) 빌드를 노출하지 마세요.
Q: 튜닝할 가치가 있는 가장 작은 모델은 무엇인가요?
A: 스마트폰의 경우 3B–4B가 최적의 지점(Sweet spot)입니다. 1.5B 미만은 기본 모델이 새로운 동작을 유지하기에 너무 약하기 때문에 튜닝의 효과가 적습니다.
Q: imatrix vs 일반 양자화 — 할 만한 가치가 있나요?
A: 3–4 bit 단계에서는 그렇습니다. 보정 (Calibration)을 위해 명령어를 하나 더 실행해야 하지만, 응답의 일관성을 눈에 띄게 유지해 줍니다. 이미 품질이 높은 Q6/Q8 단계라면 건너뛰어도 좋습니다.
Q: 완전히 오프라인으로 실행할 수 있나요?
A: 네. GGUF 파일이 다운로드되면 서빙 (Serve), 튜닝 (Tune), 추론 (Infer) 등 모든 과정이 네트워크 없이 작동합니다. 그것이 로컬 AI를 사용하는 핵심 이유입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기