用 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,过滤掉 .git、node_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-4o 和 claude-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 服务)做专项版本,我可以继续写。
觉得有用的话点个赞,让更多人少踩坑。