ผมสร้าง AI สำหรับสร้าง Git Commit Message
เมื่อก่อนผมชอบเขียน commit message แย่ๆ อย่างเช่น "fixed bug" หรือ "updated stuff" ซึ่งมันทำให้ pull requests ของผมดูวุ่นวายไปหมด ผมเลยตัดสินใจที่จะทำให้มันเป็นอัตโนมัติโดยใช้ AI เพราะผมต้องการสร้าง commit message ที่สะอาดและเป็นไปตามมาตรฐาน (conventional) จาก code diffs ของผม
มันยากกว่าที่ผมคิดไว้เสียอีก แค่ใช้ prompt ง่ายๆ มันไม่ได้ผลหรอก
ความพยายามในช่วงแรกล้มเหลวด้วยหลายสาเหตุ:
- AI เขียนเป็นย่อหน้ายาวๆ แทนที่จะเป็นบรรทัดสั้นๆ
- มันละเลย prefix ที่จำเป็นอย่าง "feat:" หรือ "fix:"
- มันเกิดอาการ hallucinate ฟีเจอร์ที่ไม่มีอยู่จริงในโค้ด
- Local models ทำงานช้าเกินไป แถมยังเขียนด้วยสำนวนที่สละสลวยแต่ไร้ประโยชน์
ในที่สุดผมก็สร้างระบบแบบ hybrid ที่ใช้งานได้จริงขึ้นมา นี่คือโครงสร้างที่ผมใช้:
- Type Classification: ผมให้โมเดลเลือกประเภทก่อน เช่น feat, fix หรือ chore ก่อนที่จะเขียนข้อความ
- Context Truncation: ผมส่งเฉพาะ 250 บรรทัดแรกของ diff เท่านั้น วิธีนี้ช่วยประหยัดค่าใช้จ่ายและทำให้โมเดลโฟกัสได้แม่นยำขึ้น
- Validation: ผมใช้ regex ในการตรวจสอบผลลัพธ์ ถ้าข้อความไม่ถูกต้อง สคริปต์จะลองใหม่อีกครั้ง
- Low Temperature: ผมตั้งค่า temperature ไว้ที่ 0.2 ซึ่งทำให้ผลลัพธ์มีความสม่ำเสมอและดูน่าเบื่อ ซึ่งความน่าเบื่อนี่แหละดีสำหรับการทำ logs
ผมไม่ได้ใช้ automatic commit hooks เพราะ AI ก็มีข้อผิดพลาดได้ ผมเลือกใช้สคริปต์ในรูปแบบ git alias แทน โดยมันจะเสนอข้อความขึ้นมา แล้วผมค่อยตรวจสอบอีกครั้งก่อนจะ commit การตรวจสอบด้วยตัวเองคือการประกันที่ดีที่สุดเพื่อไม่ให้ git history พัง
สามบทเรียนที่ผมได้รับ:
- Token limits คือศัตรูของคุณ diff ที่ใหญ่เกินไปจะทำให้งบบานปลายหรือทำให้ prompt พังได้
- Validation เป็นเรื่องที่ขาดไม่ได้ ถ้าไม่มีมัน คุณจะได้ข้อความที่ไร้สาระออกมา
- ความเร็วเป็นเรื่องสำคัญ ผมใช้ GPT-4o-mini เพราะมันเร็วและราคาถูก
หากคุณทำงานกับโค้ดที่มีความสำคัญหรือเป็นความลับ อย่าส่ง diff ของคุณไปยัง external API ให้ใช้ local model แทน
แล้วคุณล่ะ จัดการกับ commit messages อย่างไร? ใช้ AI หรือเขียนเองด้วยมือ?
