mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6mobile wallpaper 7
3453 字
10 分钟
Codex:GitHub 学写代码
2026-07-21

《Codex》解读:让模型在 GitHub 上学写代码——代码智能的真正先行者#

论文:Evaluating Large Language Models Trained on Code(arXiv<2107>.03374) 作者:Mark Chen、Jerry Tworek、Heewoo Jun 等(论文列了 58 位作者),OpenAI 及合作者 发布背景一句话:2021 年 7 月 7 日挂上 arXiv,核心主张是”在代码上微调的 GPT 能按注释生成可运行的函数”,还顺手发布了一套评测基准;前置知识提示:GPT-3 能从 Python docstring 里生成简单程序,但能力极其有限(上一站);这篇为哪一步埋下伏笔——代码训练这条线直接长出了 GPT-3.5 的逻辑能力,而 HumanEval 成了此后所有代码大模型绕不开的必考卷。


一、引言:为什么盯上代码生成#

时间回到 2021 年夏天,GPT-3 已经发布一年,大家发现一件有趣的事:这个语言模型居然能从 Python 的文档注释里生成简单程序。

但也就到”简单”为止了——它生成的东西经常长得像代码,跑起来就报错。

当时学术界对代码生成的主流做法还是 BLEU 分数、模板匹配那一套,模型也基本都是专门的编解码器结构(比如微软的 CodeBERT),没人觉得”通用语言模型”这辆马车能拉得动代码这种结构化的活。

OpenAI 当时在盘一个更野的问题:如果把模型专门丢进代码里训练,它能不能真正”写对”程序?

这个问题的底气来自一个假设——代码本质上也是一种语言,只是语法更严格、逻辑更稠密。既然 GPT 能在自然语言里学到”世界知识”,那它在代码里学到的会不会是”因果关系”和”过程逻辑”?

后来的事大家都知道了,这个假设不仅成立,还成了 GPT-3.5 一代模型”变聪明”的秘密。

代码这个领域还有个语言模型梦寐以求的特性:可自动判分

自然语言任务的评估要靠人或者近似指标,而代码对不对,跑一遍单元测试就知道了。这让”功能正确性”(functional correctness)第一次成了大模型可以硬碰硬优化的目标。

Codex 的立场很直接:不跟 BLEU 分数这种花架子纠缠,就问你生成的代码能不能通过测试

所以这篇论文要解决的问题有三个:能不能用公开代码把 GPT 微调成会写代码的模型?怎么写一套可信的评测来度量”真会写”?以及——模型写代码到底有哪些边界?

它的答案,不仅催生了 GitHub Copilot,还顺手定义了后面五年代码 AI 的评测范式。

二、方法:架构/数据/训练细节#

训练数据:2020 年 5 月,OpenAI 从 5400 万个 GitHub 公开仓库里爬取了 179GB 的独立 Python 文件(单文件 <1MB)。

过滤掉疑似自动生成的文件、平均行超 100 字、最大行超 1000 字、字母数字占比过低等垃圾后,得到 159GB 的最终数据集。Python 占绝对大头——数据构成也解释了为什么 Codex 只在 Python 上表现好。

训练时从 GPT-3 的权重初始化微调,作者说从随机初始化训也没差多少精度,但从 GPT-3 起步收敛快得多——这正是”微调”两个字的含金量。

模型:沿用 GPT-3 的 decoder-only(仅解码器)架构,做了一整条尺寸线,从 12M 到 12B 参数,主打 Codex-12B

训练细节有讲究:总训练量约 100B tokens,175 步线性 warmup 接余弦衰减,Adam 优化器 β₁=0.9、β₂=0.95,权重衰减 0.1。

还干了一件很工程的事:因为代码里的缩进、换行这些空白在自然语言分词器下很浪费 token,他们给不同长度的空白序列加了专门的 token,表示同样的代码大概能省 30% 的 token

这种”为了压缩代码而重做分词”的细节,说明团队是真的在跟代码数据死磕,不是套个 GPT 就完事。

评测:HumanEval 与 pass@k。这是 Codex 留给后世最重要的遗产。

