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 安装与登录

  1. 安装 VS Code 最新版(1.90+)。
  2. 在扩展市场搜索并安装 Codex 官方扩展。
  3. 打开扩展设置,登录你的 OpenAI 账号(需为 Plus 或 Pro 订阅)。
  4. 确认 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')dataNone 时会抛异常,缺少对非法 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 会逐步执行:

  1. 读取当前 app.py 内容。
  2. 创建目录结构。
  3. 逐个生成新文件。
  4. 修改 app.py
  5. 运行语法检查。

最终生成的文件大致如下:

# 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. 完整工作流总结

把上面的过程提炼成一套可复用的工作流:

准备代码与项目

ChatGPT 代码审查

ChatGPT 输出重构方案

Codex 执行重构

Codex 运行验证

测试通过?

Codex 生成单元测试

运行 pytest

完成

7.1 分工原则

  • ChatGPT 负责:审查、方案设计、解释复杂逻辑、权衡取舍。
  • Codex 负责:创建文件、批量修改、运行命令、跑测试、修语法错误。

7.2 关键技巧

  1. Prompt 要具体:给 ChatGPT 的审查维度越明确,输出越有价值。
  2. 方案先行:先让 ChatGPT 出方案,再让 Codex 执行,避免 Codex 盲目乱改。
  3. 保持接口兼容:重构时明确要求「返回码和字段名不变」,降低回归风险。
  4. 测试兜底:重构后立即补测试,用 pytest 验证行为没有变化。

8. 注意事项与避坑指南

8.1 安全边界

  • 不要上传敏感代码:包含密钥、内部 IP、客户数据的代码,不要直接粘贴给 ChatGPT。
  • 审查 Codex 的改动:AI 生成的代码也要人工 review,尤其是涉及权限、支付、数据删除的逻辑。
  • 密码哈希务必用成熟库:不要自己写哈希算法,用 werkzeug.securitybcryptargon2

8.2 常见坑

  1. Codex 改过头:有时 Codex 会「顺手」重构你没要求改的代码。建议在指令中明确「只修改我指定的文件」。
  2. ChatGPT 建议过时:AI 的知识有截止日期,涉及框架新特性时,以官方文档为准。
  3. 正则性能:把正则表达式预编译为模块级常量,避免每次请求重新编译。
  4. 全局状态:内存字典存储只适合演示,生产环境务必换数据库。

8.3 版本管理

在让 Codex 动手前,先提交一次 Git:

git init
git add .
git commit -m "before refactor"

这样如果重构出问题,可以随时回滚。

9. 结语

ChatGPT Plus / Pro + Codex 的组合,不是简单的「两个 AI 工具叠加」,而是一套「思考 + 执行」的协作范式。ChatGPT 帮你把问题想清楚,Codex 帮你把方案落地,两者配合能显著提升代码审查和重构的效率。

这套工作流的核心不是工具本身,而是流程设计:审查 → 方案 → 执行 → 验证 → 测试。把这五个环节固化下来,无论未来工具怎么升级,你都能快速适应。

希望这篇文章能给你带来启发。如果你有更好的实践,欢迎在评论区交流。

Logo

AtomGit AI 社区提供模型库、数据集、Agent、Token等资源

更多推荐