52% 的员工在工作中用 AI,中位数每周省下三小时
💡 工具推荐: 字数统计、CSV 转 JSON、CSV 格式化
10 月 30 日,欧洲央行执委 Philip R. Lane 在旧金山联储做了一场主旨演讲,值得一读的理由只有一个:它用分布取代了轶事。其中两个数字听起来不可能同时成立。一半的员工说自己在工作中用 AI,按任何标准这都是主流采用。而只有 7% 的企业把自己对 AI 的使用形容为「显著」,那是试点项目的水平。两个都对,它们来自不同的调查,而它们之间的差距,是整场演讲里最有用的部分:采用是广而浅的,时间节省是真的,但集中得让任何一个平均值都显得失真。
生成与调试代码带来的时间节省最大:每周六小时。
一、两个看起来矛盾的数字,其实不矛盾
52% 来自欧洲央行的消费者预期调查(CES),它定期问家庭「你在工作中用不用 AI」:员工使用 AI 的比例两年翻了一倍,从 2024 年的 26% 到现在的 52%。7% 来自企业融资渠道调查(SAFE),它问的是企业,2025 年第四季度发现 64% 的企业在「试验性或中等程度」地使用 AI,而只有 7% 认为自己的使用「显著」。这是两个不同的人群在回答两个不同的问题,所以并不矛盾——但一个每周打开几次对话框的员工,和一家围绕模型重建了流程的企业之间,隔着很宽的距离。当下大部分经济体都待在这段距离中间。
# The ECB numbers are distributions, so reproduce the distribution on your own
# data. Median first, mean second, and the no-gain share always.
import csv
import statistics as st
from collections import defaultdict
rows = []
with open("hours_saved.csv", newline="", encoding="utf-8") as fh:
for r in csv.DictReader(fh):
rows.append({
"person": r["person"],
"task_class": r["task_class"], # code / writing / research / data
"hours_saved": float(r["hours_saved"]),
"used_ai": r["used_ai"] == "yes",
})
def describe(values: list[float]) -> str:
if not values:
return "no samples"
med = st.median(values)
mean = st.mean(values)
zero = sum(1 for v in values if v <= 0) / len(values)
p90 = sorted(values)[int(len(values) * 0.9) - 1]
return (f"n={len(values):<4} median={med:>5.1f}h mean={mean:>5.1f}h "
f"p90={p90:>5.1f}h no-gain={zero:>4.0%}")
by_class = defaultdict(list)
for row in rows:
if row["used_ai"]:
by_class[row["task_class"]].append(row["hours_saved"])
for cls, vals in sorted(by_class.items()):
print(f"{cls:<10} {describe(vals)}")
# The gap between median and mean is the honesty check. If mean is more than
# twice the median, you are looking at a tail, not at a typical result, and
# quoting the mean to a budget owner will get you caught.二、使用者中位数省三小时,而平均值什么也说明不了
最醒目的数字是:使用者中位数每周省三小时,约等于工作时间中位数的 7.7%。真正有意思的是它周围的分布——演讲里说得很明确:大多数人只获得中等幅度的时间节省,而少数人报告了非常高的效率提升。这个形状应该改变你对内汇报的方式。偏态分布上的平均值是被尾部拉起来的,所以一个「两个人把半周工作自动化了、八个人只省了二十分钟」的团队,平均值会很好看,中位数则接近噪声。报中位数,报「完全没有增益的人占多少」,把尾部单独报——尾部是最有意思的工程,但它不是一份能推广给所有人的计划。
# Self-reported hours are soft. Instrument the thing instead: wall-clock per
# task, with and without assistance, recorded by the tooling rather than memory.
import json, time, uuid
from contextlib import contextmanager
LOG = "task_timings.jsonl"
@contextmanager
def task(kind: str, title: str, assisted: bool):
rec = {"id": str(uuid.uuid4()), "kind": kind, "title": title,
"assisted": assisted, "start": time.time()}
try:
yield rec
finally:
rec["seconds"] = round(time.time() - rec["start"], 1)
with open(LOG, "a", encoding="utf-8") as fh:
fh.write(json.dumps(rec) + "\n")
# Usage: wrap the work, not the meeting.
with task("write", "incident postmortem draft", assisted=True) as t:
draft = "..." # whatever the actual work is
t["chars_out"] = len(draft)
# What this buys you: a per-task number you did not estimate afterwards, and a
# paired comparison when the same task class runs both ways. It does not
# capture thinking time, so pair it with one afternoon of observation per
# person rather than pretending the timer is the whole truth.三、写代码省的时间最多,用的人却最少
生成或调试代码带来的实测收益最大,每周六小时——是整体中位数的两倍——而大约只有 15% 的员工用 AI 做这件事。与此同时,被引用最多的用途是调研、信息收集、写作和文字编辑,可这些任务报告的节省明显更低。把这两件事放在一起,就得到了这个领域最常被误用的统计数字。六小时这个数是关于一个规模小、自我选择的群体的,而且他们的任务异常「可判」:代码要么编译得过要么不过,失败几秒钟内就看得见,反馈回路短到模型真的有用。这一点并不会迁移到那种反馈回路长达一周、而「做完」的定义需要四个人先达成共识的任务上——也就是大多数组织里的大部分工作。
# Match the categories the ECB used before comparing: code generation and
# debugging, research and information gathering, writing and text editing,
# data analysis, routine automation. Pooling them into one number is how the
# six-hour headline gets misapplied to a writing team.
import json
import statistics as st
from collections import defaultdict
CATEGORIES = {
"code": "generating or debugging code",
"research": "research and information gathering",
"writing": "writing and text editing",
"data": "data analysis",
"routine": "routine task automation",
}
groups = defaultdict(list)
with open("task_timings.jsonl", encoding="utf-8") as fh:
for line in fh:
rec = json.loads(line)
key = CATEGORIES.get(rec["kind"])
if key:
groups[key].append((rec["seconds"] / 3600, rec["assisted"]))
for name, pairs in groups.items():
assisted = [h for h, a in pairs if a]
plain = [h for h, a in pairs if not a]
if len(assisted) < 5 or len(plain) < 5:
print(f"{name:<34} not enough pairs yet ({len(assisted)}/{len(plain)})")
continue
delta = st.median(plain) - st.median(assisted)
print(f"{name:<34} saved {delta:>5.2f}h/task "
f"(n={len(assisted)}+{len(plain)})")
# Print the "not enough pairs" line rather than a number. Five samples per arm
# is already generous; a two-sample comparison on two data points is a story,
# not a measurement.四、企业说自己在改流程,钱却花在工具上
企业侧的调查在动机上很直白:62% 说是为了改善业务流程,23% 说是为了创新、研发或扩展产品线,只有 15% 说为了降低人力成本。最后这个数字值得停一下,因为公共讨论里的假设正好相反。投资计划讲的是同一个故事,只是中间有个缺口:计划投资 AI 的企业里,49% 打算买技术和工具,46% 打算培训员工,40% 打算投数据和基础设施,12% 打算招 AI 专家。格格不入的是培训。一半企业在买一件价值取决于「人改变工作方式」的工具,而不到一半为「让这件事发生」的那部分做了预算。
# Is your measured saving distinguishable from zero? Bootstrap the median
# difference instead of trusting a point estimate from a small sample.
import random
import statistics as st
random.seed(7)
def bootstrap_median_diff(assisted, plain, n=5000):
diffs = []
for _ in range(n):
a = st.median(random.choices(assisted, k=len(assisted)))
p = st.median(random.choices(plain, k=len(plain)))
diffs.append(p - a)
diffs.sort()
lo = diffs[int(n * 0.025)]
hi = diffs[int(n * 0.975)]
return lo, hi
assisted_hours = [1.8, 2.2, 1.5, 3.1, 2.0, 1.2, 2.6, 1.9] # replace with yours
plain_hours = [2.9, 3.4, 2.6, 4.2, 3.0, 2.4, 3.8, 3.1]
lo, hi = bootstrap_median_diff(assisted_hours, plain_hours)
print(f"median difference: {st.median(plain_hours) - st.median(assisted_hours):.2f}h")
print(f"95% interval: {lo:.2f}h to {hi:.2f}h")
if lo <= 0:
print("interval crosses zero: report 'no measurable difference yet'")
else:
print("interval excludes zero: the direction is supported by this sample")
# Crossing zero is the normal result for a small team in a slow-feedback task
# class. Saying so is cheaper than defending a number you cannot reproduce.五、为什么宏观生产率数字一直不大
演讲里有三个机制,解释了「个体的节省」与「国民账户」之间的落差。第一是广度:采用面很宽但很浅,平均到每个人头上的小时数就很小。第二是深度:大的增益集中在一小部分任务和一小部分人身上,而在围绕它重建流程之前——只是把工具挂上去——这些增益不会聚合起来。第三是预期:企业系统性地低估了有多少竞争对手在投,而这个认知偏差又压制了自己的计划——欧洲央行自己的研究发现,当企业得知更多本国同行在投资时,会提高自己的预期投资率,感知到的同行采用率每高一个百分点,自身预期投资率约提高 0.6 个百分点。投资是真的:欧元区数字投资按实际价值计算自 2014 年以来增长了 73%,企业还报告 AI 今年给他们的资本支出计划加了大约 10%。落后的是那件把「花钱」变成「产出」的重组工作。
# The one page that survives being asked "how do you know". Median, spread and
# the no-gain share, per task class, with the sample size visible.
import json
import statistics as st
from collections import defaultdict
def load(path: str):
rows = []
with open(path, encoding="utf-8") as fh:
for line in fh:
rec = json.loads(line)
rows.append((rec["kind"], rec["seconds"] / 60.0, rec["assisted"]))
return rows
def page(path: str, min_n: int = 5) -> str:
groups = defaultdict(lambda: {"ai": [], "no": []})
for kind, minutes, assisted in load(path):
groups[kind]["ai" if assisted else "no"].append(minutes)
lines = ["task class n_ai n_no median_ai median_no saved no-gain"]
for kind, g in sorted(groups.items()):
if len(g["ai"]) < min_n or len(g["no"]) < min_n:
lines.append(f"{kind:<15} {len(g['ai']):<5} {len(g['no']):<5} "
"not enough paired tasks yet")
continue
ma, mn = st.median(g["ai"]), st.median(g["no"])
flat = sum(1 for a, b in zip(g["ai"], g["no"]) if a >= b) / len(g["ai"])
lines.append(f"{kind:<15} {len(g['ai']):<5} {len(g['no']):<5} "
f"{ma:>9.0f} {mn:>9.0f} {mn - ma:>5.0f}m {flat:>6.0%}")
return "\n".join(lines)
if __name__ == "__main__":
print(page("task_timings.jsonl"))
# Three columns do the work: the median (what a typical task looks like), the
# no-gain share (how often the assistant changed nothing), and n (whether any
# of it is worth reading). A dashboard without n invites the wrong argument.六、量你自己的中位数,别再借标题
你经理会拿来压你的数字是每周六小时,而它跟你的团队无关。去做那件不起眼的小事:挑一类任务,在几周里记录「有助手」和「没助手」两种情况下任务的起止时间,然后报中位数差异,以及「完全没有差别」的任务占比。两条规则能让这件事保持诚实。永远不要在偏态分布上只报平均值而不给中位数;永远不要让「对工具最热情的那个人」成为唯一的测量来源。如果诚实的数字是四十分钟而不是六小时,那依然是一个真实的数字,而且当有人问起这张 licence 为什么续的时候,它是你唯一能站得住的数字。
欧元区数字投资按实际价值计算,自 2014 年以来增长了 73%。
大多数人只省下中等幅度的时间,少数人报了非常大的数字。
📌 常见问题 FAQ
52% 和 7% 这两个数字是哪来的?
52% 来自欧洲央行的消费者预期调查(CES),它问家庭在工作中是否使用 AI,发现这个比例从 2024 年的 26% 翻了一倍。7% 来自企业融资渠道调查(SAFE),2025 年第四季度发现 64% 的企业在试验性或中等程度使用 AI,而只有 7% 把自己的使用形容为「显著」。人群不同,问题也不同。
AI 实际省下多少时间?
使用者中位数每周省三小时,约相当于工作时间中位数的 7.7%。生成或调试代码的收益最大,每周六小时,但只有约 15% 的员工用它做这件事。分布是偏态的:大多数人只省中等幅度,少数人报告了非常大的数字。
为什么宏观生产率上看不到这个收益?
因为采用面广而浅,也因为大的增益集中在一小部分任务和用户身上,要等流程围绕工具重建之后才会聚合。投资是可测的——欧元区数字投资按实际价值自 2014 年以来增长 73%,AI 今年给企业的资本支出计划加了大约 10%——而把投入变成产出的那次重组,测不出来。
我能不能拿「写代码每周省六小时」这个数字去申请预算?
只有当你的团队工作形态与它被测量的那个群体相似时才成立:反馈回路短、产出可验证、以个体任务为主。写作、调研或协调密集的工作,实测节省要低得多,拿写代码的数字去论证一个非编码团队,是续约时最容易输掉争论的一种方式。
我们自己测,最低限度的诚实做法是什么?
挑一类任务,量几周,记录「有助手」与「无助手」两种情况下的起止时间,报中位数差异,并把样本量和「完全没变化的任务占比」一起报出来。在下结论之前加一个 bootstrap 区间;小样本区间的下界跨过零,就意味着「暂时测不出差异」,这也是一个正当的结论。