Think in Blocks
Paper · arXiv 2025 · 2508.15507v1

Think in Blocks:先报「用几块」,再决定想多深

简单题也写完整条 CoT,是当前推理模型的通病。论文把推理切成离散的块,让模型先预测块数 n, 再用 SFT → DPO → RL 把 n 变成可优化、也可在推理时覆盖的推理预算。

Yekun Zhu · Guang Chen · Chengjun Mao arXiv 2508.15507v1 ↗ 博客笔记 ↗
TL;DR · 30 秒抓住核心

LLM 的 CoT 有个老问题:简单题也写很长。论文引用的观察是 “The model tends to use roughly the same number of tokens for both simple and complex problems”(§1)。

Think in Blocks 把推理切成块:先输出 <thought_segments>n</thought_segments>, 再生成 n 个用 <continue_think> 分隔的块;n=0 就是不思考。

三阶段训练:SFT 学格式(两阶段 curriculum),DPO 用 DAST 式长度奖励构造偏好对, RL 用 GRPO / Dr.GRPO / DAPO 同时压块数、块长和格式不一致。

最终 SFT → DPO → GRPO 在 DeepMath (1k) 上把平均长度相对 Baseline 降低 25.1%, overall 准确率差 −0.2 个百分点;推理时还能用 block cap 覆盖块数, 但 ≤0 和 >6 都会付出准确率代价。

−25.1%
平均答案长度相对 Baseline 的变化
7735 → 5791
−0.2pp
overall 准确率变化
85.3 − 85.5
−81.9%
强制 ≤0 块时长度相对 auto 的变化
准确率 59.0%(−26.3 pp)
01

简单题也写完整条链:模型缺的是「停」的信号

先看过度思考在数据上长什么样,再谈为什么已有控制手段不够。

带 CoT 的 LLM 在复杂逻辑题上很强,但论文指出它们有一个共同的毛病:过度思考(overthinking)。 模型会在答案已经显然的简单题上继续展开,消耗大量 token,响应也更慢。论文在 §1 把问题说得很直接:

论文观察

简单题和复杂题,花掉的 token 差不多

“The model tends to use roughly the same number of tokens for both simple and complex problems, revealing its inability to distinguish difficulty levels and adapt reasoning depth.” §1

换句话说,问题不只是「会不会想」,而是推理预算没有和题目难度挂钩。 论文要回答的问题是:能不能让 LLM 根据任务复杂度,动态调整推理过程的长度?

这不是纯理论担忧。Table 4 的 Baseline 行给出的平均答案是 7735 个 token, overall 准确率 85.5%;分难度看,easy 88.8%、difficult 74.9%。 高准确率伴随的是很长的平均输出——论文要做的,是在不牺牲 overall 的前提下把长度压下来。

代价有两个:计算浪费(token 就是算力)和响应变慢(生成长度直接决定延迟)。 论文的目标不是把 CoT 一刀切短,而是让模型学会「简单题少想、难题多想」。

02

已有路线:要么统一压短,要么只想 / 不想

两条路线各自解决了一部分问题,但都没有给出连续的「思考深度」旋钮。

路线 A

统一压短

prompt engineering、length-penalty RL、基于长度的偏好对、短 CoT / 长 CoT 模型合并—— 这些方法的目标都是让答案更短。

卡点:它们通常对所有问题套用同一套推理流程。论文指出, “these methods typically apply a uniform reasoning process to all problems. Crucially, non-thinking mode can sometimes outperform thinking mode, particularly for simple problems.”(§2) 统一压短没有区分难度。

路线 B

二值切换

多模型路由,或单模型预测「要不要想」:轻量模型先答,没把握再调用更强的模型; 或者让模型自己判断是否需要 CoT。

卡点:论文的批评是 “these approaches typically offer only a binary choice: to think or not to think.”(§2) 只有「想 / 不想」两个状态,没有「想多深」的中间档位。

论文要的是从 0 到多块的深度调节:块数可以是 0(直接回答),也可以是 1、2、3…… 推理时还能被外部覆盖。这个整数既是训练信号,也是部署时的控制参数。

03

把「想多深」变成一个整数:先报块数,再填内容

块结构、DPO 的配对条件、RL 目标,三件事都围绕同一个整数 n。

