对Copilot和Cursor们的补充:用 AI 批量处理项目代码

1,316 阅读4分钟

我已经依赖 ChatGPT 和 GitHub Copilot了,但老是得在Copilot的聊天窗口和打开的代码文件之间复制粘贴还是有点让人厌烦了。我也尝试了 Cursor,虽然解决了第一个问题,但还是要一个个打开文件将它们添加到 AI 的上下文中。

于是就有了batchai这么个工具: github.com/qiangyt/bat…

出发点很简单: 无需再复制粘贴,因为它会遍历指定的目录和文件,而且只在 Git 仓库目录中运行,所以程序员自己需要核对所有 batchai做出的更改(因为 AI 也常常犯错)。

目前,batchai只支持代码审查和修复常见问题(可以看作是本地的 AI 驱动 的SonarQube)。已经在做的下一个功能是批量生成单元测试代码,打算用在自己的几个个人项目上(包括这个batchai),因为它们几乎没什么单元测试。其它计划的功能包括代码解释和注释生成、重构 —— 所有这些都将被批量处理。还有就是,尝试让batchai能对项目代码有整体的视角,譬如建立跨文件的代码符号索引,这应该有助于AI工作得更好。

下面是过去两周里我在自己的一些项目测试使用batchai后的一些有趣的发现:

  • AI常常能发现那些传统工具(譬如SonarQube)会遗漏的问题。
  • AI不会一次性报告所有问题,因此我需要多次运行它。
  • 由于 LLM 训练数据的过时和幻觉问题,程序员自己核对更改的准确性必不可少- 这就是为什么我让batchai只在干净的 Git 仓库目录中工作。

我找了spring-petclinic(克隆自https://github.com/spring-projects/spring-petclinic)这个Java项目来演示。

下面是一些正确的例子:

batchai-demo-1.png

batchai-demo-2.png

以及一个错误的例子:

batchai-demo-3.png

更多细节:

功能

  • 代码审查 : 在控制台输出审查报告并保存下来,然后直接修复代码。
  • 自定义提示词。
  • 文件忽略 : 指定忽略的文件,支持.gitignore和额外的.batchai_ignore文件。
  • 指定额外的目标路径: 允许指定 Git 仓库中的部分目录和文件。
  • 使用 Go 实现: 生成一个可在 Mac OSX、Linux 和 Windows 上运行的单一可执行文件。
  • diff显示 : 在控制台中显示彩色差异。
  • LLM 支持 : 支持与 OpenAI 兼容的 LLM,包括 Ollama。
  • I18N : 支持国际化注释/解释生成。

计划的功能

  • 解释、注释生成、测试生成、重构。
  • 拒绝更改跟踪 : 跟踪被拒绝的更改以避免重复修改。
  • 语言特定提示词 : 针对不同编程语言的不同提示词。
  • LLM 使用指标 : 实现 LLM 使用跟踪的指标。

开始使用

  1. 这里下载最新的可执行二进制文件并将其添加到您的 $PATH 中。对于 Linux 和 Mac OSX,请记得运行chmod +x ...使下载的二进制文件可执行。

  2. 克隆演示项目。以下步骤假设克隆的项目目录为 /data/spring-petclinic

    cd /data
    git clone https://github.com/spring-projects/spring-petclinic
    cd spring-petclinic
    

    在此目录中,创建一个.env文件。在.env文件中设置OPENAI_API_KEY。以下是一个示例:

    # OpenAI
    OPENAI_API_KEY=change-it
    #OPENAI_PROXY_URL= 对于国内用户,需要在这里设置代理的URL和用户名密码等等
    #OPENAI_PROXY_USER=
    #OPENAI_PROXY_PASS=
    #BATCHAI_REVIEW_MODEL=openai/gpt-4o-mini
    
    # Ali TONGYI qwen
    #QWEN_API_KEY=change-it
    #BATCHAI_REVIEW_MODEL=tongyi/qwen2.5-coder-7b-instruct
    
    # local Ollama
    #OLLAMA_BASE_URL=http://localhost:11434/v1/
    #BATCHAI_REVIEW_MODEL=ollama/qwen2.5-coder:7b-instruct-fp16
    

    对于 Ollama,您可以参考我的示例docker-compose.yml

  3. CLI 示例:

    • 将审核问题报告输出到控制台(也会保存到 build/batchai):
    cd /data/spring-petclinic
    batchai review . src/main/java/org/springframework/samples/petclinic/vet/Vets.java
    
    • 通过--fix选项直接修复目标文件:
    cd /data/spring-petclinic
    batchai review --fix . src/main/java/org/springframework/samples/petclinic/vet/Vets.java
    
    • 仅对 src/main/java 运行 batchai:
    cd /data/spring-petclinic
    batchai review . src/main/java/
    
    • 在整个项目中运行batchai:
    cd /data/spring-petclinic
    batchai review .
    

CLI 使用

  • 查看全局帮助菜单和可用命令,请运行:

    batchai -h
    
    NAME:
    batchai - 用 AI 批量处理项目代码
    
    USAGE:
      batchai [global options] command [command options] <repository directory>  [target files/directories in the repository]
    
    VERSION:
      0.1.0 (5eeb081)
    
    COMMANDS:
      review           将问题报告到控制台,也保存到 'build/batchai'
      list             列出要处理的文件
      explain (TODO)   解释代码,输出结果到控制台或作为注释
      comment (TODO)   对代码进行注释
      refactor (TODO)  重构代码
      help, h          显示命令列表或某个命令的帮助
    
    GLOBAL OPTIONS:
      --enable-symbol-reference  启用符号收集以检查整个项目中的代码引用(默认:false)
      --lang value, -l value     生成文本的语言(默认:en_US.UTF-8)[$LANG]
      --help, -h                 print the version
      --version, -v              打印版本
    
  • 要查看review命令的详细帮助,请运行:

    batchai review -h
    
    NAME:
      batchai review - 将问题报告到控制台,也保存到 'build/batchai'
    
    USAGE:
      batchai review [command options]
    
    OPTIONS:
      --fix, -f   替换目标文件(默认:false)
      --force     忽略缓存(默认:false)
      --help, -h  show help
    

支持的 LLMs

已测试和支持的模型:

  • OpenAI 系列:

    • openai/gpt-4o

    • openai/gpt-4o-mini

    其他OpenAI模型也应该可以正常工作。

  • 阿里通义千问系列:

    • qwen2.5-coder-7b-instruct (也可通过 Ollama 使用)

    其他通义千问模型也应该可以正常工作。

要添加更多 LLM,只需按照res/static/batchai.yaml中的配置进行操作,只要该 LLM 提供与 OpenAI 兼容的 API 即可。

配置

  • 可选配置文件:

    可以创建1个${HOME}/batchai/batchai.yaml。完整示例请参考res/static/batchai.yaml

  • 环境文件:

    你也可以通过目标 Git 仓库目录中的 .env 文件来配置 batchai。有关所有可用环境变量的参考,请查看 res/static/batchai.yaml 和它们的默认值res/static/batchai.env

  • 忽略特定文件 batchai依据.gitignore文件里的规则忽略指定的目录和文件。通常这已经足够,但如果还有额外的不能被git忽略但不必由batchai处理的,可以使用.batchai_ignore指定,规则写法和.gitignore相同。

  • 自定义提示词 请查看 res/static/batchai.yaml里的BATCHAI_REVIEW_RULE_*MY_REVIEW_RULE_*