十分钟理解 Codex:从 Prompt 到可运行代码的魔法

目标:不搞数学公式,不用 PyTorch 代码,用人话讲清楚 Codex 怎么把一句话变成可运行程序。


第一分钟:Codex 是什么?一句话定位

Codex = 只读过代码的 GPT

GPT-4 Codex
读过什么 互联网所有文本 GitHub 公开仓库 + Stack Overflow
擅长什么 聊天、写作、推理、通才 写代码、改 Bug、工程化
输出特点 可能跑不通 大概率能编译

核心能力:你描述需求,它生成可执行的代码。


第二分钟:Token —— AI 理解代码的最小单位

什么是 Token?

不是字符,不是单词,是语义片段

# 人类看到的
def calculate_sum(a, b):
    return a + b

# Codex 看到的(示意)
["def", " calculate", "_sum", "(", "a", ", ", "b", "):", "\n    ", "return", " a", " + ", "b"]

代码专用 Token 优化

Codex 对代码做了特殊切分:

场景 普通 Tokenizer Codex Tokenizer
function_name ["function", "_", "name"] ["function_name"](保留完整标识符)
缩进(4空格) [" ", " ", " ", " "] [" "](保留结构信息)
=> ["=", ">"] ["=>"](箭头函数整体识别)
换行符 普通空白 保留缩进层级信息

关键洞察:Codex 的 Token 保留了代码的结构特征(缩进、括号配对、语法块),所以更懂代码逻辑。


第三分钟:上下文窗口 —— AI 的"工作记忆"

概念

Codex 一次能"看"多少 Token。早期 4K,新版 128K+。

[系统提示] + [文件1内容] + [文件2内容] + [当前光标位置] + [待生成区域]
   ↓           ↓              ↓               ↓              ↓
  约100      2000 Token     3000 Token       500 Token      预留 4000
  Token

实战影响

场景 4K 窗口 128K 窗口
补全单行代码 ✅ 轻松 ✅ 轻松
生成一个函数 ✅ 可以 ✅ 轻松
理解整个类文件 ⚠️ 刚好 ✅ 轻松
重构整个项目 ❌ 不可能 ✅ 可以

Cursor 等工具的技巧:自动选择最相关的文件塞进上下文,而不是把整个项目扔进去。


第四分钟:Prompt 工程 —— 怎么跟 Codex 说话

核心原则:给上下文,不是给指令

❌ 差 Prompt

写一个登录功能

✅ 好 Prompt

# 当前文件:auth.py
# 已有代码:
from flask import Flask, request
app = Flask(__name__)

# 需求:实现 /login 接口,验证用户名密码,返回 JWT token
# 数据库表:users(id, username, password_hash)
# 使用:PyJWT 库,密码用 bcrypt 验证

@app.route('/login', methods=['POST'])
def login():
    # [Codex 从这里开始生成]

Codex 专属 Prompt 技巧

技巧 示例 效果
代码注释当需求 # 实现二分查找,处理边界情况 生成带边界处理的代码
类型提示引导 def process(data: list[dict]) -> pd.DataFrame: 自动 import pandas,处理 DataFrame 逻辑
示例驱动 // 输入:[1,2,3], 输出:6 生成符合输入输出格式的代码
错误示范 // 注意:不要用递归,防止栈溢出 主动避开特定实现方式
文件路径暗示 // utils/date_helper.js 自动使用 Node.js 日期库

第五分钟:代码生成逻辑 —— 从概率到程序

简单理解:高级自动补全

传统 IDE 补全:

user.get  →  提示:getName(), getEmail(), getId()

Codex 补全:

# 从数据库查询用户信息,缓存到 Redis,返回 JSON
def get_user(user_id):
    →  生成完整函数实现,包含 SQL 查询、Redis 操作、异常处理

生成过程(简化版)

1. 编码:你的 Prompt → Token 序列
        ["def", " get", "_user", "(", "user", "_id", "):"...]

2. 预测:模型计算每个位置可能的 Token 概率
        下一个 Token 可能是:
        - "    " (缩进,概率 95%) ✅
        - "\"" (字符串,概率 3%)
        - "class" (错误,概率 0.1%)

3. 采样:按概率选择 Token,拼接成序列

4. 解码:Token 序列 → 人类可读的代码

5. 验证:检查语法正确性(括号匹配、缩进合法)

关键机制:语法约束解码

Codex 在生成时会强制遵守语法规则

# 生成中检测到 if 语句开始
if user_id > 0:
    # 下一个 Token 必须是缩进(不能是 else:)
    
