Skip to content

推理链压缩

思维链是什么?

用户提问"小红有10块钱,她坐地铁花了5块,妈妈又给了她十块,问现在她有多少钱?",模型回复:

<think> 之间的内容就是推理链(Chain of Thought)。

  • 为什么需要推理链? 将复杂问题分解为简单的子任务,提升大模型解决复杂问题的能力。

  • 推理链为什么延缓回复速度? LLM decode 的自回归性质决定了推理延迟与生成序列长度成正相关。为提升回复速度,需要对推理链进行压缩,但压缩又不可避免影响生成质量。如何平衡推理速度和回复质量,成为研究焦点。

综述

大模型也会"想太多"?

自从 DeepSeek-R1 引入长思维链后,逐步推理已被证明能显著提升模型在数学、逻辑、编程等复杂任务中的正确率。然而,即便是"2+3=?"这样的简单问题,模型也可能写上百甚至上千个 token 才给出答案。

这种过度思考(Overthinking)现象带来三大副作用:

  • 响应变慢:用户等待时间过长
  • 成本变高:冗余推理步骤增加算力和费用
  • 场景受限:实时对话、自动驾驶、搜索引擎等延迟敏感场景不适用

矛盾在于:思维链太长,结果更准却更慢;思维链太短,响应更快却容易出错。

高效推理方法分类

主要分为三类:

类别方法核心思路
模型层面长度奖励 RL、变长 CoT SFT让模型在训练阶段学会更短、更高效的推理
输出层面潜在思维压缩、动态推理范式推理过程中直接减少冗余步骤
输入层面提示词引导、按难度路由推理前通过 prompt 约束或引导

六条代表性路线:

  1. 长度奖励 RL:在强化学习中加入长度奖励,鼓励短且对的推理
  2. 变长 CoT SFT:构造长/短思维链数据做监督微调
  3. 潜在思维压缩:把显式文字推理压到隐空间
  4. 动态推理范式:按置信度/一致性等准则早停、剪枝或重采样
  5. 基于提示的精简:用长度/步骤预算等提示直接约束输出
  6. 按难度路由:根据题目难度路由到快模型或强模型

模型层面的方法

强化学习加入长度奖励

在 RL 的回报里同时编码正确性长度:鼓励"短且对",惩罚"长且错/冗余"。实践中常搭配格式/过程奖励,避免模型靠删字取巧。

四种常见的长度奖励设计:

类型原理说明
条件化长度答对时才按"更短→更高分"计分固定"先对再短"优先级
超限惩罚推理长度达到上限 Lmax 时追加惩罚防止拖长
相对长度与参考模型/目标长度/标注链长对比量化"短到什么程度合适"
形状函数长度→得分映射为平滑曲线避免训练震荡

代表性做法:O1-Pruner(PPO)、Demystifying(PPO)、L1(GRPO)、DAST(SimPO)。

用变长 CoT 数据做 SFT

先获得长+短并存的 CoT 数据,再做 SFT 让模型学会"该长则长、该短则短"。

如何收集短 CoT 数据?

  • 后处理压缩:利用规则或更强模型对已生成的长 CoT 进行压缩(如 C3oT、TokenSkip)
  • 在线压缩:生成阶段就产出更短的链条
    • LearnSkip:随机跳过部分步骤
    • Self-Training:选最短正确解回流为训练数据
    • Token-Budget:为每道题估计最优 token 预算
    • CoT-Valve:将"无思维"与"长思维"的 LoRA 参数线性混合

如何微调?

  • 标准 SFT:用 LoRA 或全量微调
  • 渐进式微调:训练过程中逐步缩短样本链条

输出层面的方法

潜在思维压缩

将显性 CoT 替换或压缩为更紧凑的潜在表征,在保持准确率的同时大幅减少输出 token 数。

方法原理
Coconut把最后一层隐藏状态当作连续思维 token,循环回喂
CODI自蒸馏同时学习显式与隐式 CoT,隐藏态对齐
CCOT训练两套 LoRA:预测压缩向量 + 解码精简 CoT
SoftCoT冻结主模型,训练小网络生成连续思维向量

动态推理范式

不改模型参数,在推理时动态调整思考策略:

  1. 测试时扩展(TTS):Best-of-N、Beam Search、MCTS
  2. 基于奖励的优化:Speculative Rejection、RSD
  3. 基于置信度的优化:DPTS、Certaindex、FastMCTS
  4. 基于一致性的优化:ST-BoN

基于摘要的动态推理

  • LightThinker:学习何时 & 如何压缩中间思路,把冗长 CoT 汇成 gist tokens
  • InftyThink:交替思考→摘要→丢旧思路,只保留最新摘要

输入层面的方法

提示词引导

方法Prompt 模板
Token-BudgetLet's think step by step and use less than <N> tokens.
CoDThink step by step, but only keep a minimum draft for each step, with at most five words.
CCoTThink step by step, and be concise.
Token ComplexityBulletPoints / WordLimit(k) / StepLimit(k) / TokenLimit(k)

推理路由

类型代表方法原理
模型内置切换Claude 3.7 Sonnet支持快速答复与分步思考两种模式
训练路由器RouteLLM用偏好数据训练路由器,简单题→轻量模型
不确定性自路由Self-Ref微调置信度 token,让模型自己判断是否不确定

其他讨论

如何用更少数据训练推理模型?

  • LIMO:仅用 817 个精心筛选的示例即可超越 10 万+示例训练的模型
  • s1:1,000 个高质量问题-推理对 + 预算强制

如何提升小模型推理能力?

  1. 知识蒸馏:混合蒸馏、反事实蒸馏、反馈驱动蒸馏等
  2. 模型压缩:量化几乎无损保留推理性能;剪枝会严重损害多步逻辑能力

