ChatGPT Plus / Pro + Codex 实战:AI 辅助代码审查与重构的完整工作流(2026-08-28)
1. 引言
2026 年的今天,AI 编程助手已经从「能补全几行代码」进化到「深度参与软件工程全流程」。在众多工具中,ChatGPT Plus / Pro 与 Codex 的组合,正在成为许多程序员日常开发中不可或缺的搭档。
本文不讨论「AI 会不会取代程序员」这种空泛话题,而是聚焦一个非常具体的实战场景:如何用 ChatGPT Plus / Pro + Codex 完成一次高质量的代码审查与重构。我会从环境准备、审查流程、重构实战、测试验证到注意事项,完整走一遍可复用的工作流。
无论你是刚接触 AI 编程的新手,还是已经在用 Copilot 的老手,这篇文章都会给你一套可以直接照搬的实践方法。全文约 3500 字,包含真实案例、可运行代码和详细步骤。
2. 为什么选择 ChatGPT Plus / Pro + Codex
在开始之前,先明确一个关键问题:为什么是 ChatGPT Plus / Pro + Codex,而不是其他组合?
2.1 两者的定位差异
- ChatGPT Plus / Pro:通用对话与推理引擎,擅长理解上下文、拆解复杂问题、生成结构化方案。它适合做「思考型」工作,比如分析代码逻辑、设计重构方案、解释业务需求。
- Codex:OpenAI 的编程智能体,深度集成在 IDE 和终端中,能够直接读写代码文件、执行命令、运行测试。它适合做「执行型」工作,比如批量修改、跨文件重构、跑测试验证。
2.2 组合优势
单独使用任何一个都有短板:
- 只用 ChatGPT:能给出很好的建议,但你需要手动把建议落到代码里,效率打折。
- 只用 Codex:能快速改代码,但遇到复杂架构决策时,缺乏全局思考。
两者结合后,工作流变成:ChatGPT 负责「想清楚」,Codex 负责「做出来」。这正是本文要演示的核心方法论。
3. 环境准备
在开始实战前,先把环境搭好。以下步骤以 macOS + VS Code 为例,Windows / Linux 操作类似。
3.1 安装与登录
- 安装 VS Code 最新版(1.90+)。
- 在扩展市场搜索并安装 Codex 官方扩展。
- 打开扩展设置,登录你的 OpenAI 账号(需为 Plus 或 Pro 订阅)。
- 确认 Codex 面板可以正常访问你的工作区文件。
3.2 准备示例项目
为了演示,我准备了一个简单的 Python 项目:一个用户注册接口,包含密码校验和邮箱格式校验。这个项目故意写得比较「粗糙」,方便展示审查和重构的效果。
# app.py
import re
from flask import Flask, request, jsonify
app = Flask(__name__)
users = {}
@app.route('/register', methods=['POST'])
def register():
data = request.get_json()
username = data.get('username')
password = data.get('password')
email = data.get('email')
if not username or not password or not email:
return jsonify({'error': 'missing fields'}), 400
if len(password) < 8:
return jsonify({'error': 'password too short'}), 400
if not re.match(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$', email):
return jsonify({'error': 'invalid email'}), 400
if username in users:
return jsonify({'error': 'username exists'}), 409
users[username] = {'password': password, 'email': email}
return jsonify({'message': 'ok'}), 201
if __name__ == '__main__':
app.run(debug=True)
把这段代码保存为 app.py,放在一个空目录里,用 VS Code 打开该目录。
4. 用 ChatGPT 做代码审查
代码审查是重构的前提。先让 ChatGPT 从「资深 Reviewer」的视角审视这段代码。
4.1 设计审查 Prompt
在 ChatGPT Plus / Pro 中,新建对话并输入以下 Prompt:
你是一位资深 Python 后端工程师,请审查下面这段 Flask 注册接口代码。
请从以下维度给出意见:
1. 安全性(密码存储、注入、暴力破解等)
2. 代码结构(职责划分、可读性、可维护性)
3. 健壮性(异常处理、边界条件)
4. 性能(不必要的计算、数据库设计)
5. 测试性(是否容易写单元测试)
对每个问题,请给出:问题描述、严重程度(高/中/低)、修改建议。
最后给出一个整体评分(满分 10 分)。
代码:
[粘贴 app.py 全文]
4.2 ChatGPT 的审查结果
ChatGPT 会给出类似下面的分析(实际输出可能更详细):
安全问题(高):
- 密码以明文存储,严重安全隐患,应使用 bcrypt 或 argon2 哈希。
- 没有登录限流,存在暴力破解风险。
代码结构(中):
- 所有逻辑堆在路由函数里,应拆分为 service 层和 repository 层。
- 校验逻辑与业务逻辑耦合,应抽成独立模块。
健壮性(中):
data.get('username')在data为None时会抛异常,缺少对非法 JSON 的处理。- 邮箱正则过于宽松,且未处理 Unicode 邮箱。
性能(低):
- 使用全局字典存储用户,重启即丢失,应使用数据库。
- 每次请求都编译正则,应预编译。
测试性(中):
- 路由函数直接操作全局状态,难以编写隔离的单元测试。
整体评分:4/10
4.3 提炼重构方案
拿到审查结果后,让 ChatGPT 输出一份重构方案:
基于你的审查结果,请给出一个重构方案。要求:
1. 保持 Flask 框架不变
2. 拆分为合理的模块结构
3. 引入密码哈希(使用 werkzeug.security)
4. 增加输入校验模块
5. 保持接口行为兼容(返回码和字段名不变)
6. 给出每个文件的职责说明
ChatGPT 会给出类似这样的方案:
项目结构:
├── app.py # 应用入口与路由
├── services/
│ ├── __init__.py
│ └── user_service.py # 业务逻辑
├── validators/
│ ├── __init__.py
│ └── user_validator.py # 输入校验
└── storage/
├── __init__.py
└── user_store.py # 数据存储抽象
到这里,「想清楚」的阶段完成。接下来进入「做出来」的阶段——用 Codex 执行重构。
5. 用 Codex 执行重构
5.1 在 Codex 中描述任务
打开 VS Code 的 Codex 面板,输入以下指令:
请按照以下方案重构当前项目:
1. 创建 services/user_service.py,包含注册业务逻辑
2. 创建 validators/user_validator.py,包含用户名、密码、邮箱校验
3. 创建 storage/user_store.py,用内存字典存储用户,但抽象出接口
4. 修改 app.py,只保留路由和 HTTP 层逻辑
5. 密码使用 werkzeug.security 的 generate_password_hash 存储
6. 保持 /register 接口的返回码和字段名不变
7. 处理 request.get_json() 为 None 的情况,返回 400
5.2 Codex 的执行过程
Codex 会逐步执行:
- 读取当前
app.py内容。 - 创建目录结构。
- 逐个生成新文件。
- 修改
app.py。 - 运行语法检查。
最终生成的文件大致如下:
# validators/user_validator.py
import re
EMAIL_RE = re.compile(r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$')
def validate_username(username):
if not username or len(username) < 3:
raise ValueError('username must be at least 3 characters')
def validate_password(password):
if not password or len(password) < 8:
raise ValueError('password must be at least 8 characters')
def validate_email(email):
if not email or not EMAIL_RE.match(email):
raise ValueError('invalid email format')
# storage/user_store.py
class UserStore:
def __init__(self):
self._users = {}
def exists(self, username):
return username in self._users
def add(self, username, password_hash, email):
self._users[username] = {
'password_hash': password_hash,
'email': email
}
# services/user_service.py
from werkzeug.security import generate_password_hash
from validators.user_validator import validate_username, validate_password, validate_email
from storage.user_store import UserStore
class UserService:
def __init__(self, store):
self.store = store
def register(self, username, password, email):
validate_username(username)
validate_password(password)
validate_email(email)
if self.store.exists(username):
raise ValueError('username exists')
password_hash = generate_password_hash(password)
self.store.add(username, password_hash, email)
# app.py
from flask import Flask, request, jsonify
from services.user_service import UserService
from storage.user_store import UserStore
app = Flask(__name__)
user_service = UserService(UserStore())
@app.route('/register', methods=['POST'])
def register():
data = request.get_json()
if data is None:
return jsonify({'error': 'invalid JSON'}), 400
username = data.get('username')
password = data.get('password')
email = data.get('email')
try:
user_service.register(username, password, email)
except ValueError as e:
if str(e) == 'username exists':
return jsonify({'error': str(e)}), 409
return jsonify({'error': str(e)}), 400
return jsonify({'message': 'ok'}), 201
if __name__ == '__main__':
app.run(debug=True)
5.3 验证重构结果
重构完成后,让 Codex 运行测试验证:
请运行 python -m py_compile 检查所有 .py 文件语法,然后启动 Flask 应用,
用 curl 测试以下场景:
1. 正常注册,期望 201
2. 缺少字段,期望 400
3. 密码过短,期望 400
4. 邮箱格式错误,期望 400
5. 重复用户名,期望 409
6. 非法 JSON,期望 400
Codex 会执行命令并返回结果。如果某个测试失败,它会自动定位并修复。
6. 补充测试用例
重构之后,代码结构清晰了,但还缺少自动化测试。让 Codex 生成 pytest 测试:
请为当前项目编写 pytest 单元测试,覆盖:
1. UserService.register 的成功与失败路径
2. UserStore 的基本操作
3. validators 的边界情况(空值、超长、特殊字符)
4. 使用 pytest fixture 隔离测试数据
Codex 会生成类似下面的测试文件:
# test_user_service.py
import pytest
from services.user_service import UserService
from storage.user_store import UserStore
@pytest.fixture
def service():
return UserService(UserStore())
def test_register_success(service):
service.register('alice', 'password123', 'alice@example.com')
def test_register_duplicate_username(service):
service.register('alice', 'password123', 'alice@example.com')
with pytest.raises(ValueError):
service.register('alice', 'password456', 'alice2@example.com')
def test_register_short_password(service):
with pytest.raises(ValueError):
service.register('bob', 'short', 'bob@example.com')
def test_register_invalid_email(service):
with pytest.raises(ValueError):
service.register('carol', 'password123', 'not-an-email')
然后运行:
请运行 pytest -v,如果失败请修复。
7. 完整工作流总结
把上面的过程提炼成一套可复用的工作流:
7.1 分工原则
- ChatGPT 负责:审查、方案设计、解释复杂逻辑、权衡取舍。
- Codex 负责:创建文件、批量修改、运行命令、跑测试、修语法错误。
7.2 关键技巧
- Prompt 要具体:给 ChatGPT 的审查维度越明确,输出越有价值。
- 方案先行:先让 ChatGPT 出方案,再让 Codex 执行,避免 Codex 盲目乱改。
- 保持接口兼容:重构时明确要求「返回码和字段名不变」,降低回归风险。
- 测试兜底:重构后立即补测试,用 pytest 验证行为没有变化。
8. 注意事项与避坑指南
8.1 安全边界
- 不要上传敏感代码:包含密钥、内部 IP、客户数据的代码,不要直接粘贴给 ChatGPT。
- 审查 Codex 的改动:AI 生成的代码也要人工 review,尤其是涉及权限、支付、数据删除的逻辑。
- 密码哈希务必用成熟库:不要自己写哈希算法,用
werkzeug.security、bcrypt或argon2。
8.2 常见坑
- Codex 改过头:有时 Codex 会「顺手」重构你没要求改的代码。建议在指令中明确「只修改我指定的文件」。
- ChatGPT 建议过时:AI 的知识有截止日期,涉及框架新特性时,以官方文档为准。
- 正则性能:把正则表达式预编译为模块级常量,避免每次请求重新编译。
- 全局状态:内存字典存储只适合演示,生产环境务必换数据库。
8.3 版本管理
在让 Codex 动手前,先提交一次 Git:
git init
git add .
git commit -m "before refactor"
这样如果重构出问题,可以随时回滚。
9. 结语
ChatGPT Plus / Pro + Codex 的组合,不是简单的「两个 AI 工具叠加」,而是一套「思考 + 执行」的协作范式。ChatGPT 帮你把问题想清楚,Codex 帮你把方案落地,两者配合能显著提升代码审查和重构的效率。
这套工作流的核心不是工具本身,而是流程设计:审查 → 方案 → 执行 → 验证 → 测试。把这五个环节固化下来,无论未来工具怎么升级,你都能快速适应。
希望这篇文章能给你带来启发。如果你有更好的实践,欢迎在评论区交流。
更多推荐



所有评论(0)