块结构:n 先出现,内容后填

Table 1 对比了普通长 CoT 和块结构 CoT 的 prompt 形态。区别只在两处: <thought_segments>n</thought_segments> 声明块数, <continue_think> 标记块与块之间的边界。

Table 1 · Long-context CoT 与 Block-structured CoT 的 prompt 结构对照(转录)
Long-context CoTBlock-structured CoT
<think>
{reasoning process}
</think>
{response}
<think>
<thought_segments>n</thought_segments>
{reasoning process 1}
<continue_think>
{reasoning process 2}
…
<continue_think>
{reasoning process n}
</think>
{response}

n=0 是 Non-Thinking:推理段整体删掉,模型直接给答案。 每个非零块可以是一段连贯的 CoT,也可以是一次完整的 tool-call 结果(Figure 1)。 论文在 §3 解释了为什么要把块数显式化:

DPO 的奖励:超预算扣分,短于预算加分

DPO 阶段不直接优化「块数」,而是先给每条采样回复算一个校准奖励: 答案正确时,超预算越多奖励越低(λ > 0 从 0.5 压到 0.1),短于预算则奖励更高(λ < 0 时 r > 0.5); 答错时,短于预算会压到 −0.1 以下,超预算恒为 −0.1。论文借用了 DAST 的 Token Length Budget(TLB), 再把它扩展成可以容纳「直接回答」和「深思考」两种极端样本的形式。

Lbudget(xi) = p · Lr̄(xi) + Lmax(xi),    p = Ncor / s
Lr̄(xi) = Ey∼πθ(·|xi)[L(y)] ≈ (1/s) Σj=1s L(ŷi(j))
λ(ŷ) = (L(ŷ) − Lbudget) / Lbudget
r(ŷ) = max(−0.5 λ(ŷ) + 0.5, 0.1)   if correct
r(ŷ) = min(0.9 λ(ŷ) − 0.1, −0.1)   otherwise
Eq. 2–4 · DAST 的长度预算与校准奖励;Lr̄ 为 s 条采样回复的平均生成长度,Lmax 为最大生成长度;λ 是「实际长度相对预算」的偏离

两个分支不对称:答对但超预算,奖励从 0.5 往下压,最低压到 0.1; 答对且短于预算,r > 0.5(λ 越负越高);答错的分支始终 ≤ −0.1(λ 为负时更低)。这样正确性和长度被放进同一个标量里。 构造偏好对时还有两个条件:奖励差要超过阈值 δ,且 chosen 的推理块数不能多于 rejected(§4.2.1)。

下面这个交互只做一件事:拖动 λ,看 Eq. 4 的两个分支怎么变。注意看两个钳位点—— 答对分支在 λ ≥ 0.8 后停在 0.1,答错分支在 λ ≥ 0 后停在 −0.1。

λ r −0.50 0 0.50 1.00 0 0.6 −0.45
correct 分支 incorrect 分支 当前 λ
Eq. 4 · 当前分支与 λ

r = max(−0.5 × 0.20 + 0.5, 0.1)

r = 0.40

手算:两组 λ → 奖励与交互读数同口径

组 1:correct,λ = 0.20。 r = max(−0.5 × 0.20 + 0.5, 0.1) = max(0.40, 0.1) = 0.40。

组 2:incorrect,λ = −0.20。 r = min(0.9 × (−0.20) − 0.1, −0.1) = min(−0.28, −0.1) = −0.28。

常量 −0.5、0.5、0.1、0.9、−0.1 逐字来自 Eq. 4;本交互不涉及标准差。

RL 的目标:压预算,但不能压掉准确率

DPO 之后,RL 阶段把「用更少、更短的块」写进目标函数。论文列了五个方向: 最大化 Non-Thinking 样本、最小化块数、减少平均块长、保证格式一致、维持或提升任务准确率。 前四个是优化项,最后一个是约束。

ℒ(θ, λ) = (Eπθ[R] − Eπref[R])
  + λ1 E[1{n = 0}]  − λ2 E[n]  − λ3 E[(1/n) Σi |Bi|]  − λ4 E[|n − ñ|]
Eq. 5 · n 是声明的块数,ñ 是实际生成的块数;1{n=0} 是 Non-Thinking 的指示函数

