1. 引言
随着大语言模型(LLM)的飞速发展,OpenAI 旗下的 ChatGPT Plus/Pro 和 Codex 已成为开发者日常工作中不可或缺的生产力工具。ChatGPT Plus/Pro 提供更快的响应速度、优先访问最新模型(如 GPT‑4o、o1‑mini)以及高级数据分析能力;而 Codex 则专注于将自然语言直接转化为高质量代码,能够理解十几种编程语言。
本文将带你从零开始,深入理解 ChatGPT Plus/Pro 与 Codex 的技术内核,并通过大量 Python 代码示例,手把手构建一个智能代码生成助手。我们将覆盖:
- ChatGPT Plus/Pro 的核心 API 能力与最新模型特性;
- Codex 的代码生成原理,以及如何通过 API 在应用中集成;
- 实战:从环境准备到调用 Chat Completions、代码审查、自动生成测试用例;
- 高级技巧:System Prompt 设计、多轮对话、Function Calling 与 Code Interpreter 的结合。
2. 环境准备
在开始编写代码之前,请确保已安装 Python 3.10+,并获取 OpenAI API Key(ChatGPT Plus/Pro 订阅用户均可生成)。推荐使用虚拟环境隔离依赖:
bash
python -m venv venv
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
pip install openai python-dotenv
在项目根目录创建 .env 文件存储密钥:
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
加载环境变量:
python
import os
from dotenv import load_dotenv
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
3. ChatGPT Plus/Pro 模型能力解析
ChatGPT Plus/Pro 提供的 API 访问权限与免费层不同,主要包括:
- GPT‑4o 系列:多模态模型,支持文本、图像输入,推理速度快,价格适中;
- o1‑mini / o1‑preview:强化推理模型,擅长数学、编程和逻辑任务;
- GPT‑4o‑mini:轻量级,适合高并发、低延迟场景;
- 高级参数 :支持
temperature、top_p、max_tokens、stop等精细控制。
Codex 的原始模型(如 code‑davinci‑002)虽然已逐步被 GPT‑4 系列取代,但其代码生成的理念依然被继承在最新的 Chat Completions 接口中。我们可以在 System Prompt 中注入"扮演 Codex 专家"的角色,实现同样强大的代码生成能力。
4. Codex 代码生成原理
Codex 是一个基于 GPT‑3 架构微调的模型,专门针对公开代码仓库(GitHub)进行训练,能够理解自然语言指令并生成对应的代码片段。其核心流程如下:
#mermaid-svg-IeUGD4Mp5rZ8Edim{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IeUGD4Mp5rZ8Edim .error-icon{fill:#552222;}#mermaid-svg-IeUGD4Mp5rZ8Edim .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IeUGD4Mp5rZ8Edim .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .marker.cross{stroke:#333333;}#mermaid-svg-IeUGD4Mp5rZ8Edim svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IeUGD4Mp5rZ8Edim p{margin:0;}#mermaid-svg-IeUGD4Mp5rZ8Edim .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster-label text{fill:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster-label span{color:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster-label span p{background-color:transparent;}#mermaid-svg-IeUGD4Mp5rZ8Edim .label text,#mermaid-svg-IeUGD4Mp5rZ8Edim span{fill:#333;color:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .node rect,#mermaid-svg-IeUGD4Mp5rZ8Edim .node circle,#mermaid-svg-IeUGD4Mp5rZ8Edim .node ellipse,#mermaid-svg-IeUGD4Mp5rZ8Edim .node polygon,#mermaid-svg-IeUGD4Mp5rZ8Edim .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .rough-node .label text,#mermaid-svg-IeUGD4Mp5rZ8Edim .node .label text,#mermaid-svg-IeUGD4Mp5rZ8Edim .image-shape .label,#mermaid-svg-IeUGD4Mp5rZ8Edim .icon-shape .label{text-anchor:middle;}#mermaid-svg-IeUGD4Mp5rZ8Edim .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .rough-node .label,#mermaid-svg-IeUGD4Mp5rZ8Edim .node .label,#mermaid-svg-IeUGD4Mp5rZ8Edim .image-shape .label,#mermaid-svg-IeUGD4Mp5rZ8Edim .icon-shape .label{text-align:center;}#mermaid-svg-IeUGD4Mp5rZ8Edim .node.clickable{cursor:pointer;}#mermaid-svg-IeUGD4Mp5rZ8Edim .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .arrowheadPath{fill:#333333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IeUGD4Mp5rZ8Edim .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IeUGD4Mp5rZ8Edim .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IeUGD4Mp5rZ8Edim .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster text{fill:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim .cluster span{color:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IeUGD4Mp5rZ8Edim .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IeUGD4Mp5rZ8Edim rect.text{fill:none;stroke-width:0;}#mermaid-svg-IeUGD4Mp5rZ8Edim .icon-shape,#mermaid-svg-IeUGD4Mp5rZ8Edim .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IeUGD4Mp5rZ8Edim .icon-shape p,#mermaid-svg-IeUGD4Mp5rZ8Edim .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IeUGD4Mp5rZ8Edim .icon-shape .label rect,#mermaid-svg-IeUGD4Mp5rZ8Edim .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IeUGD4Mp5rZ8Edim .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IeUGD4Mp5rZ8Edim .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IeUGD4Mp5rZ8Edim :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 用户输入自然语言指令
Token化与上下文编码
自回归逐个生成代码Token
后处理(语法校验、格式化)
返回最终代码块
在最新的 API 中,我们通过 Chat Completions 的 messages 数组传递指令,模型会以对话形式返回结果。下面我们将通过实际代码演示如何调用这些能力。
5. API 调用实战
5.1 基础 Chat Completions 调用
python
import openai
client = openai.OpenAI(api_key=openai_api_key)
def generate_code(prompt: str, model: str = "gpt-4o") -> str:
response = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "你是一个资深的 Codex 代码生成专家,请根据用户需求生成高效、可读的代码,并附上简要注释。"},
{"role": "user", "content": prompt}
],
temperature=0.3, # 较低温度使输出更稳定
max_tokens=2048
)
return response.choices[0].message.content
# 测试生成一个快速排序算法
prompt = "用 Python 实现快速排序,要求函数名为 quick_sort,并包含测试用例。"
code_output = generate_code(prompt)
print(code_output)
5.2 流式输出(Streaming)
对于较长的代码生成,流式响应能显著提升交互体验:
python
def generate_code_stream(prompt: str, model: str = "gpt-4o"):
stream = client.chat.completions.create(
model=model,
messages=[
{"role": "system", "content": "你是一个代码生成专家,请逐步生成代码。"},
{"role": "user", "content": prompt}
],
stream=True,
temperature=0.3
)
collected_chunks = []
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
collected_chunks.append(chunk.choices[0].delta.content)
return "".join(collected_chunks)
6. 实战:构建智能代码助手
我们将整合上述能力,实现一个具备以下功能的命令行工具:
- 根据自然语言生成代码;
- 对已有代码进行审查并给出优化建议;
- 自动生成单元测试。
6.1 代码审查
python
def review_code(code: str, language: str = "Python") -> str:
prompt = f"请审查以下 {language} 代码,指出潜在问题、性能瓶颈和风格改进建议,并给出优化后的代码:\n\n```{language}\n{code}\n```"
return generate_code(prompt, model="gpt-4o")
6.2 自动生成测试用例
python
def generate_tests(code: str, language: str = "Python") -> str:
prompt = f"请为以下 {language} 代码生成完整的单元测试(使用 pytest 框架),覆盖边界情况:\n\n```{language}\n{code}\n```"
return generate_code(prompt, model="o1-mini") # o1-mini 在测试生成上更稳定
6.3 完整交互示例
python
if __name__ == "__main__":
# 读取用户代码文件
with open("example.py", "r") as f:
user_code = f.read()
print("=== 代码审查 ===")
review = review_code(user_code)
print(review)
print("\n=== 自动生成测试 ===")
tests = generate_tests(user_code)
print(tests)
7. 高级技巧
7.1 System Prompt 设计
System Prompt 是控制模型行为的关键。以下是一个针对 Codex 风格的高效 Prompt:
你是一个世界级的 Codex 编程专家,熟悉 Python、JavaScript、Go、Rust 等主流语言。生成代码时请遵循以下规则:
1. 代码必须可直接运行,包含必要的 import 语句;
2. 使用类型注解(Type Hints);
3. 添加清晰的 docstring 和注释;
4. 如果涉及算法,解释时间/空间复杂度。
7.2 多轮对话与上下文保持
通过 messages 数组传递历史对话,可以实现连续交互,模拟"结对编程"体验:
python
messages = [
{"role": "system", "content": "Codex 专家..."},
{"role": "user", "content": "写一个 Python 函数,计算斐波那契数列第 n 项。"}
]
response = client.chat.completions.create(model="gpt-4o", messages=messages)
messages.append(response.choices[0].message) # 添加助手回复
messages.append({"role": "user", "content": "请将这个函数改为迭代版本,并添加性能测试。"})
response2 = client.chat.completions.create(model="gpt-4o", messages=messages)
7.3 Function Calling 与 Code Interpreter
ChatGPT Plus/Pro 支持 Function Calling,允许模型调用外部工具执行代码。结合 Codex 的代码生成能力,我们可以实现一个"生成‑执行‑反馈"的闭环:
python
tools = [
{
"type": "function",
"function": {
"name": "execute_python",
"description": "在沙箱中执行 Python 代码并返回结果",
"parameters": {
"type": "object",
"properties": {
"code": {"type": "string", "description": "要执行的 Python 代码"}
},
"required": ["code"]
}
}
}
]
response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "计算 1 到 100 的累加和,并打印结果。"}],
tools=tools,
tool_choice="auto"
)
# 解析 function_call,执行代码,再将结果返回模型
8. 性能优化与成本控制
虽然 ChatGPT Plus/Pro 提供了慷慨的速率限制,但在大规模应用中仍需注意:
- 使用更小模型处理简单任务 :如
gpt-4o-mini进行代码格式化、注释生成,成本仅为gpt-4o的 1/15; - 缓存重复请求:对相同 Prompt 的结果进行缓存,避免重复调用;
- 批量处理:将多个独立的代码审查请求合并为一次 API 调用,减少网络开销。
9. 总结
本文从技术原理到实战代码,全面展示了如何利用 ChatGPT Plus/Pro 和 Codex 能力构建智能代码助手。通过灵活运用 System Prompt、多轮对话和 Function Calling,我们可以将 AI 深度集成到开发工作流中,大幅提升编码效率。
未来,随着 o1 系列推理模型的持续进化,代码生成将更加精准,甚至能够自主完成复杂的项目架构设计。作为开发者,掌握这些工具将成为必备技能。
10. 参考资料
- OpenAI 官方文档:https://platform.openai.com/docs
- OpenAI Cookbook:https://github.com/openai/openai-cookbook
- Codex 原始论文:https://arxiv.org/abs/2107.03374