论文来源
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 写的代码被漏掉)。 论文用全概率公式把二者联系起来:

P(D=1) = P(D=1|A=1) · P(A=1) + P(D=1|A=0) · (1 − P(A=1))

整理后可以直接反算出真实采用率:

P̂(A=1) = [ P̂(D=1) − FPR ] / [ TPR − FPR ]

其中 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 采用情况。

人口特征差异

经验越少,用 AI 比例越高:新手 37%,老手 27%
性别差异:男女之间无显著差异(与多数调查研究结论不同)
注:性别通过名字推断,仅覆盖 GitHub 显示名中可识别的用户,样本存在选择性。

四、生产力效果

测量方法是用户 × 季度的面板回归,加入用户固定效应和季度固定效应。 本质上是用同一个程序员,比较他用 AI 前后的产出变化——排除了个人能力差异的干扰, 同时控制了所有用户共同面对的经济趋势。

回归方程如下,其中 AI 使用率刻意滞后一期(用上一季度数据), 避免与当季 commit 数产生机械性的数字关联:

log(yuq + 1) = β · AIu,q−1 + ρu + τq + εuq

因变量除了 commit 总数,还包括:涉及多文件的复杂提交、引入新库的提交、 以及用户接触的库的广度和组合的新颖程度。

从面板数据视角理解这个回归

这是一个典型的双向固定效应(Two-Way Fixed Effects, TWFE)模型—— 面板数据分析最常用的工具之一。要理解它在做什么,先回到面板数据的"两个维度": 每条观测都同时带有个体(开发者 u)和时间(季度 q)两个标识。 这就允许我们做单独使用横截面或时间序列都做不到的事—— 把不随时间变化的个体特征"消掉"

具体怎么消掉?引入用户固定效应 ρu, 数学上等价于先把每个变量减去"该用户在所有季度的样本均值"——这就是面板数据里的 组内变换(within transformation)。 变换之后,所有不随时间变化的特征(先天编程才能、教育背景、母语、性格风险偏好……) 都会被自动消除,不论我们能不能观测到它们。 同理,季度固定效应 τq 吸收了所有用户共同面对的时间冲击—— COVID、GitHub 平台政策变化、整体经济周期等。

TWFE 最强的地方:不需要把混淆变量明确列出来。 只要它们对个体不随时间变化、或对时间不随个体变化,就会被自动剔除。 剩下的 β 捕捉的是同一个程序员在不同时间使用 AI 程度的组内变动 对 commit 数的影响——这也是为什么作者说"用自己当自己的对照组"。

但 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 里非常坦率地承认:

"our estimation design is not optimized for identifying causal effects"

也就是说,他们没有设置工具变量,也没有做断点回归或差分中的差分。 核心识别依赖双向固定效应(TWFE)——用同一程序员自身的前后变化来识别效应, 但依然无法完全排除时变的混淆因素。 为了增强结论的可信度,论文做了三件值得关注的事:

① 安慰剂检验(Placebo Test)

把回归限制在 2022 年以前——那时 Copilot 尚未发布,"检测到的 AI 使用率"不携带任何真实信息, 只是分类器的噪声。结果:p 值从 0.11 到 0.93,全部不显著。 这说明主回归的显著效应不是由分类器的系统性误差驱动的,有一定可信度。

② 测量误差修正(Attenuation Bias Correction)

AI 使用率本身是用分类器的平均预测值代理的,有测量噪声。 经典计量理论告诉我们:含有测量误差的自变量会导致衰减偏误(attenuation bias), 把真实效应向零压缩。 论文用移动平均窗口 k ∈ {4, 8, 16, 32} 构造精度递增的测量变量, 随着 k 增大(平均更多函数,噪声更小),效应估计单调上升, 与理论预测完全吻合。

这意味着:3.6% 的产出提升是下限,不是点估计。 校正后的效应在所有模型中均明显偏高,与 RCT 实验的结果更为接近。

③ 与外部基准对照

论文估算的美国 29% 采用率,与微软和亚马逊自己公开报告的数字高度吻合。 这是一个来自外部的间接验证,说明即便只看开源 Python 项目,测量结果也具有一定代表性。

局限性诚实说:作者没有工具变量,无法完全排除内生性。更严格的因果识别留待未来研究—— 例如利用各国访问权限的准自然实验,或 Copilot 对不同语言的分阶段推出作为外生冲击。

六、技能差距扩大,而非缩小

这是论文最核心、也最令人不安的结论:

"widening rather than closing the skill gap"

新手用 AI 的比例更高(37% vs 27%),但生产力几乎没有提升。 老手用得少,却拿走了几乎全部的收益。 论文用交互项模型(将经验 ≥ 6 年定义为"有经验")正式检验了这个差异, 经验 × AI 使用率的交互项系数在 commit 数上约为 0.189,在 p<0.05 水平上显著。

🟠 老手 + AI 能判断 AI 输出的好坏,对错误敏感,有效利用生成代码, 还能借助 AI 跨入新的技术领域,生产力和探索性双双提升。
🔵 新手 + AI 缺乏判断力,生成什么用什么,无法有效筛选。 commit 数没有显著提升,新库探索也无显著变化。

原因在于互补性:AI 和已有技能是互补的,不是替代的。 有了技能,AI 才是杠杆;没有技能,AI 只是噪声。

更深层的隐患是"去技能化"(deskilling): 新手本来应该靠写烂代码、踩坑、调试来积累经验, 而 AI 可能把这个过程替代掉了——他们接触的是 AI 的输出,而不是自己的问题和错误。 他们现在就没用好,未来可能成长得更慢。 这个长期效果,论文的数据(只到 2024 年底)还看不到——这是一个重要的开放问题。

一个需要警惕的解读:经验差异的背后,还可能有动机差异—— 有经验的程序员知道自己在用 AI 解决什么问题,而新手可能更随意。 这两种解释并不互斥,但目前的数据无法区分。

七、Further…

1. 分类器对更新模型的表现

数据采集结束于 2024 年底,但 AI 技术还在快速演进。 论文专门测试了分类器对此后发布的模型的识别能力:

模型再训练前(真阳性率)再训练后
GPT-4.10.7630.781
o3(推理模型)0.8670.910
Claude Sonnet 40.6300.831
DeepSeek-V30.4520.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 数这个"可测量但不完美"的指标。

三个问题里,①新手成长是政策含义最直接的。其余两个更像是测量难题; 这个如果答案是"是",影响的是整整一代学习路径的设计。(拭目以待.png)