这里有一个工程细节:优势函数里有 λ1…λ4 四个权重,PPO-style 损失直接调很容易不稳。 论文的做法是按准确率缩放:先算当前 rollout 的经验准确率 p, 再用 h(p) = clip((p − plow) / (phigh − plow), 0, 1) 把基础权重 λi* 缩放成 λi。 准确率低时 h(p) 接近 0,长度惩罚让位给正确性;准确率高时惩罚恢复。

04

三阶段训练:先学格式,再学偏好,最后压预算

每一阶段解决一个问题;数据规模、超参和奖励系数都在 §6.1 与 Table 3。

数据怎么来

训练语料从 DeepMath 出发,但只保留题目和标注难度。参考答案用 Qwen3-32B 重新生成, 原因是原始 DeepSeek 的 think CoT 过长,风格也和 Qwen3 不一致;论文说混用会导致性能明显下降。 然后用 Qwen3 的 no-think 模式把每条答案切成若干推理块,得到 <thought_segments> 和 <continue_think> 标注。 高难度题还会让 Qwen3-32B 做 self-reflection,重写自己的答案来扩充数据(§6.1)。

两个边缘情况单独处理:简单题删掉推理段,块数设为 0(Non-Thinking); 短但难的题用 prompt engineering + knowledge distillation 把 CoT 扩成更多块(Deep-Thinking)。 SFT 分两阶段:stage 1 只用中等难度样本学格式;stage 2 才加入少量 Non-Thinking 和 Deep-Thinking 样本, 大部分数据仍是中等难度,避免边缘样本淹没主分布(§4.1.2)。

SFT

学格式

训练集 7k:0.2k easy、5k medium、1.8k hard。

8×A100;batch 8;3 epochs;lr 8×10−5(stage 1)/ 2×10−6(stage 2)。

框架:SWIFT。

DPO

学偏好

用 Eq. 2–4 的校准奖励排序采样回复,构造 4k 组 chosen–rejected 对。

batch 16;3 epochs;lr 2×10−6;阈值 δ 与每 prompt 采样数 s 见 §4.2。

框架:SWIFT。

RL

压预算

三种 reward-based 方案:GRPO、Dr.GRPO、DAPO;每种 2 epochs,batch 32,lr 1×10−6。

DAPO 的 clip_ratio_low = 0.2,clip_ratio_high = 0.28。

框架:verl。

训练集合计 7k(0.2k + 5k + 1.8k),但 SFT 的两个阶段并不是按难度简单切分: stage 1 排除两个边缘情况,stage 2 才把它们少量加回来。论文的解释是, 缺少推理步骤的数据会影响准确率,而过长的推理链又会带来过度思考(§4.1.2)。

Table 3 · RL 奖励系数与阈值(取值转录自 Table 3;符号含义按 Table 2 / §4.3 补注)
符号作用取值
λ1*Non-Thinking bonus(1{n=0})0.1
λ2*块数 n 的惩罚0.05
λ3*平均块长的惩罚0.5
λ4*格式不一致 |n − ñ| 的惩罚0.1
plowaccuracy-aware scaling 下界0.75
phighaccuracy-aware scaling 上界0.9

注意 λ1* 和 λ2* 的符号方向:Non-Thinking 是奖励项,块数是惩罚项。 这两项会互相拉扯,最终由准确率约束和 h(p) 缩放来平衡推断(依据:Eq. 5 中 λ1 与 λ2 符号相反,§4.3 用 h(p) 缩放 λi)。论文也承认, PPO-style 损失「too complex and not stable」,实践中要么手调 λ,要么用上面的 accuracy-aware scaling。

05

推理时改一个整数,就能改思考深度

训练时块数是可优化信号;推理时它变成可覆盖的预算,覆盖方式就是 mask 掉区间外的块数。

问题 x prompt / 难度线索 块数预测 ℓ ∈ R^K → n 先声明 reasoning budget n 个推理块 B₁ … Bₙ n = 0 时跳过 最终答案 conditioned on blocks 推理时:Auto 用预测的 n Override 把区间外的 logits 置 −∞,再采样 k(Algorithm 1)
Figure 1 与 §3 的流程重绘:模型先输出块数 n,再逐块生成,最后基于这些块给出答案。 本图是结构示意,不是论文原图;Figure 1 未逐像素复刻。

