我构建了一个 AI Git Commit Message 生成器
我以前经常写一些很烂的 commit message,比如 "fixed bug" 或 "updated stuff"。这让我的 pull request 变得非常混乱。于是我决定利用 AI 来实现自动化。我想根据代码 diff 生成简洁且符合规范(conventional)的 commit message。
这比我想象中要难。简单的 prompt 根本不起作用。
早期的尝试失败有很多原因:
- AI 写的是长篇大论,而不是简短的行。
- 它忽略了必须的 "feat:" 或 "fix:" 前缀。
- 它会幻觉出代码中并不存在的特性。
- 本地模型太慢了,而且写出来的风格文绉绉的,毫无用处。
我最终构建了一个行之有效的混合系统。以下是我使用的结构:
- 类型分类 (Type Classification):在编写消息之前,我会要求模型先选择一个类型,例如 feat、fix 或 chore。
- 上下文截断 (Context Truncation):我只发送 diff 的前 250 行。这样既能节省成本,又能保持关注点的集中。
- 校验 (Validation):我使用 regex 来检查输出。如果消息格式错误,脚本会重新尝试。
- 低 Temperature (Low Temperature):我将 temperature 设置为 0.2。这使得输出保持一致且“枯燥”。对于日志来说,枯燥反而是件好事。
我不使用自动 commit hooks。AI 也会犯错。我将脚本作为一个 git alias 来运行。它会建议一条消息,我在 commit 之前会进行人工审核。人工审核是防止 git 历史记录变乱的最佳保险。
我学到的三个教训:
- Token 限制是你的敌人。过大的 diff 会超出你的预算或破坏你的 prompt。
- 校验是必须的。没有校验,你只会得到一堆废话。
- 速度很重要。我使用 GPT-4o-mini,因为它既快又便宜。
如果你在处理敏感代码,请不要将 diff 发送到外部 API。请改用本地模型。
你是如何处理 commit message 的?你是使用 AI 还是手动编写?
