Claude 越升级越不好用?Anthropic 技术栈的「五宗罪」卡在哪儿
这几天 X 上一条帖子,把用户对 Claude 的集中不满放到了一起:文本和代码被加入机器可读标记,Sonnet 5 的体验没有跟上升级声势,Fable 5 卖得更贵却难言更强,长上下文只用到 20%–30% 就开始掉线。单看每一条都像孤立问题——但放进 Anthropic 的技术栈里,它们恰好卡在生成、计算、分层、上下文、运行时五个环节。
这几天 X 上一条帖子,把用户对 Claude 的集中不满放到了一起:文本和代码被加入机器可读标记,Sonnet 5 的体验没有跟上升级声势,Fable 5 卖得更贵却难言更强,长上下文只用到 20%–30% 就开始掉线。单看每一条都像孤立问题——但放进 Anthropic 的技术栈里,它们恰好卡在生成、计算、分层、上下文、运行时五个环节。
用户感知到的是一堆零散的「变难用了」,但每条抱怨都能在技术栈里找到一个精确的落点。
自然语言有冗余可嵌信号,代码的低熵位置几乎没有编码容量。
effort 让型号与能力脱钩,一次请求实际投入多少算力变得不透明。
常规任务上 Opus 已进平台区,Fable 的剩余优势无法转化为体验差。
1M 是容量不是状态一致性,200K–300K 处开始遗漏与混乱。
错误进入环境后自我繁殖,模型开始分析自己创造的数据。
五张卡按技术栈环节自上而下排列,与原文「模型怎么生成、推理时花多少计算、型号怎么分层、上下文为什么失效、Agent 能力为什么打折」一一对应。
文本水印的思路,是利用自然语言的生成冗余:同一个意思可以换词、调语序,模型在多个可接受 token 之间轻微改变采样概率,积累出可检测的统计规律。这套逻辑在代码上遇到了硬约束。
变量声明后只能引用同一个名字;JSON 的引号、括号受严格结构约束;函数参数必须匹配接口。一个 token 变成另一个,可能就不是「另一种表达」,而是直接改变行为。
语义接近的候选多,可换词、可调序,拥有生成冗余,能在可接受 token 之间嵌入信号。
大量低熵位置,名字、括号、接口、路径不可替换,一个 token 变化即行为改变,编码容量极低。
一个诚实的注脚:Anthropic 未公开标记算法如何改变采样,Claude Code 的质量变化不能直接归因到某一套水印头上。这里确定的是结构性趋势——代码生成正同时承担语义、协议、格式、安全、来源标记多重约束,而它吸收额外约束的自由度远小于自然语言。
过去谈 Sonnet、Opus、Fable,是几个固定的能力点。加入 adaptive thinking 以后,同一个模型可以落在不同的 test-time compute 区间——用户付的是型号的价,模型实际投入的算力却是一个范围。
较快形成判断,更快执行,但可能在证据不足时过早动手。
同时追踪几条调用链,延迟决策,直到出现更明确的信号。
继续探索、运行测试、检查依赖,减少过早执行的概率。
effort 调节的不是单纯的 thinking 长度,而是 Agent 搜索树允许展开的规模——读哪些文件、追哪条链、什么时候该停下来。
这会直接改变模型分层。一个普通 coding 任务对 Opus 已经不难,提高 effort 后 Opus 很快进入性能平台区;Fable 基础模型再强,也没有多少剩余难度可以转化成用户可感知的体验差——但价格差从请求那一刻就在支付。
所以高阶模型出售的东西正在发生变化:不再是「这一轮答案更强」,而是更长轨迹里的额外可靠性。问题是,这种优势必须等任务足够长才能展开。
看到 1M context,很容易把它当成一块巨大的工作内存。因此当 Claude 只用到 200K–300K token 就开始遗漏、反复甚至状态混乱时,会显得非常反直觉。但 context window 衡量的从来只是容量——它不保证模型能一直分清「现在哪个版本算数」。
衰减位置基于用户反馈的「只用到约 20%–30%,后面的能力就开始往下掉」描述,为定性标注而非官方测量曲线。横轴为上下文占用比例。
长 Agent 会话不是一篇静态文档,而是一份不断追加的执行历史:文件被改了几次,bug 从「缓存问题」被重新判断为「并发问题」,测试先失败、再通过、又因新修改失败。旧内容不会随状态变化自动删除,新内容只是继续追加在后面。
问题已经不只是 retrieval。模型不仅要找到相关信息,还要判断这些信息现在是否仍然有效。数据库可以靠版本号、事务、显式字段维护当前状态,自然语言 context 没有这种结构——它更接近 append-only log,模型必须自己从事件顺序里恢复出「当前世界」。
当 context 继续增长,compaction 看起来是自然办法:把旧历史压短,再继续执行。但 Agent 轨迹的压缩,和普通摘要完全是两回事。
少掉一个例子,只是信息完整度下降,通常可以接受。
漏掉一条仍有效的限制,后续执行路径直接改变,代价不可控。
compaction 要解决的,不是「哪些内容重要」,而是「哪些内容现在还算数」。一段历史里可能同时存在已完成的任务、被推翻的判断、仍然成立的接口约束、过期的测试结果和临时 workaround。压缩器需要把所有时间状态重新整理成一个能继续工作的表示。
所以 Git、测试、任务文件、memory 在长时 Agent 里越来越重要。它们的意义不是让模型「看到更多」,而是把需要长期成立的状态从自然语言历史中移到外部系统:用明确的当前版本、可验证的结果、结构化的完成状态,替代模型对事件顺序的自行推断。Context 可以保留丰富历史,但不能长期承担全部状态管理职责。
普通聊天里,模型答错一次,错误停留在输出文本。Agent 会修改代码、执行命令、安装依赖、调整配置,再读取自己制造的新结果——错误从判断错误,变成了环境变化。
错判:把一个 bug 当成缓存问题。
修改:调整缓存逻辑、重试机制和几个调用点。
制造:测试随即出现一批新的异常——它们是真实的,但不是原始 bug 产生的。
误读:新异常被当成独立问题,逐一修补,而不是回滚检查原始假设。
偏航:每一步局部操作都有依据,但整条轨迹已经偏离原始问题。
这是对原文场景的重构,不是 Anthropic 官方对具体故障的复盘。核心机制在原文中概括为:模型开始分析自己创造出来的数据分布。
此时单步正确率已经无法兜底。更关键的是错误进入环境以后,系统能不能检测、归因、恢复——git diff 告诉模型刚刚发生了什么,checkpoint 和 rollback 限制错误扩散,独立 evaluator 在模型自己的解释之外提供一道校验。这些组件的本质,是给 Agent 增加闭环纠错能力。
两个最终通过率接近的模型,真实体验可能完全不同。一个前期判断很准,但一旦走错就沿错误路径一路修补;另一个单步未必更强,却能更快发现某次修改制造了新问题,然后回滚重选路径。只看终点,很难区分这两种行为。
如果 Agent 任务继续拉长,更值得注意的是另外一组信号:
当前版本、完成状态、生效限制交给 Git、测试与任务文件,别让自然语言历史独自承担状态管理。
checkpoint + rollback 不是防守,是让 Agent 敢于探索复杂路线的底气。
独立 evaluator 能在模型自述之外指出「这个新错误来自上一轮修改」,打断自我繁殖的循环。
模型能力决定每一步判断的上限;长 Agent 能不能稳定工作,越来越取决于另一套能力——状态是否清楚,动作是否可验证,错误是否可回滚。
五宗罪不是 Anthropic 的倒退,而是整个行业从「单轮跑分竞赛」转向「轨迹可控性竞赛」的预演。Benchmark 测的是初始化好的环境里能否完成任务,真实 Agent 的环境会随自己的动作不断改变——下一轮竞争,拼的将是系统在几个小时、几十轮工具调用、几次状态压缩之后,还能不能维持一份可信的当前世界。