Override 的四种操作

Algorithm 1 的步骤很短:先对块数 k 预测 logits, 把不在 [cap_low, cap_high] 区间内的 logits 置为 −∞, 再对剩下的分布做 softmax 采样,最后带着选中的 k 继续生成。 论文的原话是:“zero out probabilities of block counts that violate the user constraint, renormalize, and continue decoding conditioned on the clamped value; the remainder of the generation process is unchanged.”(§5)

def BlockCapDecode(prompt, cap_low, cap_high):
  ℓ ← PredictLogits(prompt)  # ℓ ∈ R^K
  for i: if i ∉ [cap_low, cap_high]: ℓi ← −∞
  k ← SampleSoftmax(ℓ)
  response ← Generate(prompt, k)
  return response
Algorithm 1 · Override-BlockCap Decoding(按原文步骤转录)

两种模式:Auto 用模型自己预测的块数;Override 由调用方给一个上界或下界, 模型必须在这个范围内选。论文强调这个机制是 architecture agnostic、不需要 retraining, 但有一个前提:模型必须是用 block annotations 训练过的, “any model trained with block annotations can adopt it immediately.”(§5)

下面的交互把 Table 5 的五种 cap 放在一起。切换按钮,看长度、准确率和 bad cases 怎么一起变。 注意:cap 约束的是预测的块数;实际生成块数仍可能对不上(§7)。

长度 mean(0–8k) 准确率 overall(0–100%) bad cases(0–10%)
Table 5 · 当前 cap
手算:两组 cap 的长度与准确率变化与交互读数同口径

自动(None)基准:mean 5791,overall 85.3%。

组 1:cap ≤ 0。ΔAcc = 59.0 − 85.3 = −26.3 个百分点; ΔLen = (1046 − 5791) / 5791 × 100 = −81.9%(相对 auto)。

组 2:cap ≤ 6。ΔAcc = 80.4 − 85.3 = −4.9 个百分点; ΔLen = (5466 − 5791) / 5791 × 100 = −5.6%(相对 auto)。

本交互只转录 Table 5 的 mean / std / bad-case / accuracy,不做标准差计算; 表中的 std 为原表值。Δ 的口径:准确率用百分点差,长度用相对 auto 的百分比。

06

长度少 25.1%,准确率差 0.2 个百分点——代价在分难度里

Table 4 是主结果;Table 5 是同一个 final model 加 block cap 后的表现。

Table 4 · DeepMath (1k) test set(转录);Length 只统计正确预测;easy = 2.0–4.5、difficult = 8.0–9.0(原文表注);ΔAcc 为相对 Baseline 的百分点差,ΔLen 为相对 Baseline 的百分比;Ours 各行使用 block-structured CoT 训练数据(原文表注:Rows under Ours use training data with block-structured chains-of-thought);+DPO 的 −21.5% 为原表取整(复算约 −21.4%)
MethodLen meanLen stdBad cases Acc overallEasyDifficultΔAccΔLen
Baseline773543952.2%85.5%88.8%74.9%––
Baseline + GRPO755449571.0%85.9%89.3%71.6%+0.4%-2.3%
Baseline + GRPO_cosine69713650.6%58.8%48.8%40.1%-26.7%-91.0%
Ours · SFT-stage15879313219.7%67.3%77.2%52.6%-18.2%-24.0%
Ours · SFT-stage25507285327.8%61.6%62.2%44.6%-23.9%-28.8%
Ours · +DPO607740055.1%81.8%82.9%72.5%-3.7%-21.5%
Ours · +DAPO591238375.1%83.1%76.5%74.9%-2.4%-23.6%
Ours · +Dr.GRPO397023731.5%77.2%80.6%70.1%-8.3%-48.7%
Ours · +GRPO(final)579131603.8%85.3%92.0%74.9%-0.2%-25.1%

主结果:Ours 的 +GRPO(SFT → DPO → GRPO)把平均长度从 Baseline 的 7735 降到 5791, 长度相对 Baseline 降低 25.1%((5791 − 7735) / 7735); overall 准确率从 85.5% 变为 85.3%,即下降 0.2 个百分点(85.3 − 85.5)。 论文的总结是:

