로컬 LLM으로 Git 커밋 메시지 자동 생성기 만들기
Claude API 사용 제한으로 인해 커밋 메시지 생성 실패 후, 로컬 LLM(Local LLM) 도입 필요성을 인지함
Ollama와 qwen2.5-coder:1.5b 모델을 활용하여 로컬 환경에서 LLM 기반 커밋 메시지 자동 생성 시도
컨텍스트 창(Context Window) 제한 및 프롬프트 엔지니어링(Prompt Engineering)의 중요성을 파악하고, Modelfile을 통한 모델 튜닝으로 해결함
최종적으로 Conventional Commits 형식을 따르는 자동 커밋 메시지 생성 함수(gac)를 구축함
로컬 LLM 구동을 위한 하드웨어 요구사항
로컬 환경에서 LLM(Large Language Model)을 구동하기 위해서는 하드웨어 사양(Hardware Specification), 특히 RAM 용량이 중요한 제약 조건으로 작용함.
8GB RAM 환경: 1.5B 파라미터 모델(qwen2.5-coder:1.5b)은 약 1GB의 디스크 공간과 1.2GB의 메모리를 차지하며, 컨텍스트 창(Context Window)을 고려해도 약 1.77GB의 여유 메모리 확보 가능
양자화(Quantization): 모델 가중치를 저정밀도(4-bit, 8-bit)로 저장하여 모델 크기와 메모리 사용량을 크게 줄이는 기술로, 모델 파일 크기(Model File Size)를 1GB 수준으로 압축함
대형 모델 구동 시도: 더 큰 모델(예: 7B 파라미터)은 시스템 불안정(System Instability) 및 사용 불가 상태를 초래하여, 제한된 환경에서는 적절한 크기의 모델 선택이 필수적임
Ollama의 기본 컨텍스트 창 제한 문제
Ollama는 기본적으로 VRAM 기반의 기본 컨텍스트 크기(Default Context Size)를 설정하여, 사용 가능한 GPU 메모리에 따라 최대 토큰 수를 제한함.
기본값 4096 토큰: 본문의 8GB RAM 환경에서는 약 5.3 GiB VRAM으로 인해 기본 `num_ctx`가 4096으로 설정되었으며, 이는 모델이 전체 코드 변경 사항을 인지하지 못하는 원인이 됨
Modelfile을 통한 컨텍스트 확장: `PARAMETER num_ctx 8192` 설정을 통해 컨텍스트 창을 8192 토큰으로 확장하여, 더 많은 코드 변경 내용을 모델이 처리할 수 있도록 함
결과: 컨텍스트 창 확장은 모델이 더 많은 정보를 바탕으로 정확한 커밋 메시지를 생성하는 데 기여하지만, 메모리 사용량 증가(Memory Usage Increase)에 대한 고려가 필요함
프롬프트 엔지니어링과 Modelfile의 역할
LLM의 출력 품질은 프롬프트 엔지니어링(Prompt Engineering)과 모델 자체의 설정에 크게 의존하며, Modelfile은 이를 체계적으로 관리하는 방법을 제공함.
초기 프롬프트의 한계: 단순 지시만으로는 모델이 코드 변경 사항의 핵심을 파악하지 못하고 부정확하거나 불완전한 메시지를 생성하는 문제 발생
Modelfile 활용: `FROM`, `PARAMETER`, `SYSTEM` 지시어를 통해 기본 모델, 추론 파라미터(Temperature, Top_p), 시스템 프롬프트 등을 사전 정의하여 특정 작업에 최적화된 모델(`qwen-commit`) 생성
주요 파라미터 튜닝: `temperature 0.2`로 예측 가능성 증대, `repeat_penalty 1.2`로 중복 단어 방지, `stop` 시퀀스로 불필요한 텍스트 생성 차단 등
결과적으로 Modelfile은 재현 가능한(Reproducible) LLM 워크플로우 구축에 핵심적인 역할을 수행함
Conventional Commits 표준 적용 및 후처리
자동 생성된 커밋 메시지의 품질을 높이기 위해 Conventional Commits 표준을 적용하고, 후처리 단계를 통해 불필한 서식 제거가 필수적임.
시스템 프롬프트 강화: `type(scope): description` 형식 강제, 허용된 타입(`feat`, `fix` 등) 지정, 명령형(Imperative Mood) 사용 등 엄격한 규칙 적용
후처리 스크립트: `sed`, `tr` 명령어를 사용하여 생성된 메시지에서 마크다운 코드 블록(Markdown Code Blocks), 따옴표, 불필요한 공백, Git diff 접두사 등을 제거
`git diff --unified=0` 활용: 변경된 코드 주변의 불필요한 컨텍스트 라인을 제거하여 토큰 사용량(Token Usage)을 최소화하고 모델의 집중도를 높임
이러한 과정을 통해 일관성 있고 머신 리더블(Machine-Readable)한 커밋 메시지 생성이 가능해짐
로컬 LLM 도입의 장단점 및 학습 가치
로컬 LLM 환경 구축은 비용 절감(Cost Saving)과 오프라인 환경에서의 작업 가능성이라는 명확한 이점을 제공함.
장점: API 사용료 없이 무료로 LLM 활용, 데이터 프라이버시(Data Privacy) 강화 (민감 코드 유출 방지), 인터넷 연결 없이 작업 가능
단점: 초기 설정의 복잡성, 하드웨어 제약(Hardware Constraints)으로 인한 성능 한계, 모델 튜닝 및 유지보수의 어려움
학습 가치: LLM의 작동 원리(Working Principle), 컨텍스트 창의 영향, 파라미터 튜닝의 중요성 등 실질적인 LLM 활용 경험을 통해 깊이 있는 이해를 얻을 수 있음
결론적으로, 개인적인 학습 목표 달성을 위해 로컬 LLM을 선택하는 것은 기술적 이해도를 높이는 효과적인 방법임