前两天发现 Groq 把国内 IP 给封了,换个思路,顺手把 DeepSeek 接上做了一个 AI 代码审查工具。

写完了算了下成本——审查一次不到 1 分钱


为什么需要这个工具

独立开发者最缺什么?不是技术,是 Code Review。

写代码的时候自己觉得没问题,实际上命名不规范、集合没指定容量、事务注解没配 rollbackFor——这些坑踩过的都懂。

大厂有同事审查,独立开发者只能靠自己的眼睛。但 AI 可以当这个同事。

70 条规则,不是通用的

市面上很多 AI 审查工具用的是通用规则,比如「类名要驼峰」「变量要有意义」。这些 ChatGPT 也能干。

但我想要的是这个东西:

  • Map.of() 不能传 null(否则运行时报 NPE,这是我真实踩过的坑)
  • 审计字段必须设 updated_by(否则插入报错)
  • CORS 配置必须配 CorsConfigurationSource Bean(光配 .cors() 不够)

这些规则你查遍全网也找不到——它们来自我 6 个微服务踩过的坑。

我把阿里巴巴 Java 手册(55 条)和我自己的实战经验(15 条)整理到一起,总共 70 条规则,喂给 AI。

在这里插入图片描述

一次审查多少钱

我用 DeepSeek API,审查一次代码大概消耗 8000 tokens 左右:

项目 数量
规则文件(70 条) ~3500 tokens
审查指令 ~500 tokens
用户代码(~200 行) ~3000 tokens
输出(审查结果) ~1500 tokens
总计 ~8500 tokens

DeepSeek 的价格:输入 1 元/百万 tokens,输出 2 元/百万。

算下来一次审查:(7000 × 1 + 1500 × 2) / 1000000 = 0.007 + 0.003 = 0.01 元

充 10 块能用 1000 次。

架构很简单

没有数据库、没有状态、没有历史记录——纯无状态设计。

用户贴代码 → 后端拼 Prompt(70 条规则 + 代码)→ 调 DeepSeek API → 解析 JSON → 展示报告

后端就一个 POST 接口,前端一个 Monaco 编辑器 + 审查报告区。

选 VS Code 暗色主题,代码区占 60% 注意力,报告区左边框按严重程度着色:

  • 🔴 红色:ERROR(必须修)
  • 🟡 黄色:WARNING(推荐修)
  • 🔵 蓝色:INFO(建议优化)

在这里插入图片描述

项目结构也很干净:

services/ai-reviewer/    ← Spring Boot 3
clients/ai-reviewer/     ← React + Monaco
docs/ai-review-rules.md  ← 70 条规则,改文件即改行为

规则文件是唯一的「数据引擎」。今天 70 条,明天踩了新坑加一条,重启即生效。不需要数据库迁移,不需要后台管理页面。

Prompt 是关键

同样的代码喂给 AI,规则写得清不清晰,直接影响审查质量。

我的 Prompt 结构:

  1. System 位置放规则:70 条规则是固定背景,放 system message
  2. User 位置放代码:每次审查的代码不同
  3. JSON 强约束:要求 AI 只输出 JSON,否则解析会崩
  4. 支持规则集切换:all / p3c(阿里规约)/ wuxiannet(我的经验)
/**
     * 构建完整 prompt
     */
    public String buildPrompt(String code, String language, String rulesType) {
        String rules = getRulesText(rulesType);
        String truncatedCode = code.length() > 8000 ? code.substring(0, 8000)
                + "\n\n// [代码已截断,超过 8000 字符]" : code;

        return """
                你是一个严格的 Java 代码审查专家。请按照以下规则逐条审查代码,输出结构化报告。
                
                ## 审查规则
                
                %s
                
                ## 审查要求
                
                1. 逐条对照规则检查代码
                2. 只报告真正违反的规则,不要报告"未发现违反"
                3. 每条问题标注: 行号、违反的规则编号、问题描述、修复建议
                4. 级别: ERROR(必须修复) / WARNING(推荐修复) / INFO(建议优化)
                
                ## 待审查代码
                
                ```%s
                %s
                ```
                
                ## 输出格式
                
                严格按 JSON 格式输出,不要额外解释:
                {
                  "summary": {"total": N, "errors": N, "warnings": N, "infos": N},
                  "issues": [
                    {"level": "ERROR|WARNING|INFO", "ruleId": N, "title": "...", "line": N, "code": "...", "message": "...", "suggestion": "..."}
                  ]
                }
                """.formatted(rules, language != null ? language : "java", truncatedCode);
    }

在这里插入图片描述

最开始的版本发现 AI 经常在 JSON 前后加废话「根据您的代码,审查结果如下」。加了一段 ```json 代码块提取逻辑,不管 AI 怎么包装,都能把 JSON 摘出来。

部署和启动

就两个命令:

# 后端
cd services/ai-reviewer && mvn spring-boot:run

# 前端
cd clients/ai-reviewer && npm run dev

本机跑,不上服务器。代码不传到第三方,API Key 配置在本地 application-dev.yml

效果

贴一段代码举例。这段代码有两处违规:

public class UserService {
    private Date createdAt;  // ❌ 规则56:审计字段必须是 create_time
    private UserRepository userRepository;

    public List<User> getUsers() {
        List<String> list = new ArrayList<>();  // ⚠️ 规则23:ArrayList 未指定容量
        return userRepository.findAll();
    }
}

AI 审查结果:

🔴 ERROR R56 L5  审计字段 create_time 不符合规范
→ 改为: private Date createTime;
🟡 WARNING R23 L12  ArrayList 未指定初始容量
→ 改为: new ArrayList<>(16)

在这里插入图片描述

逐条对照规则,标出行号、规则编号、修复建议。点击问题行,编辑器自动跳转到对应行。


写这篇文章的时候,我顺便审查了一次——发现了一个 controller 里没配 @CrossOrigin 的接口。代码自己审自己,挺妙的。


关于作者:无羡,独立开发者,全栈工程师,专注 AI 应用与微服务架构。

📌 分类:独立开发实战

🔗 个人博客 — 更多技术文章
开发者福利整理 — 云服务资源汇总
📂 软件工坊 — 我的技术分享
🌐 个人门户 — 独立开发作品全集

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