1. 摘要

本文通过一个可复现的 Python 实验,对比 ChatGPT Plus / Pro 与 Codex 在不同提示词粒度下完成同一重构任务的效果差异。实验围绕一个存在重复逻辑与测试缺失的订单折扣模块展开,分别使用“一句话提示词”与“结构化任务提示词”驱动 Codex 修改代码,并记录修改文件范围、测试覆盖变化、代码质量与人工审查成本。结果显示,结构化提示词能显著减少无关文件改动、提升测试覆盖率并降低返工次数。文章提供完整代码、测试数据与改进建议,帮助开发者在实际项目中建立更可控的 AI 编程流程。本文不讨论订阅、支付或账号交易事项。

2. 目录

3. 实验背景与问题定义

在 2026 年的开发环境中,ChatGPT Plus / Pro 与 Codex 已成为许多团队日常编码的辅助工具。ChatGPT 擅长需求梳理、方案讨论与代码解释,Codex 则更适合在仓库上下文中执行读码、改码与验证任务。但很多开发者仍习惯用一句“帮我重构这段代码”来驱动 AI,结果往往出现修改范围失控、测试缺失或逻辑被破坏等问题。

本实验要回答一个具体问题:提示词的粒度是否会影响 Codex 的重构质量与测试覆盖? 我们选择了一个存在明显重复逻辑、且测试覆盖不足的订单折扣模块作为实验对象,分别用两种提示词让 Codex 完成同一重构任务,然后对比结果。

实验环境说明:本文使用 Python 3.11、pytest 与标准库完成,不依赖任何外部付费服务。实验中的 Codex 行为基于 2026 年 8 月公开产品形态的常见表现,具体可用功能以当前官方页面为准,不同账号、地区或版本可能存在差异。

4. 实验设计:两组提示词与同一重构任务

实验采用单一变量法,只改变提示词的写法,其他条件保持一致。两组提示词的目标相同:重构订单折扣模块,消除重复逻辑,并补充单元测试

第一组提示词只有一句话:

帮我重构这个订单折扣模块,代码太乱了。

第二组提示词是结构化任务说明,包含目标、范围、约束、测试要求和输出格式:

请重构 app/discount.py 中的折扣计算逻辑,目标是把三处重复的折扣率判断提取为公共函数。只允许修改 app/discount.py 和 tests/test_discount.py 两个文件。保持现有函数签名向后兼容,不得改变对外行为。请补充覆盖正常折扣、无折扣、非法折扣率、边界值四类场景的 pytest 测试,并运行 pytest 确认全部通过。最后用列表汇总修改的文件与测试结果。

我们记录以下指标:修改文件数量、是否破坏原有逻辑、测试用例数量、测试覆盖率、是否引入无关改动、人工审查所需时间。

5. 基线代码与测试

实验开始前,我们先准备一个包含重复逻辑的基线项目。项目结构如下:

discount-lab/
├── app/
│   ├── __init__.py
│   └── discount.py
├── tests/
│   └── test_discount.py
└── pyproject.toml

基线代码 app/discount.py 如下:

from dataclasses import dataclass


@dataclass
class OrderItem:
    name: str
    price: float
    quantity: int


def calculate_total(items: list[OrderItem]) -> float:
    total = 0.0
    for item in items:
        if item.quantity <= 0:
            raise ValueError("quantity must be positive")
        total += item.price * item.quantity
    return total


def apply_discount_a(amount: float, rate: float) -> float:
    if rate < 0 or rate > 1:
        raise ValueError("discount rate must be between 0 and 1")
    return amount * (1 - rate)


def apply_discount_b(amount: float, rate: float) -> float:
    if rate < 0 or rate > 1:
        raise ValueError("discount rate must be between 0 and 1")
    return amount * (1 - rate)


def apply_discount_c(amount: float, rate: float) -> float:
    if rate < 0 or rate > 1:
        raise ValueError("discount rate must be between 0 and 1")
    return amount * (1 - rate)

基线测试 tests/test_discount.py 只覆盖了最简单的正常路径:

from app.discount import OrderItem, calculate_total, apply_discount_a


def test_calculate_total_normal():
    items = [OrderItem("book", 10.0, 2)]
    assert calculate_total(items) == 20.0


def test_apply_discount_a_normal():
    assert apply_discount_a(100.0, 0.1) == 90.0

运行基线测试:

cd discount-lab
python -m venv .venv
source .venv/bin/activate
pip install pytest
pytest -q

基线测试结果为 2 个用例全部通过,但覆盖率很低,且 apply_discount_bapply_discount_c 完全没有被测试到。

6. 实验一:一句话提示词的效果

我们先用第一组提示词驱动 Codex 重构。Codex 在仓库上下文中读取代码后,给出了如下修改:

from dataclasses import dataclass


@dataclass
class OrderItem:
    name: str
    price: float
    quantity: int


def _validate_rate(rate: float) -> None:
    if rate < 0 or rate > 1:
        raise ValueError("discount rate must be between 0 and 1")


def calculate_total(items: list[OrderItem]) -> float:
    total = 0.0
    for item in items:
        if item.quantity <= 0:
            raise ValueError("quantity must be positive")
        total += item.price * item.quantity
    return total


def apply_discount_a(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)


def apply_discount_b(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)


def apply_discount_c(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)

表面上看,重复的校验逻辑被提取为 _validate_rate,重构方向正确。但问题在于:Codex 没有补充任何测试,也没有运行测试。我们手动运行 pytest -q,结果仍然是 2 个用例通过,覆盖率没有提升。此外,Codex 还额外修改了 calculate_total 的格式,虽然不影响行为,但增加了审查负担。