HumanEval 是 164 道手写编程题,每道包含函数签名、docstring(文档注释)和平均 7.7 个单元测试——全部手写,就是为了避免”答案已经在网上被模型见过”的数据泄露(论文里点名吐槽过当时已有的 APPS 数据集存在这种风险)。

评测指标叫 pass@k:对每道题采样 k 个代码,只要有一个能通过全部单元测试就算解出来

注意这个”只要有一个”——它把”生成质量”和”生成多样性”合并成了一个指标,也直接催生了后面的”采样多个取最优”路线。

生成在沙盒里跑,防止恶意代码伤到宿主。采样用 nucleus sampling(top-p=0.95),遇到 \ndef\nclass\n# 这类行首符号就停。

Codex-S:论文还做了个进阶版本。他们发现 GitHub 上的代码鱼龙混杂,很多是配置文件、脚本、类模板,跟”从注释生成函数”根本不是一回事。

于是额外收集了编程竞赛网站的题解持续集成(CI)仓库的数据做监督微调,得到 Codex-S,效果又上了一个台阶。

这一步今天看平平无奇,当时却是个很前沿的判断:训练数据的”任务分布”比数据量更重要

三、成绩:关键实验数字#

HumanEval 上的结果,在今天看是历史书级别:Codex-12B 的 pass@1 达到 28.8%,pass@10 到 46.81%,pass@100 到 72.31%

对照组惨不忍睹——GPT-3 是 0%(它连一道题都解不出来),开源阵营最强的 GPT-J-6B 只有 11.4%,GPT-Neo-2.7B 是 6.4%。

连当时的商业补全产品 TabNine 的最大免费模型也只有 2.58%,大约只相当于 Codex 家族里最小的 12M 模型。

换句话说,光靠”在代码上微调”这一个动作,12B 模型就打出了 30 倍于同类竞品的分数

而且整个家族的 pass@1 随参数量平滑上升,接近一条幂律——这跟 GPT-3 论文里”损失随规模幂律下降”的观察一脉相承。

论文里最反直觉的发现是重复采样允许采 100 个样本时,解题率从 28.8% 拉到 70.2%——不是靠更强的模型,是靠”多试几遍”。

温度也要跟着 k 调:pass@1 用低温(约 0.2)保证质量,pass@100 用高温(约 0.8)保证多样性。

我特别喜欢这个实验设计:它等于在说”模型不是不够聪明,是每次都差点运气”,而”运气”可以用算力买回来。

进一步微调的 Codex-S pass@1 达到 37.7%,采 100 次能解 77.5%;即便不用单元测试这个”先知”,只按平均 token 对数概率挑一个答案,也有 44.5%——模型自己多少知道哪些输出更靠谱。

边界也很清楚。在 APPS 这个编程竞赛题基准上(从标准输入读数据、输出到标准输出,难度陡增),即使给了 1-shot 示例,Codex-12B 的 pass@1 也只有约 4.4%——竞赛题当场现形。

论文还指出两个具体毛病:难以处理描述长操作链的 docstring,以及不擅长把操作正确绑定到变量上

另外它用 BLEU 分数做了一次”证伪”实验:正确与错误的代码在 BLEU 分布上严重重叠,说明文本相似度根本不等于功能正确——这也是为什么 pass@k 能上位。

产品线紧随其后:2021 年 6 月 29 日 GitHub Copilot 以技术预览上线(Codex 的生产版本就是它的引擎),2022 年 6 月正式发布;Codex 自己的 API 在 2021 年 8 月开放。程序员的工作流,从此多了一个 Tab 键。

收尾:我的一点看法#

Codex 厉害在哪?我认为是三件事。

第一,它定义了评测范式——HumanEval + pass@k + 手写防泄露,今天所有代码大模型(包括后来碾压它的那些)都在这个框架里说话。

第二,“重复采样”这个发现太被低估了,它第一次用实验证明”生成 100 个取最优”比”把模型做大一点”划算得多,后来的 AlphaCode、GPT-4 全都吃这碗饭。

