谁在用 AI 写代码?
genAI 的全球扩散与真实影响
Daniotti, S., Wachs, J., Feng, X., & Neffke, F. (2025). Who is using AI to code? Global diffusion and impact of generative AI. arXiv:2506.08945v2.
作者:Simone Daniotti(乌得勒支大学)、Johannes Wachs(科威努斯大学)、Xiangnan Feng、Frank Neffke(Complexity Science Hub)
数据来源:GitHub,覆盖 170,000 名开发者,31,000,000 个 commit,2019–2024 年
↓ 下载论文 PDF
一、为什么读这篇论文?
实验室里的研究一致说:genAI 大幅提升生产力。 但宏观数据——GDP、就业统计——却看不出太大变化。 为什么?
一个可能的原因是:我们根本不知道 genAI 被谁用了、用了多少。 现有测量工具都有缺陷:问卷会少报(人们怕被评判); 实验室 RCT 只知道"有没有访问权限",而非"实际用了多少"; 观测周期太短,看不到慢慢浮现的效果。
这篇论文换了一个思路:不问人,问代码。 如果能直接从代码里检测出哪些是 AI 写的,就能绕开所有这些问题, 追踪真实的、长期的使用情况——这正是本文的核心贡献。
二、他们怎么测量?
数据规模
爬取 6 个国家(美国全量 + 中国、法国、德国、印度、俄罗斯各随机抽样) 共约 17 万名 GitHub 开发者的 3100 万个 commit, 时间跨度 2019 年初到 2024 年底。分析单元是函数级别的代码块, 且要求超过 80% 的行被修改——这样才算一次实质性提交,而非小幅改动。
分类器:三步走
第一步,造训练数据。 人写的代码取自 2018 年以前的 GitHub 函数(capable genAI 尚不存在), 以及 2022、2024 年的 HumanEval 数据集,共约 4,000 个人类函数。 AI 写的代码则通过两步生成:先用 LLM-A 把人写的函数翻译成英文功能描述, 再用另一个 LLM-B 根据描述重新生成函数。 训练集中 AI 函数来自 GPT-3.5-turbo(50%)、GPT-4o-mini(30%)和 GPT-4(20%)的混合, 总训练集约 8,000 个函数。 用两个不同模型,是为了避免分类器只学到某一个模型的风格, 而是学到"AI 生成代码"的普遍特征。
第二步,向量化。 用 GraphCodeBERT 把每个函数编码成高维向量, 同时捕捉代码的 token、注释,以及变量之间的数据流图(dataflow graph)。 这比单纯的文本 embedding 更能捕捉代码的结构性特征。
第三步,训练分类器。 在 GraphCodeBERT 之上添加线性分类头,微调所有参数。 最终性能:AUC = 0.96,平均真阳性率 0.95,F1 = 0.89(阈值 0.5),表现出色。
一个被低估的技术细节:采用率的概率修正
分类器给出的是"检测到 AI"的概率 P(D=1),但我们真正想要的是"代码确实是 AI 写的"的概率 P(A=1)。 两者之间差着假阳性率(人写的代码被误判为 AI)和假阴性率(AI 写的代码被漏掉)。 论文用全概率公式把二者联系起来:
整理后可以直接反算出真实采用率:
其中 TPR(真阳性率)约为 0.95,FPR(假阳性率)约为 0.23,均由 ground truth 数据集估算得到, 且按国家分别修正——俄罗斯的假阳性率略高(0.26),法国略低(0.20)。 这个修正使得修正后的采用率在 genAI 出现之前的区间内自然围绕零波动, 是一个内部一致性的好信号。
误差方向
论文承认几个局限——只看 Python、只看开源项目、中国用户大量活动在 Gitee 上而非 GitHub—— 但这些局限的偏差方向全部一致:系统性低估 AI 使用率。 所以论文里的所有数字都是下限,真实值只高不低。
三、各国采用率
到 2024 年底,各国 AI 生成代码比例:
| 国家 | AI 生成比例 | 备注 |
|---|---|---|
| 美国 | 29% | 最早领先,一直保持 |
| 德国 / 法国 | ~23–24% | 紧随其后 |
| 印度 | ~20% | 初期落后,2023 年后快速追赶 |
| 中国 / 俄罗斯 | 明显落后 | OpenAI/Anthropic 封锁访问 + 本地审查 |
采用率的增长曲线上有三个清晰的跳跃节点: GitHub Copilot 预览版发布、ChatGPT 公开上线、GPT-4 等第二波 LLM 发布。 每一次都在采用曲线上留下了肉眼可见的拐点。
美国的领先优势正在缩窄。法国、德国、印度快速跟上, 这意味着"先发优势"可能是暂时的——至少在有访问权限的国家之间如此。
中俄落后的原因论文说得很直接:不是技术落后,而是访问受限—— 供给侧被 OpenAI/Anthropic 封锁,需求侧有审查压力。 有趣的是,论文引用了一篇研究说,有科学需求的用户倾向于通过 VPN 绕过封锁, 所以真实使用率可能也在被低估。 另一个盲区:中国开发者大量活动在 Gitee 上,GitHub 的数据先天性地低估了中国整体的 AI 采用情况。
人口特征差异
性别差异:男女之间无显著差异(与多数调查研究结论不同)
注:性别通过名字推断,仅覆盖 GitHub 显示名中可识别的用户,样本存在选择性。
四、生产力效果
测量方法是用户 × 季度的面板回归,加入用户固定效应和季度固定效应。 本质上是用同一个程序员,比较他用 AI 前后的产出变化——排除了个人能力差异的干扰, 同时控制了所有用户共同面对的经济趋势。
回归方程如下,其中 AI 使用率刻意滞后一期(用上一季度数据), 避免与当季 commit 数产生机械性的数字关联:
因变量除了 commit 总数,还包括:涉及多文件的复杂提交、引入新库的提交、 以及用户接触的库的广度和组合的新颖程度。
从面板数据视角理解这个回归
这是一个典型的双向固定效应(Two-Way Fixed Effects, TWFE)模型—— 面板数据分析最常用的工具之一。要理解它在做什么,先回到面板数据的"两个维度": 每条观测都同时带有个体(开发者 u)和时间(季度 q)两个标识。 这就允许我们做单独使用横截面或时间序列都做不到的事—— 把不随时间变化的个体特征"消掉"。
具体怎么消掉?引入用户固定效应 ρu, 数学上等价于先把每个变量减去"该用户在所有季度的样本均值"——这就是面板数据里的 组内变换(within transformation)。 变换之后,所有不随时间变化的特征(先天编程才能、教育背景、母语、性格风险偏好……) 都会被自动消除,不论我们能不能观测到它们。 同理,季度固定效应 τq 吸收了所有用户共同面对的时间冲击—— COVID、GitHub 平台政策变化、整体经济周期等。
但 TWFE 也有它管不到的地方,这些是判断结果可信度时必须盯紧的:
- 时变的个体特征——某位开发者换工作、家里有事、动机改变, 这些既随时间变又随个体变的因素,固定效应无能为力。
- 反向因果——会不会是"今天码量大的人正好更爱用 AI"? 这正是论文把 AI 使用率滞后一期的原因: 上一季度的 AI 使用决策,不可能被本季度的产出反向影响。
- 选择性进入与流失——只有持续活跃的开发者才能留在面板里。 如果"开始用 AI 后就不再 commit"的人系统性退出,估计就有偏。
这就是为什么作者在 Discussion 中坦白"not optimized for identifying causal effects"—— TWFE 已经做了它能做的,剩下的怀疑留给下一节的三层加固。
从 0% 提升到 29% 的 AI 使用率,对应的效果:
| 群体 | commit 增长 | 新库组合增长 |
|---|---|---|
| 整体 | +3.6% | +2.7% |
| 经验丰富的程序员 | +6.2% | 显著正向 |
| 经验较少的程序员 | 不显著 | 不显著 |
除了提升产出量,AI 采用还与探索新技术领域有关: 开发者尝试使用此前从未用过的库组合增加了 2.7%。 由于不同 Python 库往往对应不同的开发方向(机器学习、数据可视化、Web 后端、IoT 等), 这被作者解读为 AI 帮助程序员"跨界"——借助 AI 作为脚手架, 进入自己不熟悉的技术领域。这个效果同样集中在有经验的程序员身上。
值得一提的是,作者还专门检验了效应是否存在非线性—— 比如 AI 使用率超过某个阈值后收益是否会饱和。 结果是点估计在高分位数处略有平台化,但统计上无法排除线性的假设。 因此基准线性模型是合理的近似。
五、识别策略:结论可信吗?
这是阅读这类论文时最需要追问的一个问题。 作者在 Discussion 里非常坦率地承认:
也就是说,他们没有设置工具变量,也没有做断点回归或差分中的差分。 核心识别依赖双向固定效应(TWFE)——用同一程序员自身的前后变化来识别效应, 但依然无法完全排除时变的混淆因素。 为了增强结论的可信度,论文做了三件值得关注的事:
① 安慰剂检验(Placebo Test)
把回归限制在 2022 年以前——那时 Copilot 尚未发布,"检测到的 AI 使用率"不携带任何真实信息, 只是分类器的噪声。结果:p 值从 0.11 到 0.93,全部不显著。 这说明主回归的显著效应不是由分类器的系统性误差驱动的,有一定可信度。
② 测量误差修正(Attenuation Bias Correction)
AI 使用率本身是用分类器的平均预测值代理的,有测量噪声。 经典计量理论告诉我们:含有测量误差的自变量会导致衰减偏误(attenuation bias), 把真实效应向零压缩。 论文用移动平均窗口 k ∈ {4, 8, 16, 32} 构造精度递增的测量变量, 随着 k 增大(平均更多函数,噪声更小),效应估计单调上升, 与理论预测完全吻合。
③ 与外部基准对照
论文估算的美国 29% 采用率,与微软和亚马逊自己公开报告的数字高度吻合。 这是一个来自外部的间接验证,说明即便只看开源 Python 项目,测量结果也具有一定代表性。
六、技能差距扩大,而非缩小
这是论文最核心、也最令人不安的结论:
新手用 AI 的比例更高(37% vs 27%),但生产力几乎没有提升。 老手用得少,却拿走了几乎全部的收益。 论文用交互项模型(将经验 ≥ 6 年定义为"有经验")正式检验了这个差异, 经验 × AI 使用率的交互项系数在 commit 数上约为 0.189,在 p<0.05 水平上显著。
原因在于互补性:AI 和已有技能是互补的,不是替代的。 有了技能,AI 才是杠杆;没有技能,AI 只是噪声。
更深层的隐患是"去技能化"(deskilling): 新手本来应该靠写烂代码、踩坑、调试来积累经验, 而 AI 可能把这个过程替代掉了——他们接触的是 AI 的输出,而不是自己的问题和错误。 他们现在就没用好,未来可能成长得更慢。 这个长期效果,论文的数据(只到 2024 年底)还看不到——这是一个重要的开放问题。
七、Further…
1. 分类器对更新模型的表现
数据采集结束于 2024 年底,但 AI 技术还在快速演进。 论文专门测试了分类器对此后发布的模型的识别能力:
| 模型 | 再训练前(真阳性率) | 再训练后 |
|---|---|---|
| GPT-4.1 | 0.763 | 0.781 |
| o3(推理模型) | 0.867 | 0.910 |
| Claude Sonnet 4 | 0.630 | 0.831 |
| DeepSeek-V3 | 0.452 | 0.561 |
OpenAI 的新模型相对容易检测,但 Claude 和 DeepSeek 代码风格更接近人类写法,初始检测率更低。 在训练集中加入各 500 个样本后,性能显著提升—— 这说明随着训练数据跟上,检测器可以保持一定的时效性。 但这也意味着:如果未来的模型代码越来越"人性化", 这类检测工具的有效性本质上是一场猫鼠游戏。
2. 编程域的跨越:库组合分析
论文对 Python 库进行了社区检测,基于库的共现关系构建了一个包含 4,998 个节点的网络, 用 Louvain 算法划分出 124 个低层社区、19 个高层类别, 覆盖从"深度学习框架"到"IoT 嵌入式系统"再到"地理空间数据处理"的各个领域。 AI 驱动的库组合创新效应在这些细分类别中同样成立, 不是因为 AI 引入了冷僻的"幻觉库"—— 限制在 5,000 个最常用库或粗粒度类别后,结论依然稳健。
3. 总经济价值:有多大?
论文用 O*NET 职业任务数据结合 BLS 工资统计,估算出美国每年与编程相关的劳动成本为 637–1,063 亿美元。 以此为基础,再结合自身的保守效应估计(+3.6%), 得出 genAI 每年为美国编程工作创造约 230–380 亿美元的额外产值。
附录还补充了一般均衡分析,在两种极端假设下估算社会总福利变化:
| 供给假设 | 含义 | 社会总福利增量 |
|---|---|---|
| 供给完全无弹性(短期) | 程序员人数固定,价格下降,消费者得益 | 约 +260 亿美元 |
| 供给完全弹性(长期) | 市场自由进入,价格降至保留工资水平 | 约 +930 亿美元 |
正向,但相对于整个编程行业的规模(美国约 7,870 亿美元工资总额),目前还是个零头—— 这与"生产力悖论"(macro impacts are modest)的宏观观察相吻合。
4. 还没有回答的问题
论文明确留下了三个开放问题,作者说"在原则上可行,但需要新的数据和指标设计"。 以下是我的一些思考。
① AI 让新手成长变慢吗?
这个问题可能比论文预想的更复杂。论文只观测到"新手用了 AI,产出没提升"—— 但这只是短期快照,更深的问题是:新手有没有在积累判断力? 写烂代码、踩坑、调试,这个过程本身是在建立"什么叫好代码"的直觉。 如果 AI 把这个过程替代了,新手接触的是 AI 的输出而不是自己的错误, 那三年后他们的判断力从哪来?
有一个反向的可能性:也许新手用 AI 的主要方式不是"让 AI 写代码", 而是"用 AI 解释报错、问概念"——那其实是在加速学习,不是在绕过它。 但论文的数据分辨不出这两种用法,这是核心盲区。 如果答案是"AI 在阻碍新手的能力积累",编程教育的设计就需要彻底重想。
② 低收入国家:不只是"慢一步"
低收入国家缺失不只是数据问题——结论可能完全不同。 论文里"访问受限"的解释针对的是中俄(供给侧封锁), 但低收入国家还叠加了另一层:用英语提问的能力。 现有 LLM 在英语上远强于其他语言,母语是斯瓦希里语或印地语的开发者, 使用体验本身就差很多。
这意味着 genAI 的全球扩散可能天然地沿着语言和基础设施不平等的轨迹走—— 不只是"慢一步追上",而是"能不能追上"的问题。 如果技能回报的差距在国家间也以类似方式放大, "widening the skill gap"就不只是个人层面的故事了。
③ 代码质量:数量和质量可能是反向的
commit 数多了,但每个 commit 的代码是 AI 生成的、未经深度审查的—— bug 率、安全漏洞、可维护性可能都在悄悄变差,只是这些指标很难从 GitHub 公开数据测量。 论文提到可以追踪 issue 解决率、测试覆盖率, 但我觉得最有信号价值的其实是 PR 审查拒绝率: 如果有经验的 reviewer 拒掉的 PR 比例在上升,那就是质量在下降的直接证据。 这需要访问私有仓库数据,几乎不可能大规模获取—— 这也许是为什么论文选择了 commit 数这个"可测量但不完美"的指标。