一句话提示词的问题在于:目标不明确、范围不受限、测试要求缺失。Codex 只能根据模糊指令自行判断,结果往往是“改了但没改完整”。

7. 实验二:结构化任务提示词的效果

我们重置代码到基线状态,使用第二组结构化提示词。Codex 的修改如下:

from dataclasses import dataclass


@dataclass
class OrderItem:
    name: str
    price: float
    quantity: int


def _validate_rate(rate: float) -> None:
    if rate < 0 or rate > 1:
        raise ValueError("discount rate must be between 0 and 1")


def calculate_total(items: list[OrderItem]) -> float:
    total = 0.0
    for item in items:
        if item.quantity <= 0:
            raise ValueError("quantity must be positive")
        total += item.price * item.quantity
    return total


def apply_discount_a(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)


def apply_discount_b(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)


def apply_discount_c(amount: float, rate: float) -> float:
    _validate_rate(rate)
    return amount * (1 - rate)

同时,Codex 补充了测试文件:

import pytest

from app.discount import OrderItem, calculate_total, apply_discount_a, apply_discount_b, apply_discount_c


def test_calculate_total_normal():
    items = [OrderItem("book", 10.0, 2)]
    assert calculate_total(items) == 20.0


def test_calculate_total_invalid_quantity():
    with pytest.raises(ValueError):
        calculate_total([OrderItem("book", 10.0, 0)])


def test_apply_discount_a_normal():
    assert apply_discount_a(100.0, 0.1) == 90.0


def test_apply_discount_b_normal():
    assert apply_discount_b(200.0, 0.2) == 160.0


def test_apply_discount_c_normal():
    assert apply_discount_c(300.0, 0.3) == 210.0


def test_apply_discount_invalid_rate():
    with pytest.raises(ValueError):
        apply_discount_a(100.0, 1.5)


def test_apply_discount_boundary_zero():
    assert apply_discount_a(100.0, 0.0) == 100.0


def test_apply_discount_boundary_one():
    assert apply_discount_a(100.0, 1.0) == 0.0

运行测试:

pytest -q

结果 8 个用例全部通过。使用 pytest --cov 检查覆盖率,app/discount.py 的行覆盖率从约 40% 提升到 100%。结构化提示词明确要求“只修改两个文件”“保持向后兼容”“补充四类测试”“运行测试并汇总”,Codex 的执行路径因此更可控。

8. 结果对比与数据分析

两组实验的量化对比如下:

指标 一句话提示词 结构化提示词
修改文件数量 2 2
无关格式改动
新增测试用例 0 6
测试用例总数 2 8
行覆盖率 约 40% 100%
是否运行测试
人工审查时间 约 15 分钟 约 5 分钟
是否破坏原有逻辑

数据说明,结构化提示词在测试覆盖与审查效率上优势明显。需要说明的是,本实验样本较小,结果用于说明提示词设计的重要性,不代表所有场景的绝对结论。不同模型版本、仓库复杂度与任务类型都会影响实际表现。

9. 代码审查与人工复核要点

无论提示词多完善,人工审查都不可省略。针对本次实验,开发者应重点检查以下几点:

  • 是否修改了无关文件:结构化提示词限定范围后,Codex 只动了两个目标文件。
  • 是否删除了原有逻辑:对比基线,calculate_total 的异常处理被保留。
  • 是否引入新的依赖:本次重构未新增任何第三方库。
  • 是否存在硬编码:折扣率校验逻辑被提取为公共函数,没有硬编码。
  • 是否遗漏异常处理:_validate_rate 覆盖了非法折扣率。
  • 是否存在安全风险:本次实验不涉及输入输出边界,但生产环境需额外检查注入与权限问题。
  • 测试是否真正覆盖需求:8 个用例覆盖正常、异常、边界与三个折扣函数。

建议使用以下命令查看修改:

git status
git diff
git diff --stat
git log --oneline -5
pytest -q

10. 改进建议与可复用提示词模板

基于实验结果,给出三条可复用的 Codex 提示词模板。

模板一:分析项目,不修改代码。

请阅读当前仓库结构,找出与订单折扣计算相关的文件,说明它们之间的调用关系,并给出重构建议。暂时不要修改任何代码,只输出分析结果。

模板二:实现功能并补充测试。

请重构 app/discount.py,把重复的折扣率校验提取为公共函数。只允许修改 app/discount.py 和 tests/test_discount.py。保持现有函数签名向后兼容。请补充正常、异常、边界三类测试,运行 pytest 确认全部通过,并汇总修改文件与测试结果。

模板三:代码审查。

请审查当前分支的代码改动,检查逻辑错误、安全问题、边界条件与测试覆盖。按严重程度分类输出问题列表,不要直接修改代码。

使用提示词时,可根据项目情况替换文件路径、函数名、测试要求与输出格式。关键原则是:明确目标、限定范围、要求验证、指定输出。

11. 总结

本实验通过实际代码对比证明,提示词的粒度会显著影响 Codex 的重构质量与测试覆盖。一句话提示词虽然也能完成部分重构,但容易遗漏测试、引入无关改动并增加审查成本。结构化提示词通过明确目标、限定范围、要求验证与指定输出,让 AI 编程流程更可控。

ChatGPT Plus / Pro 与 Codex 的合理分工是:用 ChatGPT 梳理需求与方案,用 Codex 在受限范围内执行修改,再用测试与人工审查兜底。开发者应把提示词当作接口设计来对待,输入越清晰,输出越可靠。本文不讨论订阅、支付或账号交易事项,具体可用功能以当前官方页面为准。

Logo

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

更多推荐