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を使っていますか、それとも手書きしていますか?

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