技术教程 · 阅读约 8 分钟

用 30 行 Python 让 AI 帮你审完整个代码仓库(附完整可运行代码)

用 30 行 Python 让 AI 帮你审完整个代码仓库(附完整可运行代码)


很多人用 AI 审代码的姿势是:打开对话框,粘一段函数进去,问"有没有问题?"

这种方式有个致命缺陷——AI 看不到上下文。它不知道这个函数被哪里调用,不知道你的数据流,不知道你的安全边界在哪里。审出来的建议往往是废话。

真正有价值的 Code Review,应该让模型一次性看到整个 repo 的结构,然后针对性地提问。这篇文章就教你怎么做到这一点,核心代码不到 50 行。


思路:把 repo 打包成结构化文本喂给模型

大模型的上下文窗口现在很大(Claude 3.5 Sonnet 200k token,Gemini 1.5 Pro 100万 token),完全撑得住中小型项目的完整代码。

策略很简单:

1. 递归遍历 repo,过滤掉 .gitnode_modules、二进制文件

2. 把所有源码拼成一个带文件路径标注的长字符串

3. 用系统提示告诉模型它是一个资深 reviewer

4. 让它输出结构化的审查报告


完整代码


import os

import sys

from pathlib import Path

from openai import OpenAI



# ---- 配置 ----

BASE_URL = "https://api2everything.xyz/v1"

API_KEY  = "your-api-key-here"          # 替换成你的 key

MODEL    = "claude-sonnet-4-5"          # 或换成 gpt-4o、gemini-1.5-pro 等



# 不想被扫描的目录/文件后缀

IGNORE_DIRS = {".git", "node_modules", "__pycache__", ".venv", "dist", "build"}

IGNORE_EXTS = {".png", ".jpg", ".jpeg", ".gif", ".ico", ".svg",

               ".woff", ".ttf", ".eot", ".lock", ".min.js"}

MAX_FILE_BYTES = 50_000   # 单文件超过 50KB 就截断,避免塞爆上下文



client = OpenAI(api_key=API_KEY, base_url=BASE_URL)





def collect_repo(root: str) -> str:

    """遍历 repo,把所有源码拼成带路径注释的大字符串"""

    chunks = []

    root_path = Path(root).resolve()



    for path in sorted(root_path.rglob("*")):

        # 跳过被忽略的目录

        if any(part in IGNORE_DIRS for part in path.parts):

            continue

        if not path.is_file():

            continue

        if path.suffix.lower() in IGNORE_EXTS:

            continue



        try:

            content = path.read_text(encoding="utf-8", errors="ignore")

        except Exception:

            continue



        if not content.strip():

            continue



        # 截断超大文件

        if len(content.encode()) > MAX_FILE_BYTES:

            content = content[:MAX_FILE_BYTES] + "\n... [文件过大,已截断]"



        rel_path = path.relative_to(root_path)

        chunks.append(f"\n\n### 文件: {rel_path}\n```\n{content}\n```")



    return "\n".join(chunks)





def review_repo(repo_path: str, focus: str = "") -> str:

    """调用模型做 Code Review"""

    print(f"正在收集 repo: {repo_path}")

    code_dump = collect_repo(repo_path)

    token_est  = len(code_dump) // 4

    print(f"收集完成,估计 {token_est:,} tokens")



    system_prompt = """你是一名拥有 10 年经验的后端架构师,擅长安全审计和代码质量评审。

请对用户提供的代码仓库进行全面审查,输出格式如下:



## 总体评价

(1-2句话概括整体代码质量)



## 🔴 严重问题(需立即修复)

(安全漏洞、数据丢失风险等,列出文件路径和行号)



## 🟡 中等问题(建议修复)

(性能瓶颈、错误处理缺失、代码异味等)



## 🟢 改进建议(可选优化)

(架构建议、可读性改进等)



## 亮点

(值得保留的好实践)



每个问题都要给出:文件路径 + 问题描述 + 修复建议(附代码片段)。"""



    user_content = f"请审查以下代码仓库:\n{code_dump}"

    if focus:

        user_content += f"\n\n**重点关注**:{focus}"



    print("正在请求模型审查,请稍候...")

    response = client.chat.completions.create(

        model=MODEL,

        messages=[

            {"role": "system", "content": system_prompt},

            {"role": "user",   "content": user_content},

        ],

        max_tokens=4096,

        temperature=0.2,   # 审查任务要稳定,温度调低

    )



    return response.choices[0].message.content





if __name__ == "__main__":

    repo  = sys.argv[1] if len(sys.argv) > 1 else "."

    focus = sys.argv[2] if len(sys.argv) > 2 else ""



    report = review_repo(repo, focus)

    print("\n" + "="*60)

    print(report)



    # 保存报告

    out_file = Path(repo) / "ai_review_report.md"

    out_file.write_text(report, encoding="utf-8")

    print(f"\n报告已保存至: {out_file}")


用法


# 安装依赖

pip install openai



# 审查当前目录

python repo_review.py .



# 审查指定目录,并聚焦安全问题

python repo_review.py /path/to/your/project "SQL注入和身份验证逻辑"

跑完会在项目根目录生成一个 ai_review_report.md,直接可以作为 PR 描述的附件。


几个让审查质量更高的技巧

换模型测试不同角度

MODEL 改成 gpt-4oclaude-sonnet-4-5 各跑一次,两个模型的侧重不同:GPT-4o 更擅长发现逻辑 bug,Claude 在代码可读性和架构建议上更细致。

focus 参数定向审查

安全审计用 "OWASP Top 10",性能优化用 "数据库查询和缓存策略",迁移前用 "Python 2/3 兼容性问题"。

大 repo 拆分处理

如果项目超过 20 万 token,可以按模块分批跑,最后让模型汇总各模块报告:


# 只扫 src/ 目录

report = review_repo("./src", focus="核心业务逻辑")


关于 API 费用

跑一次中型项目(约 5 万行代码)大概消耗 10-15 万 token,用官方 Claude API 差不多要 ¥3-5。

我自己用的是 无量Api,同样的 Claude/GPT-4o/Gemini,价格比官方便宜 60% 以上,SVIP 打 7.7 折,而且国内直连不需要挂代理。改一行 base_url 就能切换,代码里已经是无量的地址了,注册还送 ¥1 余额,拿来跑几次审查完全够。


这个脚本在我们团队的 CI 流程里已经跑了两个月,平均每个 PR 多捕获 2-3 个人眼容易漏掉的问题,最典型的一次是发现了一个藏在工具函数里的 JWT secret 硬编码——那东西在 repo 里躺了大半年。

有什么问题欢迎评论区聊,或者告诉我你想针对哪类项目(FastAPI / Next.js / Go 服务)做专项版本,我可以继续写。

觉得有用的话点个赞,让更多人少踩坑。