“Considering both metrics, the most effective pipeline is SFT → DPO → GRPO; it shortens answers by 25.1% while keeping overall accuracy virtually unchanged (ΔAcc = −0.2%).” §6.2.1

分难度看,final +GRPO 的 easy 准确率 92.0% 对 Baseline 88.8%,提高 3.2 个百分点; difficult 74.9% 对 74.9%,持平。论文的表述是 “our final model surpasses (or at least matches) the baseline on easy questions and on the hardest questions.”(§6.2.1) 注意 overall 仍然是 −0.2 个百分点:Table 4 只给 overall / easy / difficult,medium 没有单列, 所以不能从这两列直接拆出 overall 变化的来源。

代价在别处。bad cases 从 Baseline 的 2.2% 变为 3.8%; SFT-stage2 的 overall 准确率 61.6%,比 Baseline 低 23.9 个百分点,是 Ours 各行中最大的准确率跌幅; 表内整体最大跌幅是 Baseline + GRPO_cosine 的 −26.7 个百分点 (§6.2.1 原文写 “largest accuracy loss (−23.9%)”,与 Table 4 的 −26.7% 不一致,本页并列呈现); Dr.GRPO 把长度相对 Baseline 降低 48.7%,但 overall 准确率低 8.3 个百分点。 论文对 Dr.GRPO 的原话是 “The greatest reduction in length (–48.7%) is achieved by Dr.GRPO, but at the cost of a considerable drop in accuracy (−8.3%).”(§6.2.1) (按 Ours 各行;整张 Table 4 的最大长度跌幅是 Baseline + GRPO_cosine 的 −91.0%)

SFT-stage2 的大跌并不意外:这一阶段才把 Non-Thinking 和 Deep-Thinking 样本混进来, 论文说切换推理模式会先伤性能,等 RL 再修(§6.2.1)。 另一个值得看的对照是 Baseline + GRPO:它只把长度相对 Baseline 降低 2.3%,准确率 +0.4 个百分点; 同样是 +GRPO,Ours 的长度相对 Baseline 降低 25.1%。两组行的差别在于是否使用块结构训练, 但论文没有给出把这一差异单独归因于块结构的消融句,本页只并列 Table 4 的行。

同一个模型,五种 cap

Table 5 把 final model 放在五种 block cap 下。auto 是 5791 / 85.3%; ≤0 把长度相对 auto 降低 81.9%((1046 − 5791) / 5791), 但 overall 准确率降到 59.0%,下降 26.3 个百分点; ≤2 长度相对 auto 降低 16.1%,准确率下降 7.4 个百分点; ≤6 长度相对 auto 降低 5.6%,准确率下降 4.9 个百分点; >6 长度相对 auto 增加 31.5%,准确率下降 5.1 个百分点。 论文称 ≤6 “achieves a good balance”,而 >6 “particularly degrades performance on easy problems”(§6.2.3)。

Table 5 · DeepMath (1k) test set 上推理时 block cap 的效果(转录);Length 只统计正确预测(computed over correct predictions);所有行都是同一个 final model(SFT→DPO→GRPO);easy = 2.0–4.5、difficult = 8.0–9.0(原文表注);Δ 相对 None (auto)
Block CapLen meanLen stdBad cases Acc overallEasyDifficultΔAccΔLen
None (auto)579131603.8%85.3%92.0%74.9%––
≤ 0104613651.0%59.0%52.0%57.7%-26.3%-81.9%
≤ 2486023366.1%77.9%73.6%68.2%-7.4%-16.1%
≤ 6546628493.3%80.4%91.6%74.0%-4.9%-5.6%
> 6761837113.5%80.2%74.2%77.0%-5.1%+31.5%

最反直觉的是 >6:它强制至少 7 个块,长度相对 auto 增加 31.5%, 但 easy 准确率从 92.0% 掉到 74.2%,下降 17.8 个百分点; difficult 从 74.9% 升到 77.0%,提高 2.1 个百分点;overall 仍然下降 5.1 个百分点。 论文的解释是: “In these failure cases, the model sometimes generates the correct answer early on, but the enforced long chain-of-thought can lead it to an incorrect final answer.”(§6.2.3)

