推理链压缩
思维链是什么?
用户提问"小红有10块钱,她坐地铁花了5块,妈妈又给了她十块,问现在她有多少钱?",模型回复:
<think> 之间的内容就是推理链(Chain of Thought)。
为什么需要推理链? 将复杂问题分解为简单的子任务,提升大模型解决复杂问题的能力。
推理链为什么延缓回复速度? LLM decode 的自回归性质决定了推理延迟与生成序列长度成正相关。为提升回复速度,需要对推理链进行压缩,但压缩又不可避免影响生成质量。如何平衡推理速度和回复质量,成为研究焦点。
综述
大模型也会"想太多"?
自从 DeepSeek-R1 引入长思维链后,逐步推理已被证明能显著提升模型在数学、逻辑、编程等复杂任务中的正确率。然而,即便是"2+3=?"这样的简单问题,模型也可能写上百甚至上千个 token 才给出答案。
这种过度思考(Overthinking)现象带来三大副作用:
- 响应变慢:用户等待时间过长
- 成本变高:冗余推理步骤增加算力和费用
- 场景受限:实时对话、自动驾驶、搜索引擎等延迟敏感场景不适用
矛盾在于:思维链太长,结果更准却更慢;思维链太短,响应更快却容易出错。
高效推理方法分类
主要分为三类:
| 类别 | 方法 | 核心思路 |
|---|---|---|
| 模型层面 | 长度奖励 RL、变长 CoT SFT | 让模型在训练阶段学会更短、更高效的推理 |
| 输出层面 | 潜在思维压缩、动态推理范式 | 推理过程中直接减少冗余步骤 |
| 输入层面 | 提示词引导、按难度路由 | 推理前通过 prompt 约束或引导 |
六条代表性路线:
- 长度奖励 RL:在强化学习中加入长度奖励,鼓励短且对的推理
- 变长 CoT SFT:构造长/短思维链数据做监督微调
- 潜在思维压缩:把显式文字推理压到隐空间
- 动态推理范式:按置信度/一致性等准则早停、剪枝或重采样
- 基于提示的精简:用长度/步骤预算等提示直接约束输出
- 按难度路由:根据题目难度路由到快模型或强模型
模型层面的方法
强化学习加入长度奖励
在 RL 的回报里同时编码正确性与长度:鼓励"短且对",惩罚"长且错/冗余"。实践中常搭配格式/过程奖励,避免模型靠删字取巧。
四种常见的长度奖励设计:
| 类型 | 原理 | 说明 |
|---|---|---|
| 条件化长度 | 答对时才按"更短→更高分"计分 | 固定"先对再短"优先级 |
| 超限惩罚 | 推理长度达到上限 | 防止拖长 |
| 相对长度 | 与参考模型/目标长度/标注链长对比 | 量化"短到什么程度合适" |
| 形状函数 | 长度→得分映射为平滑曲线 | 避免训练震荡 |
代表性做法: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 | 冻结主模型,训练小网络生成连续思维向量 |
动态推理范式
不改模型参数,在推理时动态调整思考策略:
- 测试时扩展(TTS):Best-of-N、Beam Search、MCTS
- 基于奖励的优化:Speculative Rejection、RSD
- 基于置信度的优化:DPTS、Certaindex、FastMCTS
- 基于一致性的优化:ST-BoN
基于摘要的动态推理:
- LightThinker:学习何时 & 如何压缩中间思路,把冗长 CoT 汇成 gist tokens
- InftyThink:交替思考→摘要→丢旧思路,只保留最新摘要
输入层面的方法
提示词引导
| 方法 | Prompt 模板 |
|---|---|
| Token-Budget | Let's think step by step and use less than <N> tokens. |
| CoD | Think step by step, but only keep a minimum draft for each step, with at most five words. |
| CCoT | Think step by step, and be concise. |
| Token Complexity | BulletPoints / WordLimit(k) / StepLimit(k) / TokenLimit(k) |
推理路由
| 类型 | 代表方法 | 原理 |
|---|---|---|
| 模型内置切换 | Claude 3.7 Sonnet | 支持快速答复与分步思考两种模式 |
| 训练路由器 | RouteLLM | 用偏好数据训练路由器,简单题→轻量模型 |
| 不确定性自路由 | Self-Ref | 微调置信度 token,让模型自己判断是否不确定 |
其他讨论
如何用更少数据训练推理模型?
- LIMO:仅用 817 个精心筛选的示例即可超越 10 万+示例训练的模型
- s1:1,000 个高质量问题-推理对 + 预算强制
如何提升小模型推理能力?
- 知识蒸馏:混合蒸馏、反事实蒸馏、反馈驱动蒸馏等
- 模型压缩:量化几乎无损保留推理性能;剪枝会严重损害多步逻辑能力
参考论文: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 的上下文达到
时,KV Cache 占用的空间和模型本身相当。
现有方法分为两类:
- 通过提示词工程或专门训练引导模型生成更少 token
- 推理过程中动态减少推理步骤和输出长度
LightThinker 属于第二类,在推理过程中动态压缩历史内容。
核心设计
LightThinker 解决了两个关键问题:
- 何时压缩? Token 级压缩可能忽略语义边界;Thought 级压缩能更好保留语义。LightThinker 通过重构数据解决。
- 如何压缩? 文本压缩需要额外编码模型;隐藏状态压缩将当前 thought 的隐藏状态压缩为少量 gist token,不需要额外模型。LightThinker 采用后者。
数据重建
- 使用分割函数
将输出 划分为 个子序列 - 在相邻子序列间插入特殊 token
: :压缩触发 token :gist token,用于保存压缩内容 :强制输出 token,基于压缩内容持续生成
注意力掩码
- 压缩过程:
只关注问题 、先前压缩内容和当前 thought,让 LLM 将关键内容压缩到 cache token 中。 - 生成过程:
只关注问题 和先前压缩内容,让 LLM 基于压缩内容继续推理。
实验
在 Qwen2.5-7B 上,LightThinker 降低 70% 峰值 token 使用量,推理时间缩短 26%,只下降 1% 准确率。
| 指标 | Qwen2.5-7B | Llama3.1-8B |
|---|---|---|
| 准确率下降 | 1% | 6% |
| 推理时间节省 | 26% | 1% |
| 峰值 token 减少 | 70% | 70% |
| Dep 减少 | 78 | 74 |
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 流程
- Token 剪枝:目标 LLM 生成 CoT 轨迹,根据 token 语义重要性降序排列,只保留前
比例的 token - 训练:用压缩后的 CoT 对目标 LLM 进行 LoRA 微调,数据格式为
x [EOS] γ [EOS] Compressed CoT y - 推理:给定问题和压缩比,模型生成的 CoT 中自动跳过不重要的 token
实验
| 数据集 | 压缩比 | 性能下降 | 延迟加速 |
|---|---|---|---|
| GSM8K | 0.53 | 10% | 1.8x |
| MATH-500 | 0.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 可能面临的问题:
- 可解释性下降:用户难以通过浓缩步骤理解推理过程
- few-shot 设计偏差:样例未覆盖场景下所有问题时,回答质量易下降
- 缺乏自我验证:大模型推理最后的自我验证能发现一些之前推理的错误
能实现推理加速的方法不止本章的这些。模型压缩(2.3 模型压缩)、FlashAttention(2.6 Flash Attention)、上下文窗口分割等方法同样能加速推理。