AI Git コミットメッセージ生成器を作ってみた
以前の私は、「fixed bug」や「updated stuff」といった質の低いコミットメッセージを書いていました。そのせいでプルリクエストが乱雑になってしまっていたのです。そこで、AIを使ってこれを自動化することに決めました。コードのdiffから、クリーンで Conventional Commits に準拠したコミットメッセージを生成したかったのです。
思っていたよりも難しかったです。単純なプロンプトではうまくいきませんでした。
初期段階の試みは、多くの理由で失敗しました:
- AIが短い行ではなく、長い段落を書いてしまう。
- 必須の「feat:」や「fix:」といったプレフィックスを無視する。
- コードに存在しない機能を捏造(ハルシネーション)する。
- ローカルモデルは動作が遅すぎ、詩的で役に立たないスタイルで書いてしまう。
最終的に、うまく機能するハイブリッドシステムを構築しました。私が採用している構成は以下の通りです:
- Type Classification(タイプの分類):メッセージを書く前に、feat、fix、choreなどのタイプを選択するようモデルに指示します。
- Context Truncation(コンテキストの切り詰め):diffの最初の250行のみを送信します。これによりコストを抑え、焦点を絞ることができます。
- Validation(バリデーション):regexを使用して出力をチェックします。メッセージが正しくない場合、スクリプトは再試行します。
- Low Temperature(低めのTemperature):temperatureを0.2に設定します。これにより、出力が安定し、単調になります。ログにとっては、単調な方が良いのです。
自動コミットフックは使用していません。AIは間違いを犯すからです。私はこのスクリプトをgit aliasとして実行しています。スクリプトがメッセージを提案し、私がコミットする前にそれをレビューします。手動でのレビューこそが、汚いgit履歴を作らないための最良の保険です。
学んだ3つの教訓:
- トークン制限は敵です。巨大なdiffは、予算を圧迫するかプロンプトを壊します。
- バリデーションは必須です。これがないと、デタラメな結果が出てきます。
- スピードが重要です。高速で安価なGPT-4o-miniを使用しています。
機密性の高いコードを扱っている場合は、diffを外部APIに送信しないでください。代わりにローカルモデルを使用してください。
あなたはコミットメッセージをどのように扱っていますか?AIを使っていますか、それとも手書きしていますか?