第三,它让”AI 写代码”从 demo 变成了真实的生产工具——Copilot 每天按下的那个 Tab,就是 Codex 打的桩。

而且它的参数量才 12B,今天动辄几百上千亿的模型靠的依然还是这套”预训练 + 微调 + 采样”的配方,只是把配方里的量级放大。

缺陷也是教科书级别的。数据版权是最大的雷:从 GitHub 爬代码时基本没按开源协议过滤,训练数据里的 GPL、Apache 代码该怎么算?

论文其实讨论过 broader impacts(更广泛的影响),但当时更多是走流程,真到官司上门已经是好几年后的事。

能力上,竞赛题 4.4% 的 pass@1 说明它连”入门级算法选手”都算不上,长操作链和变量绑定这两条短板,本质上暴露的是”它是统计续写,不是推理执行”——代码对得上格式,不等于想得清楚逻辑。

我始终觉得,“看起来像代码”和”会编程”之间隔着一条它没跨过去的河。

还有一层环境上的争议:它把 GitHub 上的开源劳动变成了自己的训练材料,又反过来商业化——这既是技术史上的伟大一步,也是开源伦理史上的一笔烂账。

我不打算替它洗白,只想说后来的每一个代码模型(包括开源阵营的 StarCoder、DeepSeek-Coder)都站在同一个道德洼地里,Codex 只是第一个跳进去的。

历史位置得放回时间线里看:Codex(2021.07)最早,InstructGPT(2022.03)居中,ChatGPT(2022.11)引爆

Codex 是这三篇里技术贡献最”硬”的一篇——它没造出爆款产品,但 GPT-3.5 之所以比 GPT-3 聪明、ChatGPT 之所以能写代码,根子都在它那句”在代码上微调”上。

它是代码智能的先行者,也是整个 ChatGPT 时代最被低估的一块拼图。


附:核心数据速查#

关键数字表格

指标数值对比/备注
训练数据159GB GitHub 公共代码从 5400 万仓库、179GB 过滤而来
主打模型Codex-12B家族含 12M 到 12B 全尺寸
HumanEval 题量164 道手写题平均 7.7 个单元测试/题
Codex-12B pass@128.8%GPT-3 为 0%,GPT-J-6B 为 11.4%
Codex-12B pass@1046.81%
Codex-12B pass@10072.31%100 样本取最优
采 100 样本解题率70.2%论文核心洞察:重复采样有效
Codex-S pass@137.7%加编程竞赛 + CI 数据微调
Codex-S pass@10077.5%按平均 log 概率选一个则 44.5%
APPS 竞赛题 pass@1约 4.4%1-shot,竞赛级能力不足
TabNine(商业补全)2.58%约等于最小号 Codex-12M
空白序列专用 token约省 30% token代码表示压缩
GitHub Copilot2021-06-29 技术预览2022-06 正式发布

关键概念清单

  • HumanEval = OpenAI 发布的 164 道手写代码题基准,测 docstring 到函数的生成
  • pass@k = 功能正确性指标,采 k 个样本任一个通过全部单元测试即算对
  • Functional correctness = 功能正确性,以是否通过测试而非文本相似度评判代码
  • Fine-tuning = 微调,在预训练权重基础上用领域数据继续训练
  • Nucleus sampling = 核采样(top-p),截断低概率 token 的采样方式
  • BLEU = 文本相似度指标,论文证明它与代码正确性不对等
  • Codex-S = 用编程竞赛题解与 CI 数据进一步监督微调后的变体
  • APPS = 编程竞赛题数据集,从标准输入输出做整程序合成,难度高于 HumanEval
  • Whitespace tokens = 空白序列专用 token,压缩代码表示约省 30% token
  • GitHub Copilot = 基于 Codex 生产版的 AI 代码补全工具
  • Data contamination = 数据泄露,测试题答案若已混入训练数据会虚高分数
  • Sandbox = 沙盒,隔离环境,用于安全运行模型生成的代码
分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Codex:GitHub 学写代码
https://mizuki-eaf.pages.dev/posts/chatgpt/codexgithub-学写代码/
作者
无名之子
发布于
2026-07-21
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录