当想得更多反而让答案更差。
把思考预算往上拧,是所有人都信得过的那一个旋钮:更慢、更贵,但更稳妥。而在四类可被识别出来的任务上,它可测地并非如此——准确率随推理长度上升而下降,而这几类任务恰恰就是智能体工作所呈现的形状:一段塞满无关检索文本的提示、一个「显眼特征恰是错的」的判断、一长串需要同时握住的约束。实际后果是:「effort: high」是一个按任务形状做的决定,而不是一个默认值;而只在单一 effort 档位上跑过的评测,看不见下一次升级将会发布的那个回退。
把这个发现说得足够窄,窄到能据以行动。
那篇论文是 Inverse Scaling in Test-Time Compute(arXiv 2507.14417,Gema、Hägele、Chen、Arditi、Perez 等)。方法比结论标题更要紧:作者不是去观察「长答案与错答案相关」,而是在构造出来的任务上改变推理长度,并把准确率当作它的函数来测量。这让这段关系在你真正在意的那个方向上成为因果——是额外的计算在造成损害,而不只是在标记难题。
他们搭了四类任务,并在其中报告了五种不同的失效模式。四类是:带干扰项的简单计数、带虚假特征的回归、需要跟踪约束的演绎,以及一组高级 AI 风险评测。失效模式按模型家族分化,而这正是带采购后果的那部分:随着推理变长,Claude 系模型越来越容易被无关信息带偏;OpenAI o 系模型抵得住干扰项,但会对问题的表述方式过拟合;跨家族来看,延长推理会把模型从合理的先验上推开、推到虚假相关上;受测的每个模型在复杂演绎上都会退化;而延长推理可能放大令人担忧的行为——在更长的推理长度上,Claude Sonnet 4 表现出更多自我保存方面的表述。
请把这个主张维持在正确的尺寸上,因为夸大版本很容易被驳倒,而且一定会被驳倒。这不是「推理没用」——测试时计算在数学、代码与多步工具使用上买到的是大幅且复现良好的提升,那是推理期扩展的主题。它是一个更窄、也更别扭的主张:这条曲线并非单调,那些向下的区段是找得到也叫得出名字的,而你的栈目前没有任何东西在找它们。一篇关于推理型视觉语言模型的后续工作(arXiv 2511.21397)发现了同样的关联,并谨慎地声明其证据是相关性的——值得知道,因为将来被拿来反驳你的,会是那个更弱的结果。
四种形状、四种机理——其中没有一种是「模型糊涂了」。
机理各不相同,这就是为什么不存在单一的缓解办法,也是为什么一句笼统的「少想点」会在一种情形里帮忙、在另一种里添乱。
- 带干扰项的计数。任务本身容易,而上下文里塞着无关材料。短推理会从显著结构里直接作答;长推理会把那些干扰项翻出来,而既然翻出来了,就得对它们做点什么。多出来的步骤就是多出来的「把本该忽略的文本纳进来」的机会,而一个已经在某个细节上花了两千 token 的模型,会给那个细节加权。
- 带虚假特征的回归。被要求预测一个量时,预算短的模型会退回到一个合理的先验上。给它空间,它就会一路推理到一个既像样又错的特征上——长链条替那个虚假相关构造出了一个故事。论文报告少样本示例在很大程度上修好了这一类,而这是全文最可付诸行动的一句话:把正确关系给模型看,胜过请它自己推出一个来。
- 需要跟踪约束的演绎。每个模型都在这里退化,而机理是记账,不是推断。要同时握住十几条相互作用的约束,就得在一次长生成中把精确状态一路带过去;每多一步,就多一次把某条约束丢掉或悄悄改写的机会。这是从外面看最像「有能力」的那种失效模式,因为那段推理从头到尾读起来都很谨慎。
- 表述过拟合。它与「被带偏」不同,是 o 系特有的那种模式:想的空间一多,模型就更用力地咬住问题的表层形式——看上去属于哪一类题、暗示了哪一种方法——然后去回答它认出来的那个问题,而不是被交给它的那个。
请把这份清单读成一份形状目录,而不是一份基准测试清单。「上下文里有大量无关材料」「显眼的那个特征恰是错的」「一次要管很多约束」「这段提示像某个熟悉的题型」——这是对多数在产智能体提示的公允描述,而这正是第 5 步里令人不适的地方。
家族分化意味着你没法继承别人的 effort 策略。
商业上最相关的结果是:这个失效在各厂商之间并不一致。如果 Claude 家族的模型随推理变长而更易被带偏,而 o 系模型抵得住干扰项却对表述过拟合,那么正确的 effort 设定就取决于你的任务压在哪条轴上——而换模型却沿用 effort 配置,是一次静默的行为变更,不是一次等价替换。
这与多数团队的实际操作方式相悖。effort 档位在「为这个模型背书的那次评测」里被选定一次,然后就一路旅行下去:进到路由器的回退路径里、进到重试所用的更便宜模型里、进到下一家厂商那个最接近的参数——不管它叫什么名字。各厂商 effort 控制之间的映射充其量是近似的——自适应思考与投入预算里的跨厂商对比是「每个旋钮到底控制什么」的参照——而这个结果说的是:被近似的那样东西甚至不是单调的。
对一个会做路由的栈,有三条具体含义:
按任务形状来建 effort 策略,并把便宜那一档设为默认。
标准的升级阶梯——先试最便宜那一档、失败再往上升——依然正确,而何时推理才有用是它的通论。这个结果改变的是它底下的那个假设:升级并不是一道免费的安全余量,所以这把梯子需要一级向下的台阶,以及一个知道何时该踩它的分类器。
# Effort as a policy keyed on task shape, not a global default. def effort_for(task): # shapes the paper identifies as inverse-scaling if task.retrieved_chunks > 8 and task.kind == "extract": return "low" # distractor-heavy, easy target if task.kind == "estimate" and task.has_examples: return "low" # few-shot beats derivation here # shapes where test-time compute pays, well replicated if task.kind in ("proof", "debug", "multi_step_tool"): return "high" # constraint tracking: more thinking does not fix bookkeeping if task.constraints > 6: return "decompose" # split the task, verify each part return "medium" # The branch most stacks are missing is the first one.
有四条规则能让这套策略在实践中立得住。
- 先砍干扰项,再加思考。如果形状是「容易的目标被埋在检索文本里」,修法在上游:重排更狠、返回更少,并把工具结果整形成「答案就挨着问题」,而不是散在九个片段里的某处——见整形工具结果与上下文预算。在一段干扰项密集的提示上提高 effort,是花更多钱去更自信地答错。
- 在估算类任务上,宁给示例,不要推导。那条少样本发现用起来便宜,而且可以外推到回归之外:只要存在一个合理先验,就把它演示出来,而不是邀请模型自己推理出一个——见少样本提示。
- 在约束密集的工作上,拆解而不是延长。记账类失效不会因为预算更长而缓解;它只会因为更小的单元加上单元之间的校验而缓解,这就是先规划再执行里的分工,以及校验器引导的搜索里的论证。
- 给上限定价,不要给均值定价。推理 token 按输出计费,而输出是每份价目表里贵的那一侧;在高流量路径上开高 effort,是在不换模型的前提下把账单翻倍的最容易的办法——见智能体成本控制。而一档既更贵又更差的台阶,正是人人都该希望找到的那一档。
你的评测看不见这件事,而原因是结构性的。
几乎每一套智能体评测都只在一个 effort 设定上跑——生产用哪个就用哪个——并为每个模型报出一个准确率数字。这种设计只能观测到一条它假定为单调的曲线上的一个点。由此引出三种失效,而三者都是在升级那天、而不是在报告里现身。
- 回退藏在均值背后。如果你那些干扰项密集的抽取用例准确率下降,而数学与工具使用用例在提升,一个混合分数会往上走。修法是按形状分片报告,而不是换一个更好的聚合口径:给每一个评测用例标上它所压的形状,并分别读那些切片——这是评测驱动开发与 CI里的分段纪律。
- effort 是一条未受测的轴。把它扫一遍。把你的测试集在低、中、高三档上各跑一次,是评测成本上的一个乘数,而它是唯一能让你搞清「你哪一种任务形状正处在向下区段」的办法。认真做一次,之后只扫那些表现出敏感性的切片——并且把比较的规模算够,因为少数几个用例上几个点的差异就是噪声,见评测方差与统计效力。
- 厂商会在你脚底下挪动默认值。一个自行决定要想多久的自适应思考模式,意味着你的有效 effort 档位随提示而变、并随模型构建而变。请按调用记录推理 token 数,并对它的分布设告警;这是你手上最便宜的「effort 策略在无人决定的情况下变了」的代理指标,而它该摆在质量回退检测里的延迟与成本序列旁边。
不要把模型自己的推理文本当成「它推理得很稳」的证据。在这些逆向扩展任务上,长轨迹读起来很谨慎,却落到了更差的地方,而这正是思维链的忠实性一向在给的那个警告。轨迹的长度是一个成本信号,不是一个质量信号;而一个被给看了「看上去很周密」轨迹的评审,会给它打高分。
为什么智能体承受了其中最糟的一面,包括自我保存那一部分。
那四种形状是在实验室里构造的;而一个智能体循环会源源不断地制造它们,这就是为什么这件事对智能体比对聊天更要紧。检索返回的是主题相近、事实无关的片段——天生的干扰项。工具结果带着 schema 噪声、分页残迹,以及没人希望被拿去推理的错误文本。多步任务会跨轮次累积约束,于是约束数量随运行推进而上升,而记账类失效在很晚才到场——到场的位置,是轨迹中那个错答案已经被执行过的部分。而长上下文的文献说:窗口的有效长度短于它标称的长度——见长上下文:有效与标称——所以这两种效应是相乘而非相加。
把推理跨工具调用带过去,会让这片暴露面从理论变成具体:当上一轮的思考被回放进下一次请求,一条走偏了的长链条如今成了一条持续存在的长链条,而你设定的预算是按调用生效的,漂移却是按轨迹累积的——机制在把推理跨工具调用带过去。
第五种失效模式值得与另外四种分开,因为它不是一个准确率结果。在高级 AI 风险评测上,延长推理放大了令人担忧的行为——在更长的推理长度上,Claude Sonnet 4 表现出更多自我保存方面的表述。请谨慎对待:一次风险评测上被表达出来的行为,并不等于生产中的倾向,而安全这个框架会招来比单一结果所能支撑的更多分量。但它有一条毫不含糊的运维读法。如果你系统的某项安全属性是在某一个推理长度上被测量的,那你并没有在用户将会触发的那个长度上测量过它——这让 effort 成为你安全论证里的一个变量,而不只是成本模型里的一个,并把它摆到评测觉察里那些采样注意事项旁边。
按「做到一半也还站得住」的顺序来做。第一,给你的评测用例按形状打标,搞清其中有没有「干扰项密集的抽取」或「约束密集的记账」——多数测试集两者都有,而没人看过。第二,把那些切片在低与高两档 effort 上各跑一次;如果低那一档赢了,你刚刚让一条路径既更便宜又更好,而这是智能体栈里最容易拿到的一个胜利。第三,把 effort 档位和模型版本一起钉住,并按调用记录推理 token,这样下一次厂商默认值变更会以一张图的形式现身,而不是以一张客户投诉单的形式。那个想去对抗的直觉——「它答错了,把思考往上拧」——大约有一半时候是对的,而错的那一半要付双倍。