发布一周后那句"它变笨了"
2026年9月22日,Anthropic发布了Claude Opus 5.5。
不到一周,开发者论坛就开始流传"它好像变笨了"的抱怨。
这种话年年都有,Sonnet 5、Astra 发布后都出现过同一波声音。
可从来没人拿出过一份干净的发布日基线来对照。
livenerf 想做的就是这件事:在模型上线的第一天把钟拨好。
它是一个跑三十天的追加式基准,只回答一个问题。
这个问题是:模型发布之后,到底有没有悄悄变差。
作者把它放在 GitHub 上,HN 一晚就涌出两百多条评论。
评论区立刻分裂成两派:一派坚信模型被暗改,一派说是新鲜感褪去。
livenerf 的价值不在站队,而在给这场口水战一个能被检验的底座。
它不证明模型有没有被改,它只让"有没有变"这件事可测量。
这正是过去所有"变笨"争论最缺的那一块拼图。
作者写得很直白:以前每个结论都停在感觉对感觉。
有了发布日基线,争论才第一次有了共同的事实起点。
证据强度不同,结论的分量就该不同。
这恰恰是 livenerf 想补上的那块空缺:可被复算的测量。
"暗改"到底有没有被坐实过
在谈仪器之前,得先看清"暗改"这件事的历史账。
HN 评论里有人翻出了两份 Anthropic 自己的事后报告。
2025年9月,一小部分 Sonnet 4 请求出现了输出质量下降。
官方当时的措辞是:绝不因需求、时段或负载降低模型质量。
2026年4月,Claude Code 默认推理努力从高被调成了中。
伴随它的还有一个缓存 bug 和一段啰嗦提示词。
Anthropic 说模型本身没退化,Claude API 也没受影响。
也就是说,用户感觉到的掉档是真的,但根因是 bug 和产品默认值。
还有一条更直接的证据来自 OpenAI 一位工程师的推文。
那条推文来自 OpenAI 工程师 Tibo 的 X 账号,后来被回退。
他承认调过"juice",也就是推理努力档位的映射值。
一段时间里,标着 xhigh 的其实跑的是 high。
这事后来被回退,但它坐实了档位映射确实会被动。
另一些说法则停留在猜想层面,没有同等证据。
有人猜发布会后悄悄量化降精度以省算力。
有人猜请求按内容、档位、信任度被路由到不同模型。
这些可能为真,但目前都没有可被检验的测量。
livenerf 的态度是:把"有没有变"和"为什么变"分开。
它只负责前一半,后一半留给有了数据之后的人。
把已坐实的 bug 和未证实的猜想并列,本身就是一种诚实。
它不替任何一方背书,只把"有没有变"从口耳相传拉到数据里。
争论一旦有了共同数字,就不必再停在感觉对感觉。
把不可确定性关在门外
仪器要能看出变化,得先保证变化只可能来自模型本身。
问题在于,你没法让 Opus 5.5 两次给出一样的答案。
采样参数早就从 API 里消失了,思考也关不掉。
既然模型这一端没法确定性化,作者就反过来冻结别的所有东西。
提示词是冻结的,每一轮跑的都是同一段系统提示。
CLI 是钉死的,Claude Code 一更新就会改掉测量框架。
所以脚本会拒绝任何与记录版本不符的 CLI。
评分器是纯函数,不在模型里跑,也不会漂移。
代码题由框架拿到沙箱里跑隐藏测试,模型不执行任何东西。
努力档位永远显式传入,从不留在默认值上。
每次调用都是密封的:不带工具、不带 MCP、不带记忆。
工作目录固定为空,只跑一轮,任何额外加载都算 bug。
原始日志是追加式的,只增不改不删,永远可复查。
这些约束合起来,把"模型以外"的变量压到接近零。
于是剩下的漂移,就最可能是模型或服务路径变了。
这种"冻住一切非模型变量"的思路,是整个仪器的骨架。
它不追求让模型确定,它追求让分布可信。
密封性还有一道探针,开工前会打印 READY 或失败项。
工具、记忆、CLAUDE.md,一个都不许带进每次调用。
这种偏执是为了让两次跑之间的差异只能来自模型本身。
作者把这种约束叫"让别的所有东西确定性化"。
只留"有时答对"的那批题
题目选不好,仪器再精密也测不出变化。
一道模型永远答对的题,看不出掉档,还白烧 token。
一道永远答错的题,同样看不出退步。
真正有信息量的是那些"有时对有时错"的题。
在常见的 logit 偏移模型下,通过率为 p 的题每样本带 p(1−p) 信息。
所以标定阶段就专挑这种落在中间地带的题。
livenerf 用四个基准筛了2336道题,每题先跑四样本。
Opus 5.5 首试约93%正确,97% 的题要么总对要么总错。
只有78道题是"有时对",它们组成了正式面板。
这些筛选数字都出自 livenerf 仓库的标定文档。
这里有个被作者量出来的选择偏差:被选中的题看起来比实际更难。
在新样本上,它们的通过率从 54.7% 升到了 62.0%。
于是功效计算用的是升之后的通过率,而不是筛选用到的旧值。
面板一旦定下就锁死,每日跑的题永远不变。
锁面板是为了让纵向比较有同一个固定参照物。
设计脚本会把面板、节奏和最小可测效应一并写进文档。
这套选题逻辑本身也是 livenerf 想被 hostile 审视的部分。
它不藏选题过程,反而把偏差量化后摊在明面上。
一道题只有可被精确判分、落在三到七成区间、又够便宜,才有资格进面板。
题库还埋了一个 canary 串,用来追踪数据有没有被搬运。
canary 串沿用 BIG-bench 的约定,README 里写明了完整 GUID。
GPQA 的题按作者要求不入库,只按哈希钉在本地缓存。
选题标准三条:可精确判分、落在三到七成、每天跑得起。
面板越小越省,但太小又测不出细变化,这是个权衡。
作者把面板的哈希公开,题面本身却保密。
用配对与误差棒说话
有了固定面板,剩下的问题是怎么从分数里读出"变没变"。
livenerf 不看单次输出好坏,它看分布的移动。
主指标是面板每题相对基线的配对分差,再按题聚类算标准误。
配对是为了让题目难度从比较里自动消掉。
每周跑同一批题,和它们自己的发布周基线比。
评分是精确匹配,从头到尾不用 LLM 当裁判。
因为一旦用模型判分,裁判本身也会漂移,测量就失真了。
统计方法直接沿用 Anthropic 自家那篇"给评测加误差棒"的论文。
那篇论文编号 arXiv 2411.00640,第一作者是 Evan Miller。
作者特意强调:没有自造口径,省得有人挑统计方法的刺。
这意味着所有误差棒和判定阈值都是学界已有的、可复核的。
次要信号里作者最在意的是每样本的输出 token 数。
如果模型偷偷开始少想,这里往往比准确率更早显形。
上一轮验证里,努力档一降,token 数比准确率先掉一大截。
所以这张表里,token 列和准确率列是并排的两只眼睛。
把主指标和次要信号分开看,是为了不漏掉"静悄悄的退化"。
一个模型可以准确率没动,却在偷偷缩短思考。
token 数列在准确率没动时,常常先露出马脚。
这种双信号设计,比单看准确率更能抓早退。
改了才算改的硬规则
有了指标,还得有一条规定死"什么算一次变化"。
livenerf 把这条规则预先注册、写进 git 时间戳。
基线是前十天,之后是两个十天窗口。
变化必须在两个连续窗口里都越过99%置信区间。
光统计显著还不够,效应量至少得有三点。
控制臂也动了的话,同样不算数。
控制臂是同一套框架每天跑的 claude-opus-5。
如果两个模型一起动,那多半是框架或平台变了,不是 Opus 5.5。
这条规则是机械执行的,没有人去读茶叶渣。
窗口每天向前滚,不是跑一次就定论。
作者在 HN 里说,十天不是神圣数字,将来有长数据会重校准。
这段解释出自作者 ninjahawk1 在 HN 评论区里的直接回复。
更短的窗口更快出结果,但噪声大得多。
所以宁可慢,也要等两个窗口连续越过阈值。
这是为了把"喊狼来了"的概率压到最低。
预先注册的意义,就是让规则先于数据存在。
规则一旦写进 git,谁也不能事后改门槛。
两个窗口连续越过,是为了挡住一次性的抖动。
三点门槛挡的是统计上显著但实际无感的变化。
先拿已知退化验证仪器
一个仪器在报 null 之前,得先证明它看得见已知的信号。
livenerf 在基线之前先做了一组正控制实验。
它把努力档从中、低各跑一遍,和高档对照。
结果是仪器确实能分辨出已知的退化。
更有意思的是,退化在 token 数上比准确率更显眼。
努力低时,输出 token 掉了约62%,准确率掉 8.3 分。
努力中时,token 掉约26%,准确率掉 4.2 分。
这张表也成了"先信仪器再信结论"的证据。
配套的还有一次 A/A 检查,确认误差棒是诚实的。
这些都写进 VALIDATION 文档,带可复跑命令。
也就是说,在任何一个"没变化"结论被信任之前,仪器先自证过视力。
这一步是过去很多"变笨"争论里没人做过的。
没验证过的 null,和"我也没感觉变"一样没分量。
livenerf 把验证摆在前置位,堵的就是这条。
正控制做得过,null 才敢信。
A/A 检查是确认仪器不会无中生有地报变化。
这套验证写得很细,连命令都附在文档里。
| 努力档 | 准确率变化 | 输出 token 中位 |
|---|---|---|
| 低 | −8.3 ± 4.5 分 | −62% |
| 中 | −4.2 ± 3.9 分 | −26% |
| 高(基线) | 0 | 0 |
仪器也有看不见的盲区
仪器再严谨,也有它看不见的地方,作者都写了下来。
最硬的一条是:它分辨不出同族模型的小幅替换。
把 Opus 5 换进 Opus 5.5 的位置,99% 下看不出来。
这不是仪器坏了,而是这种量级的变化低于它的分辨率。
更深的盲区是:它只能测公开面板暴露的行为。
作者自己说,理论上 Anthropic 能认出这些题并区别对待。
外部观察者没法证明这没在发生。
这也是他承认需要更强开源模型的原因之一。
还有一条根本限定:测的是订阅版 Claude Code,不是裸 API。
而大多数"变笨"抱怨,指的恰恰是订阅版这条路径。
所以仪器对得上用户体感,但不能等同于 API 模型本身。
作者还提了一个未来补丁:加私有或定期刷新的面板。
目的是让模型更难只对基准题做手脚。
但他不愿悄悄换现在的面板,固定仪器对纵向比较更重要。
这些局限不是免责声明,是仪器可信度的一部分。
这些盲区都写进了 livenerf 的 EVAL_CARD 文档。
一份把盲区写在前面的测量,比一份声称万能的更值得信。
看不见的地方被标出来,看得见的地方才更敢信。
承认分辨不出同族替换,反而让其余结论更硬。
测的是订阅路径,这点和用户体感对得上。
未来补丁的方向,是把面板做得更难被认出来。
代码与每天的一次跑动
整套流程的入口是一串很朴素的命令。
克隆仓库、装依赖、钉版本,就能把仪器架起来。
作者把 CLI 钉死这一步标成"非可选"。
因为 CLI 一变,框架就变,看起来就像模型变了。
钉好之后是标定、设计、验证三步,每步都有独立入口。
标定筛题,设计定面板和节奏,验证先跑正控制。
设计一旦锁定,每日脚本会拒绝任何面板变动。
之后就是一个每天跑一次、跑三十天的计划。
额度按订阅的百分比表读,不抢正常使用的额度。
跑完用一条命令算配对分差和预注册判定。
每条命令都对应文档里的一个阶段,没有黑盒。
git clone https://github.com/ninjahawk/livenerf cd livenerf uv sync export DISABLE_AUTOUPDATER=1 claude --version | awk '{print $1}' > CLAUDE_CLI_VERSION python -m livenerf.usage python -m livenerf.benchmarks.calibrate run --weekly-points 12 python -m livenerf.design --max-weekly-points 10 --samples-per-day 1 --write python -m livenerf.design --max-weekly-points 10 --lock python -m livenerf.validate run --weekly-points 8 python -m livenerf.preflight --probe 7 5-23 * * * cd /path/to/livenerf && bash scripts/daily.sh python -m livenerf.analysisnull 也要公开
livenerf 还有一个少见的承诺:null 结果也公开发。
"没变"和"变好"都会和"变差"一样响亮地报出来。
这和那种只挑坏消息或只挑好消息的基准很不一样。
作者强调,仪器测的是任一方向的变化,不预设机制。
发布周可能是最差的一周:新服务栈、容量紧、首发 bug。
2025 年那批质量事故,最后查出是基础设施 bug。
所以基线只是参照点,不是地面真值。
这套做法把"模型有没有被暗改"从猜测推向了可证伪。
它给不了一个"是被改了"的终审,但它给了上诉的依据。
等三十天跑完,第一个结果会落在十天窗口之后。
到那时,"它变笨了"这句话,第一次有了能被复算的数字。
在那之前,作者只承诺一件事:钟已经拨好,每天都在走。
等到第一个窗口跑完,争论才会有一个共同的数字。
在那之前,所有的"变笨"都还只是感觉。
它不保证查出问题,只保证查得出问题。
对一个跑三十天的仪器,耐心本身就是方法的一部分。