# 检测到括号未闭合
def foo(a, b  # 检测到缺少 ):,强制补全

这就是为什么 Codex 代码语法错误率远低于通用模型。


第六分钟:温度参数 —— 控制创造性

Temperature(温度)

温度值 特点 适用场景
0.0 确定性最强,每次输出一样 标准算法、需要稳定结果
0.2-0.4 保守,变化小 生产代码、Bug 修复
0.7-1.0 创造性高,多样化 探索性编程、原型设计

代码专用策略

Codex 实际使用动态温度

  • 语法结构部分(def, if, return):低温(0.1),确保合法
  • 变量命名、注释内容:中温(0.4),保持可读性
  • 算法实现细节:根据场景调整

第七分钟:少样本学习 —— 用例子教 AI

原理:给几个例子,Codex 模仿风格

# 示例 1:处理空值
def safe_get(data, key):
    """安全获取字典值,不存在返回 None"""
    return data.get(key) if data else None

# 示例 2:类型转换
def parse_int(value):
    """安全转整数,失败返回 0"""
    try:
        return int(value)
    except (ValueError, TypeError):
        return 0

# 需求:按同样风格,实现安全除法
def safe_divide(a, b):
    # Codex 生成:
    """安全除法,除零或类型错误返回 0"""
    try:
        return a / b if b != 0 else 0
    except (TypeError, ZeroDivisionError):
        return 0

Codex 自动学到了

  • 函数命名风格(safe_ 前缀)
  • 文档字符串格式(三引号、功能+参数说明)
  • 异常处理模式(try-except + 默认返回值)
  • 防御性编程习惯(前置条件检查)

第八分钟:工具调用 —— 从写代码到做工程

新版 Codex 的 Agent 能力

# 用户 Prompt
"创建一个 Python 项目,实现 REST API,包含用户注册登录,用 SQLite 数据库"

# Codex 的思考过程(ReAct 模式)
1. Thought: 需要创建项目结构
   Action: call_tool("create_directory", path="my_api")

2. Thought: 需要依赖管理文件
   Action: call_tool("write_file", path="requirements.txt", 
                     content="flask\nflask-sqlalchemy\nbcrypt\npyjwt")

3. Thought: 需要主应用文件
   Action: call_tool("write_file", path="app.py", content="...")

4. Thought: 需要验证能否运行
   Action: call_tool("execute_command", cmd="pip install -r requirements.txt")

5. Thought: 安装成功,测试启动
   Action: call_tool("execute_command", cmd="python app.py")

工具类型

工具 用途
read_file 理解现有代码
write_file 创建/修改文件
execute_command 运行命令、测试代码
search_code 在项目中查找相关代码
web_search 查文档、解决依赖问题

第九分钟:常见误区与优化

❌ 误区 1:Prompt 越长越好

真相:上下文有长度限制,冗长信息会挤占生成空间。

优化

# ❌ 差:粘贴整个文件
[1000 行无关代码]
# 在这个函数里加缓存

# ✅ 好:只给相关部分
def fetch_data(url):
    # TODO: 添加 Redis 缓存,TTL 5分钟
    response = requests.get(url)
    return response.json()

❌ 误区 2:一次要太多

真相:复杂需求分步骤,降低认知负荷。

优化

步骤 1:生成基础结构
步骤 2:添加数据库模型  
步骤 3:实现业务逻辑
步骤 4:加单元测试

❌ 误区 3:不验证就接受

真相:AI 会"幻觉"(生成看起来对但跑不通的代码)。

必须做的检查

  • 语法检查(直接运行或 IDE 标红)
  • 依赖检查(import 的库是否存在)
  • 边界测试(空值、异常输入)
  • 安全审查(SQL 注入、XSS 风险)

第十分钟:总结 —— 三张图记住核心

图 1:工作流程

你的需求 → Token 化 → 模型预测 → 语法约束 → 代码输出
    ↑                                      ↓
    └──────── 验证反馈 ← 运行测试 ←──────┘

图 2:Prompt 层次

Level 1: 一句话需求(能用,但可能不对)
    ↓
Level 2: 代码上下文 + 需求(生成符合风格的代码)
    ↓
Level 3: 示例 + 约束 + 需求(精准控制输出)
    ↓
Level 4: 多轮对话 + 工具调用(工程级开发)

图 3:选择策略

快速原型 → 高温度 + 简短 Prompt
生产代码 → 低温度 + 详细上下文 + 示例
复杂项目 → 分步骤 + 工具调用 + 人工审查

一句话带走

Codex 不是魔法,是概率 + 结构 + 上下文的艺术。

写好 Prompt = 给足上下文 + 明确约束 + 提供示例


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