块数怎么随难度变

Figure 4 的结论是定性的:3–5 个块最常见,0 块(no-think)并不是多数; easy 上大多数预测用 0 块,medium 上多为 3–5 块,hard 上很少用 0 块、更高的块数更常见(§6.2.2)。 Figure 4 的具体比例未转录。

Easy

多数组 0 块

论文描述:easy 上预测大多用 block count 0,deep-think(≥8 块)很少必要(§6.2.2)。

Medium

多在 3–5 块

论文描述:medium 上模型最常用 3–5 块;3–5 也是全测试集最常见的块数(§6.2.2)。

Hard

少用 0 块

论文描述:hard 上 no-think 很少见,更高的块数更常见,反映更深的推理需求(§6.2.2)。

读表注意

原文有三处并列写法,本页不合并

  • ≤0 的 bad cases:§6.2.3 的文字说 “The ≤ 0 setting forces no-think responses, which results in a significant drop in accuracy and an increase in bad cases”;但 Table 5 的 bad cases 列,auto 是 3.8%、≤0 是 1.0%—— 按表是下降。两处都在原文里,本页并列呈现。
  • §6.2.1 的 largest accuracy loss / greatest reduction in length: 若按整张 Table 4 读,这两句分别被 Baseline + GRPO_cosine 的 −26.7% / −91.0% 超过; 若按 Ours 各行读则成立(Ours 内最大 Acc 跌幅是 SFT-stage2 的 −23.9%,最大 Len 跌幅是 Dr.GRPO 的 −48.7%)。 原文没有说明这两句的范围,本页并列呈现。
  • difficult / hard 的难度区间:原文 Table 4 和 Table 5 的表注写 difficult = 8.0–9.0; §6.2.2 在描述 Figure 4 时写 hard = 7.5–9.0。两种区间都出现在原文里,本页不替原文选一个。
  • Table 4/5 的难度列只有 easy 和 difficult,medium 没有单列; 因此 overall 的变化不能从这两列直接推出来。
07

块数预测不是硬约束,能力边界也很清楚

论文自己列了一条 limitation;从表和实验设置里还能读出几条适用范围。

边界一

预测的块数 ≠ 实际生成的块数

论文在 §7 列出的关键 limitation 是:模型预测的块数可能和实际生成的块数对不上。 原话是 “A key challenge is ensuring that the predicted block count consistently matches the actual number of reasoning blocks generated... Although we penalize mismatches during reinforcement learning to enforce format consistency, perfect adherence is not guaranteed.”

RL 里的 λ4·|n − ñ| 是一个软惩罚,不是硬约束。块数控制得再准, 生成阶段仍可能多写或少写块。

边界二

只在数学 + Qwen3-8B 上验证

实验用 Qwen3-8B,测试集是 DeepMath (1k),训练语料也来自 DeepMath(§6.1)。 论文没有报告其他模型规模、其他领域或其他数据集的结果;块的定义在非数学任务上是否成立, 原文没有给出证据。

边界三

长度只统计正确预测

Table 4/5 的 Length 统计只算正确预测;错误答案被排除,因为重复子串会把生成长度推到上限(§6.2.1)。 所以 25.1% 的长度缩减是「正确预测的条件均值」,不是所有输出的平均长度。

边界四

cap 不是免费的

≤0 把长度压到 1046,但 overall 准确率只剩 59.0%; >6 把长度拉到 7618,overall 准确率 80.2%,easy 掉到 74.2%。 论文称 ≤6 取得较好平衡(“achieves a good balance”,§6.2.3),但它仍然是 −4.9 个百分点的准确率代价,不是无损压缩。

什么时候别用:如果任务对准确率极其敏感,≤0 和 >6 这类硬 cap 都会带来明显的准确率损失; 如果任务不是数学这类步骤可切分的领域,论文没有验证块结构是否还成立。 另一个实际门槛是训练成本:SFT 7k 样本、DPO 4k 偏好对、RL 三种算法各 2 epochs, 再加上 8×A100,这不是一个「只在推理时改一个整数」就能复现的轻量方案。

一句话总结:块数是一个有用的预算信号,但不是硬约束。 它把「想多深」变成了可优化的整数,同时把「预测得准不准」变成了新的失败模式。