"8GB VRAM 제약 환경에서 파인튜닝부터 Windows 배포까지 전 과정을 혼자 완성한 경량 로컬 AI 캐릭터 챗봇 — LoRA·RAG·CI/CD 포함”
| 영역 | 기술 | 용도 |
|---|---|---|
| LLM (dev) | transformers + Qwen2.5-3B-Instruct |
학습·개발 환경 GPU 추론 |
| LLM (deploy) | llama-cpp-python + GGUF Q4_K_M |
Windows CPU 추론 |
| 파인튜닝 | peft LoRA (r=32, α=64) |
캐릭터 말투·성격 학습 |
| 양자화 | bitsandbytes NF4 (double quant) |
VRAM 절감 (dev 환경) |
| 연속학습 | EWC (Fisher Information Matrix) | Catastrophic Forgetting 방지 |
| 임베딩 | sentence-transformers BAAI/bge-m3 |
장기 메모리·RAG 벡터화 |
| 벡터 DB | chromadb PersistentClient |
장기 메모리 / RAG / 프롬프트 가이드 |
| 로컬 검색 | SQLite FTS5 (표준 sqlite3) |
파일 전문 검색 (증분 인덱싱) |
| UI | PySide6 + QML |
플로팅 프레임리스 UI |
| 이미지 처리 | Pillow |
파일 형식 변환 도구 |
| 패키지 관리 | uv |
dev/deploy 의존성 분리 관리 |
| CI | GitHub Actions + ruff |
lint·데이터 파이프라인 검증 |
| CD | GitHub Actions + PyInstaller + Inno Setup | Windows exe 인스톨러 자동 빌드·릴리즈 |
| 학습 데이터 | JSONL + build_dataset.py |
카테고리별 SFT 데이터 파이프라인 |
| 로깅 | loguru |
stderr 출력 (deploy 파일 로그 없음) |
| 지표 | Before | After | 변화 |
|---|---|---|---|
| 앱 초기 RAM 점유 | ~2,730 MB | ~1,027 MB | -62% |
| VRAM 여유 헤드룸 | 622 MB | 977 MB | +355 MB |
| 턴당 LLM 호출 횟수 | 2회 (대화 + 나레이션) | 1회 | -50% |
| LoRA eval_loss | 1.687 (v7) | 1.54 (v11) | -8.7% |
| 전체 자동화 테스트 | 240개 (기능개선 완료 시점) | 475개 | +235개 |
| AI-tell 표현 | 발생 | 0건/10 | 완전 억제 |
앱 초기 RAM 점유 62% 절감 (2,730MB → 1,027MB), VRAM 여유 +355MB 확보, 턴당 LLM 호출 50% 감소, LoRA eval_loss 1.687 → 1.54, 자동화 테스트 240 → 475개, AI 어투 표현 완전 억제(0건/10). eval_loss가 더 낮은 v12 대신 실환경 테스트 기반으로 v11 채택 — 수치보다 실사용 품질을 우선한 판단.
DB의 역할 변경 +기능모드 확장 ⇒ Agentic 대화로의 확장 가능성
기능/대화 모드 어댑터 분리 미구현
할루시네이션 문제 미해결