Tôi đã xây dựng một công cụ tạo commit message bằng AI

Tôi từng viết những commit message rất tệ như "fixed bug" hay "updated stuff." Điều này khiến các pull request của tôi trở nên lộn xộn. Tôi quyết định tự động hóa việc này bằng AI. Tôi muốn tạo ra các commit message sạch sẽ, tuân theo chuẩn conventional từ các bản diff của mã nguồn.

Việc này khó hơn tôi tưởng. Một câu prompt đơn giản là không đủ.

Những nỗ lực ban đầu đã thất bại vì nhiều lý do:

  • AI viết những đoạn văn dài thay vì các dòng ngắn gọn.
  • Nó bỏ qua các tiền tố bắt buộc như "feat:" hoặc "fix:".
  • Nó "ảo tưởng" (hallucinate) ra các tính năng không hề tồn tại trong mã nguồn.
  • Các mô hình chạy local quá chậm và viết theo phong cách đầy chất thơ nhưng vô dụng.

Cuối cùng, tôi đã xây dựng được một hệ thống lai (hybrid) hoạt động hiệu quả. Đây là cấu trúc mà tôi sử dụng:

  • Phân loại kiểu (Type Classification): Tôi yêu cầu mô hình chọn một loại như feat, fix, hoặc chore trước khi viết message.
  • Cắt bớt ngữ cảnh (Context Truncation): Tôi chỉ gửi 250 dòng đầu tiên của bản diff. Việc này giúp tiết kiệm chi phí và giữ cho sự tập trung được chính xác.
  • Xác thực (Validation): Tôi sử dụng regex để kiểm tra kết quả đầu ra. Nếu message sai, script sẽ thử lại.
  • Nhiệt độ thấp (Low Temperature): Tôi đặt temperature là 0.2. Điều này giúp kết quả đầu ra nhất quán và "nhàm chán". Sự nhàm chán là điều tốt cho các bản log.

Tôi không sử dụng commit hooks tự động. AI vẫn có thể mắc lỗi. Tôi chạy script dưới dạng một git alias. Nó sẽ gợi ý một message, và tôi sẽ xem xét lại trước khi commit. Kiểm tra thủ công là cách bảo hiểm tốt nhất để tránh một lịch sử git tồi tệ.

Ba bài học tôi rút ra được:

  • Giới hạn token là kẻ thù của bạn. Các bản diff lớn sẽ làm cạn kiệt ngân sách hoặc làm hỏng prompt của bạn.
  • Xác thực là bắt buộc. Nếu không, bạn sẽ nhận được những thứ vô nghĩa.
  • Tốc độ rất quan trọng. Tôi sử dụng GPT-4o-mini vì nó nhanh và rẻ.

Nếu bạn làm việc với mã nguồn nhạy cảm, đừng gửi các bản diff của mình tới một API bên ngoài. Hãy sử dụng một mô hình chạy local thay thế.

Bạn xử lý các commit message của mình như thế nào? Bạn sử dụng AI hay tự viết tay?

Nguồn: https://dev.to/__c1b9e06dc90a7e0a676b/i-built-a-git-commit-message-generator-with-ai-heres-what-i-learned-2534