参考论文:Stop Overthinking: A Survey on Efficient Reasoning for Large Language Models

LightThinker

论文简介

LightThinker 提出在推理过程中动态压缩中间思维链的方法,将冗长的思维步骤压缩成紧凑的表示。通过数据构建将隐藏状态映射到紧凑 token 以及创建专门的注意力掩码来训练模型。引入 Dependency(Dep) 测量生成过程中对历史 token 的依赖程度。

原论文:LightThinker

背景

推理模型在 CoT 基础上引入了试错、反思、纠错和回溯等能力,显著提升解决复杂问题的成功率,但消耗海量 token,且 Transformer 注意力计算复杂度随上下文长度二次方增长,KV Cache 缓存压力线性增长。

Qwen2.5-32 的上下文达到 104 时,KV Cache 占用的空间和模型本身相当。

现有方法分为两类:

  1. 通过提示词工程或专门训练引导模型生成更少 token
  2. 推理过程中动态减少推理步骤和输出长度

LightThinker 属于第二类,在推理过程中动态压缩历史内容。

核心设计

LightThinker 解决了两个关键问题:

  • 何时压缩? Token 级压缩可能忽略语义边界;Thought 级压缩能更好保留语义。LightThinker 通过重构数据解决。
  • 如何压缩? 文本压缩需要额外编码模型;隐藏状态压缩将当前 thought 的隐藏状态压缩为少量 gist token,不需要额外模型。LightThinker 采用后者。

数据重建

  1. 使用分割函数 Seg() 将输出 Y 划分为 k 个子序列 S
  2. 在相邻子序列间插入特殊 token {<w>,C,[o]}
    • <w>:压缩触发 token
    • C:gist token,用于保存压缩内容
    • [o]:强制输出 token,基于压缩内容持续生成

注意力掩码

  • 压缩过程C(i) 只关注问题 X、先前压缩内容和当前 thought,让 LLM 将关键内容压缩到 cache token 中。
  • 生成过程[o](i) 只关注问题 X 和先前压缩内容,让 LLM 基于压缩内容继续推理。

实验

在 Qwen2.5-7B 上,LightThinker 降低 70% 峰值 token 使用量,推理时间缩短 26%,只下降 1% 准确率。

指标Qwen2.5-7BLlama3.1-8B
准确率下降1%6%
推理时间节省26%1%
峰值 token 减少70%70%
Dep 减少7874

TokenSkip

论文简介

TokenSkip 分析 CoT 中 token 的语义重要性,选择性跳过不重要 token,实现可控的 CoT 压缩。

原论文:TokenSkip: Controllable Chain-of-Thought Compression in LLMs

CoT 推理中 token 的贡献不相等

对 CoT 输出中 token 的语义重要性分析表明:token 之间的重要性存在显著差异——数学公式对答案贡献更大,而"so""since"等语义连接词贡献更小。

Token 重要性评估

方法原理
Selective Context通过 LLM 的语义置信度衡量 token 重要性
LLMLingua-2使用双向 BERT-like LM,通过 GPT-4 评估训练

TokenSkip 流程

  1. Token 剪枝:目标 LLM 生成 CoT 轨迹,根据 token 语义重要性降序排列,只保留前 γ 比例的 token
  2. 训练:用压缩后的 CoT 对目标 LLM 进行 LoRA 微调,数据格式为 x [EOS] γ [EOS] Compressed CoT y
  3. 推理:给定问题和压缩比,模型生成的 CoT 中自动跳过不重要的 token

实验

数据集压缩比性能下降延迟加速
GSM8K0.5310%1.8x
MATH-5000.70<4%-

关键发现:大模型更擅长捕捉关键 token,高压缩比下性能下降更少。Qwen2.5-14B 在压缩比 0.4 时性能下降 <0.4%。

Chain of Draft

论文简介

Chain of Draft(CoD)模仿人类做数学题时只记录简洁草稿的习惯,通过 prompt 鼓励 LLM 只生成简洁和高信息量的输出,只需 7.6% 的 token 即可达到 CoT 的准确率。

参考论文:Chain of Draft: Thinking Faster by Writing Less

三种推理方式对比

方式特点示例
Standard直接给答案,缺少透明度"答案是 15"
CoT面面俱到,包含不必要细节"Jason 周一吃了苹果,Denny 去了公园..."
CoD一针见血,每步最多 5 个词"10-5=5; 5+10=15; ans=15"

CoD 的关键是在 prompt 中要求每个推理步骤最多输出 5 个单词,通过 few-shot 样例引导模型生成简洁推理。

实验

  • 使用 few-shot:CoD 准确率有一定损失,但加速效果明显,token 量显著降低
  • 不使用 few-shot:CoD 准确率大幅下降,因为训练数据缺少 CoD 风格的推理样本
  • 小模型表现:小模型上 CoD 表现显著降低,需专门微调才能提升

关于 CoD 的思考

CoD 在简单任务(如 GSM8K)上效果不错,因为推理本身简单,即使每步压缩到几个 token 也能实现较好效果。但一旦任务难度提升,特别是深入到具体领域时,几个 token 连关键概念都解释不清楚,更遑论推理出正确结果。

使用 CoD 可能面临的问题:

  1. 可解释性下降:用户难以通过浓缩步骤理解推理过程
  2. few-shot 设计偏差:样例未覆盖场景下所有问题时,回答质量易下降
  3. 缺乏自我验证:大模型推理最后的自我验证能发现一些之前推理的错误

能实现推理加速的方法不止本章的这些。模型压缩(2.3 模型压缩)、FlashAttention(2.6 Flash Attention)、上下文窗口分割等方法同样能加速推理。