AI Git 커밋 메시지 생성기를 만들었습니다
예전에는 "fixed bug"나 "updated stuff" 같은 형편없는 커밋 메시지를 작성하곤 했습니다. 이 때문에 풀 리퀘스트(PR)가 지저분해졌죠. 그래서 AI를 사용해 이를 자동화하기로 했습니다. 코드 디프(diff)로부터 깔끔하고 관례적인(conventional) 커밋 메시지를 생성하고 싶었습니다.
생각보다 어려웠습니다. 단순한 프롬프트만으로는 해결되지 않았습니다.
초기 시도들은 여러 가지 이유로 실패했습니다:
- AI가 짧은 한 줄 대신 긴 문단을 작성했습니다.
- 필수적인 "feat:" 또는 "fix:" 접두사를 무시했습니다.
- 코드에 존재하지 않는 기능을 환각(hallucination)하여 만들어냈습니다.
- 로컬 모델은 너무 느렸고, 시적이고 쓸모없는 스타일로 글을 썼습니다.
결국 제대로 작동하는 하이브리드 시스템을 구축했습니다. 제가 사용하는 구조는 다음과 같습니다:
- 유형 분류(Type Classification): 메시지를 작성하기 전에 모델에게 feat, fix 또는 chore와 같은 유형을 선택하도록 요청합니다.
- 컨텍스트 절단(Context Truncation): 디프의 처음 250줄만 보냅니다. 이렇게 하면 비용을 절감하고 초점을 명확히 유지할 수 있습니다.
- 검증(Validation):
regex를 사용하여 출력을 확인합니다. 메시지가 잘못되었다면 스크립트가 다시 시도합니다. - 낮은 온도(Low Temperature): 온도를 0.2로 설정합니다. 이렇게 하면 출력이 일관되고 지루해집니다. 로그에는 지루한 것이 좋습니다.
자동 커밋 훅(commit hooks)은 사용하지 않습니다. AI는 실수를 하기 때문입니다. 대신 git alias로 스크립트를 실행합니다. 스크립트가 메시지를 제안하면, 커밋하기 전에 제가 직접 검토합니다. 수동 검토는 잘못된 git 히스토리를 방지하는 가장 좋은 보험입니다.
세 가지 교훈을 얻었습니다:
- 토큰 제한은 적입니다. 큰 디프는 예산을 초과하거나 프롬프트를 망가뜨릴 수 있습니다.
- 검증은 필수입니다. 검증이 없으면 엉뚱한 결과가 나옵니다.
- 속도가 중요합니다. 빠르고 저렴한 GPT-4o-mini를 사용합니다.
민감한 코드를 다룬다면 디프를 외부 API로 보내지 마세요. 대신 로컬 모델을 사용하세요.
여러분은 커밋 메시지를 어떻게 관리하시나요? AI를 사용하시나요, 아니면 직접 작성하시나요?
