Show HN:Claude 的「承重」词汇
文章摘要
Louis Abraham(HN 用户 Labo333)做的这个页面只有一屏,没有折叠、没有滚动叙事,却是本期最扎实的一次数据分析。它回答的问题很具体:如果只看 GitHub Pull Request 描述里用的词,AI 写的文本在过去一年半里占了多大比例,又长什么样?
结论先行:把 2025 年 1 月以来的 GitHub PR 描述按「用词方式」聚成 10 类,其中一类在 2025 年初只占语料的 0.7%,到 2026 年 8 月的最近四周已经占到全部「人类署名」 PR 的 39.5%,并且还在以每周约 +1.2 个百分点的速度上升(最近 12 周的最小二乘拟合)。这一类最具代表性的词,任何用过编程 agent 的人都会觉得眼熟——排在最前面的依次是 load-bearing(承重的)、plainly、quietly、refusal、survived、re-derived、halves、asserted、nobody、genuinely、deliberately、premise、refuses、pre-fix、outright、byte-identical、ruling、genuine、handed、carries、died、carrying、nowhere、disagreed、asymmetry,再往后还有 seam、chokepoint、backstop、lever、vacuous、wedged、provably、falsified、mutation-checked、byte-for-byte、self-heals、rides 等等。
数据是怎么来的,作者写得极其坦诚。他先讲了一个失败:最自然的数据源 GH Archive(GitHub 公共事件流的归档)已经不能用了——2025 年年中以来这个流几乎只剩 PushEvent,2024 年 8 月 12 日某一小时里有 13,555 个 IssueCommentEvent,而 2026 年 8 月 10 日同一小时只有 86 个;而 push 事件里没有文本,GitHub 在 2025 年 10 月移除了 commit 数组。所有镜像读的是同一个流,所以谁都修不好。项目的早期版本正是建在归档上,当时报告 load-bearing 出现在 17 篇文档里——错了 158 倍,因为评论从流里消失了,不是从 GitHub 上消失了。
真正能用的是 GitHub 的 search API,原因只有一个:created: 接受时间戳而不只是日期,所以窗口可以只有几分钟宽,而且每条返回都带完整正文。做法是每天抓 10 个五分钟窗口,从一天的每个 2.4 小时区块里各抽一个,精确到秒。这个「精确到秒」不是讲究:早先的版本用 5 分钟的整数倍,而那恰好是 cron 触发的粒度,于是每个窗口都正好开在自动化批量开 PR 的瞬间。抽样种子由日期决定,所以整个语料只凭日期就能复现;每天一个约 1.4 MB 的不可变文件,提交后永不改写——仓库的历史就是抽样的历史。查询本身带两个过滤器,把一页里可用的描述从 43 条提到 97 条:按名字排除四个 App(pull、dependabot、renovate、github-actions,它们占 App 署名正文的 90%),以及排除空正文(占全部 PR 的 45%,search API 没有「是否为空」限定符,改用「正文里必须包含十个功能词之一」精确实现)。作者还诚实地标了一条局限:2026 年的一天有约 46 万条匹配 PR,一个五分钟窗口约 1250 条,而一页只有 100 条——所以这是抽样而不是枚举(search API 无论匹配多少最多只返回 1000 条);均匀布点意味着这不是时间上的偏差,只是随着 GitHub 变忙,有效窗口宽度在收窄。截至发布时的规模是:603 个采集日、其中 595 天构成 85 个完整周(2025-01-06 至 2026-08-17)、461,121 条描述、51,079,244 次词出现、19,798 个越过频次下限的词。
清洗规则同样有讲究。「词」被定义为「包含至少一个字母的字母、数字、斜杠、连字符和下划线的连续串」,所以 load-bearing、snake_case、--all-targets、src/main 都能完整存活;不做词干化、不做 n-gram、不用停用词表。链接坍缩成域名、HTML 标签整体保留,因为先按标点切分会把 href 这种碎片顶进某一类的特征词里。破折号(em dash)是唯一一个不要求含字母的例外,而它当之无愧:2024 年初每万词出现 0.2 次,2026 年中是 123 次。描述的中位长度是 65 个词。被丢掉的是按登录名形状判断的非人类账号——以 [bot] 或 -bot 结尾的,加上 copilot。注意这一点很关键:所有明显的机器人都被剔除了,剩下的 39% 是署了人名的 PR。
模型部分刻意做得很朴素:k 个「写法」各是词表上的一个固定分布,每条描述被硬分配给最近的那一个,距离用的是词频该用的 KL 散度(也就是把平方距离换成 KL 的 k-means,长描述对中心的拉力更大)。作者反复强调一件事:模型里没有任何时间参数。一组中心覆盖整个窗口,拟合里没有按周的参数,也没有任何自由度去描述或安放一个趋势。页面上画出的每条曲线都是事后归因——每条描述只凭自己的词被分类,周是之后才数出来的。所以「某种写法在上升」这件事,只可能是因为人们写的东西真的变了,别无出处。训练用 KL 下的 greedy k-means++ 加 Lloyd 迭代跑到精确不动点(没有容差要挑,也没有迭代次数要猜),跑 8 个种子取代价最低的一个发布——但作者明说多次重启不是为了找到更好的答案(代价和最终报告的份额相关性只有 +0.03),只是为了让每日任务总能发出点东西。页面声称的是「这一类出现了」,所以有两个阈值去校验而非挑选它:前八周低于 2%,后八周不低于 20%。作者还给出了无条件拟合的到达率作为证据:32 次单独拟合里有 31 次到达,剩下 1 次里领先的那一类和另一类混在了一起。
词的排序不靠模型,靠计数:因为分配是硬的,每次词出现都恰好属于一类,所以可以直接算「类内频率 / 类外频率」的比值。分母里加了半个 MIN_AUTHORS 的伪计数,作者说这个伪计数是「排名」和「抽奖」之间的差别——没有它,榜首会由 4200 万分之二到七这种量级的计数决定,一个类外出现三次的词能压过一个类外出现 158 次的词,差距不比自身噪声更大,而且两个词都罕见到没人会注意。load-bearing 类内出现 929 次、类外 82 次,比值 39 倍,稳居第一;页面上字号按比值的对数缩放,到第 1000 个词降到 5 倍。点选某个词会把图表换成这个词自己的历史,并且用「每百万词出现次数」这个比率而不是原始计数——因为语料每周大小不同(最瘦的一周 380,404 词,最肥的一周 1,406,687 词),画原始计数等于把语料的增长画成词的到来。
作者还专门列了一张「任意选择」的表,标注哪些常数是测出来的、哪些是判断、哪些看着答案选的:K=10 明确标为「看着结果选的」,SEED 标为「有后果的——种子会移动头条数字」。剩下的 9 类里,其他 7 个的特征词一看就能认出是什么:一类是构建/测试命令行参数(--frozen、--locked、--test-threads、--all-features),一类是 WebKit 的 CI 队列名(mac-wk2、ios-sim、wpe-wk2),一类是西班牙语/法语/葡萄牙语(que、para、dans、mudan),一类是 PyTorch 社区的 reviewer 用户名加基准单位(ns/op、b/op、bfloat16)以及 seems/basically/perhaps/probably 这类人类的迟疑用语,一类是 Qodo/PR-Agent 生成的「企业级」形容词堆砌(comprehensive、maintainability、scalable、streamlined、enterprise-grade),一类是 Home Assistant / Expensify 的模板 checklist,还有一类是 Renovate/Nix/Snyk 的自动化模板字段。
页面本身也值得一提:Bauhaus/瑞士平面风格(作者说 Claude 给这套设计起名叫 “Rasterfeld”,即「网格之场」),黑底配三原色,十二栏网格,一千个词在自己的格子里滚动而不是把图表推下屏幕,词是点选而不是悬停(这样选中状态会保持,双手离开鼠标也能读面板)。整站没有构建步骤,数据由 GitHub Actions 每天更新,语料和站点分居两个分支(Pages 站点上限 1 GB,而语料每天长 1.4 MB)。
HN 评论精华
这条 Show HN 拿到 679 分、320 条评论,是本期讨论最热闹的一条。有意思的是,评论区几乎没人质疑方法论,全都在吐槽 Claude 的文风——数据只是给了大家一个共同的靶子。作者本人(Labo333)全程在场,回帖非常密集,并根据反馈当场加了搜索框、把采集量提到每天 1000 条 PR、加了浏览其他聚类的功能。
- 作者最重要的一条澄清(回复 MaxwellM 询问能否扩展到句式、长度、免责语等其他 Claude 习惯时):「先声明一下:我不是在追踪 Claude 的口癖,我只是发现某一簇特定词汇在增长。真要追踪 Claude 需要有标注数据。我试过用模型发布日期在结构化模型里去约束这些聚类,结果不够有说服力,所以最后把模型大幅简化了。」dmd 建议他把这点写得更醒目:「对做过这类数据分析的人是显然的,但我给不少人看过之后他们都很困惑——『啊,load-bearing 和 genuinely 说得通,可其他这些词他是怎么挑出来的?』」他还补了一句精辟的评价:这个排序有点「德州神枪手」的味道——排在上面的词是因为它们就是这么排出来的;而
load-bearing最终排到第一,恰恰是这套方法有效的证明,因为我们所有人事先就知道它是个 Claude 味儿的词。 - 关于这些词到底是不是 Claude 发明的,讨论相当细致,结论基本一致:不是发明,是滥用。QuercusMax 和 rsanheim 指出
seam出自 Michael Feathers 2004 年的《Working Effectively with Legacy Code》,定义是「一个你可以在不修改此处的前提下改变程序行为的地方」,比 LLM 早二十年;thewebguyd 说load-bearing在运维圈一直在用,模型大概是从土木工程文本或 sysadmin 博客学来的;sarchertech 说他在 LLM 之前唯一听过的用法是「load-bearing bug」(承重 bug)。empath75/cillian64 给出了最被认同的总结:「Claude 用的一般都是真实的行话,只是用得比人类频繁太多。这就像有一个写作风格很特别的同事,本来只是有点烦,突然间感觉半个互联网都是这个人写的,就变得非常烦。」empath75 还直接点题:「LLM 用这些词的频率和人类用它们的频率之间的分布差异,几乎就是这个链接的全部内容。」 - 反方 tengbretson 问:为什么大家这么揪着
load-bearing assumption不放?它其实是个语义密度很高的说法。回帖里 tesin 的回答最有说服力:单独用是没问题,但当它是一段两页长的胡话的第一句时,它就成了「你即将开始受挫」这件事最容易识别的信号;人类极擅长模式识别,而 Claude 在开始沟通失败时的方式极其重复——问题不在具体的措辞,在于那个过程本身触发了条件反射。stonogo 更狠:「它什么都没说,因为任何『不承重』的假设都无关紧要、根本不会被讨论。它就是噪声。」ruuda 给了整个讨论里流传最广的一段观察:「load-bearing也许不是最好的例子,但 Claude 到处都在用这种拟人化的装饰性同义词。Claude 的 struct 不『有』字段,它们扛着字段;它的程序不『记日志』,它们叙述;参数不是在命令行上『提供』的,它们骑在命令行上;模块不『依赖』其他模块,它们坐在上面。」black_knight(有博士学位)贴了他当时屏幕上的真实输出——大意是「有纤维的那一侧把它的顶石折进了现有的名字里,所以那些 kind 是不对称的」——然后问:「把一块顶石折进一个名字里,到底是什么意思?」他后来解释,据他观察「capstone」是 Claude 用来指代「我当前的目标(如果它认为这是个令人满意的结果)」的词。 - 由此引出了本帖最有思辨性的一支:这种难懂是 RLHF 的副作用,还是模型「太聪明」? Jordan-117 提出了这个二分。回帖压倒性地站在前者。dragonwriter:「不是后者,它就是过度冗长加上蹩脚的用词选择,和许多糟糕的写作者一样;而且和这类写作者一样,它糟糕的选择落在可辨认的、反复出现的模式里。」zahlman:真正远高于平均智力的人不会为了信号智力而这样写。HarHarVeryFunny 认为是模型坍缩——RL 会收窄模型生成的多样性,把输出往被奖励的目标上引,「有点像给马戴上眼罩」,而 RL 是很粗糙的工具,会影响整个模型。zbentley 提了个他自己称为「无法证明」的猜想:在技术写作上,RL 过程有一个开放式的质量梯度(教科书和一手文档优于老 Stack Overflow 答案和小众博客),这种开放性导致某个极小的、被打成「质量≈无穷」的语料被极度加权,而那个语料里带着非常具体的语法怪癖,Claudish 就是这么来的。ricksunny 提了个社会学解释:理性主义社区和 Anthropic 的社交图谱距离,读 Astral Codex Ten 的人都懂——猜猜哪个网站是「Claude 口癖」最厚的水库。gwd 顺着补充:
load-bearing在 lesswrong 这类社区本来就是常用语,「它是会以 Claude 为载体破圈,还是会因为没人想听起来像 Claude 而从那里消失,我们只能等着看。现在还有多少小孩叫 Elvis?」 - 另一支很有意思的争论是 sergey_v 提出的:「因为我不懂所以它不是在往下讲,而我很聪明」这种想法很容易站不住脚。他说自己有个常见的会话暂停/恢复配置,有时会产出完全无法理解的 markdown 文件,但一个新的 Claude 会话能完美接手,细节丝毫不差;「如果 Claude 懂 Claude、Claude 懂人类、而人类不懂 Claude,那『Claude 是山顶洞人』这个说法就不太站得住」。watwut 回敬得很干脆:「这很简单。让事情说得简单,是所谓更聪明的那一方的责任。写出不知所云、绕来绕去的东西比写出容易理解的东西更容易,人也一样。」larnik 给了个折中的比喻:他把 Claude 难懂的输出当作一种编码/加密——Claude 知道怎么解,人类不知道;他在用了 LLM 的新手工程师写的设计文档里经常看到这类东西,一堆连字符连起来的两词短语,本该被定义或干脆换成大白话;而只要提示一下,Claude 完全能把这堆胡话翻译回来。
- 人类会不会开始学 LLM 说话,是投票最高的一条主帖(nater5等)引出的话题,实证材料相当丰富。threecheese 报告了一个真实的组织后果:「在企业里,我们已经在采用这些词了。
Seam——一个我以前从没听人用过的词——现在不仅是我们描述系统/工作流/组件之间边界的默认说法,它已经被写进了我们组织的角色与职责描述里。我现在骄傲地拥有好几条 seam,正考虑给它们起人名,我的库存 API 和它们的客户端之间那片空地也许可以叫『Karen』。」viccis 说同事已经开始说「某人在这个工单上加了 color」;mplanchard 说他有个同事现在无时无刻不在反讽地用load-bearing,「非常好笑」。cpeterso 报告了反向效应:他开始改写自己的措辞来避开 Claude 味儿的词,因为不想让人以为他在粘贴 AI 输出;datsci_est_2015 说他刚写下一个「不是 X,而是 Y」的句式就内心一阵尴尬。starbugs 提出了另一种可能的演化方向:「或者我们会反其道而行之,故意使用 LLM 绝不会用的词,来标识谁的内容值得一读?」而 altmanaltman 是唯一一位系统性的反对者,他认为「人会开始像 AI 那样写」是个方便的挡箭牌——「我用 AI 写的,但我声称我现在写得像 AI 是因为我天天跟 AI 说话」。dgunay 则给出了最灰暗的版本:「每个人都有自己独特的行话组合,但现在就好像你有一千个同事,全是同一个人,说话一模一样,而恰好他们的文字读起来很磨人。而且下班也不停——同一个人跟着你回家,出现在广告文案里、留言板评论里、垃圾邮件里,某些情况下甚至出现在你所爱之人的来信里。」 - 还有一些跨模型的对照。applfanboysbgon 抱怨 Sol 的口头禅是
unusually(不寻常地):「每样东西都是 unusually 什么。unusually good、unusually efficient、unusually cacheable、unusually decisive……我很惊讶还没见过 unusually unusual。我把它加进违禁词指令之前,搜索聊天记录里的unusually能翻出我每一次对话。」jimmaswell 注意到 Codex 从没说过像 Claude 那样异星的话,怀疑是它对呈现给用户的用词训练得更好,或者它本身就更偏向平实语言。ricardobeat 给作者提了个玩笑式的建议:用 Gemini 重写一遍 README,免得它读起来正好像你在批评的那个东西;Philpax 反对:「README 保持原样是个好梗。」 - 一支实用向的讨论围绕能不能治。josefresco 指出 Claude Code 的 Output Styles 就是为此设计的,但几位实测者都说不管用:torarnv 说「它还是吐出无法理解的胡话和 load-bearing 主义,有人调出真正有效的 output style 吗?请分享」;sunaookami 说设成 concise 对输出毫无改变;redak 说这个方案「是给枪伤贴创可贴,真正的解法是重训模型」。ziml77 试过让 AI 自己去掉 AI 味儿:即便能写出一份描述所有 AI 口癖的 skill 文件,输出听起来还是像 AI,ChatGPT 和 Claude 结果类似。smj-edison 补了个更妙的:他让一个子 agent 拿着相当严格的写作指南去审查自己的文字,「它什么问题都没看出来」。ricardobeat 一句话点明症结:Claude 通常给自己的写作打很高的分,这在你想让它换个写法时是个大问题。
- 最后是关于为什么不换个模型(bogdanoff_2 问)的现实回答,全部指向同一件事:georgel 说公司只让用采购的工具,「至少对我来说,我被 Claude 绑住了」;threecheese 说公司只有 Claude(微软 Copilot 不算,而且也不该算),「想象一下被『激励』去大量使用一个工具,而那个工具会产出几千行你必须读的古英语,你也会抱怨的」。