先说个我自己的经历。前阵子我在一组多步数学推理题上反复折腾提示方案,最让我困惑的不是某个模型答不出题,而是同一个模型、同一道题,换个问法就从“一步一步来”变成“直接给结论”,准确率能掉二十个百分点以上。那时候我就意识到,LLM的推理能力不是一道开关,更像是一个需要不断调节的水龙头:水一直在,但怎么让它稳定地流到该去的地方,才是真正值得研究的问题。
所以看到“Can We Further Elicit Reasoning in LLMs?”这个标题时,我第一反应是:这不是个能不能的问题,而是个怎么做的问题。过去两三年里,提示工程、推理蒸馏、自洽性采样这些方法确实把模型的推理表现推高了一大截,但越往后做越发现,靠提示“诱导”出来的推理和模型真正“内化”的推理是两回事。这篇文章我想从实操角度聊聊,在现有LLM推理能力基础上,我们还能从哪些地方继续“挤”出更多推理,哪些方法已经到瓶颈,哪些地方还有空间。
1. 先搞清楚边界:推理到底是模型“有”的技能,还是被“逼”出来的行为
1.1 从“会做题”到“会推理”之间的真实差距
我见过不少评测方案,拿几个推理基准跑一遍,分数高就认为模型“具备推理能力”。但实际用起来完全两码事。比如一个模型在GSM8K风格题目上能拿八十分,你给它一道题干稍微绕一点、或者数字更大的变体,它可能直接崩掉。这说明什么?说明模型记住的不是推理方法,而是题目模式和答案分布。
推理能力和题目解答能力不能画等号。前者指的是模型能根据给定的条件,按逻辑规则生成中间结论,并最终导出正确答案;后者可能只是条件反射式地匹配训练阶段见过的相似题型。区别这两者的最好办法,就是做“难度迁移测试”:训练和测试的题目类型一致但复杂度不同,看模型能不能把低难度下学会的推导方式迁移到高难度场景。我在实际评测中发现,很多模型在迁移时掉点非常严重,而且掉点幅度和提示方式高度相关。
1.2 推理是“涌现”的还是“诱导”的
现在业内有个常见说法:推理能力是模型规模大到一定程度后涌现出来的。这个说法有一定道理,但不完整。规模提供了涌现的潜力,可如果不通过提示、微调或解码策略去“诱导”,这个潜力未必会稳定释放。我做过一个对照实验:同一个模型,不加任何推理提示直接出答案,和加了少量思维链示例后再出答案,在同一个测试集上差距能有十五个点。
这引出一个关键结论:推理更像是一个需要特定条件才能触发的过程,而不是模型随时都在执行的默认行为。所谓“进一步激发推理”,本质上就是在找这些触发条件,并且让触发后的推理过程更可靠、更高效。
1.3 我们讲的“进一步激发”到底指什么
如果把问题拆细,可以分成三个层次:
- 第一层:提高触发率。让模型在更多类型的题目上愿意走推理流程,而不是遇到题就凭直觉猜。
- 第二层:提高推理质量。保证中间步骤逻辑正确,不出现那种“前面算错后面蒙对”的情况。
- 第三层:提高推理效率。用更少的中间步骤和更短的推理链达到同样甚至更好的准确率。
很多人一上来就盯第二层,但实际工程里第一层往往更棘手。毕竟模型根本不开推理模式的时候,你连优化中间步骤的机会都没有。
2. 推理的“阀门”在哪儿:我习惯把问题分成三个层面来看
2.1 提示层:用上下文搭脚手架
提示层是成本最低、见效最快的切入点。核心思路是让“解题过程示范”进入输入上下文,模型在生成时会模仿这种示范的格式和逻辑节奏。经典的做法有几种:
- 少样本思维链:给两个到五个完整的解题示例,每个示例都包含“条件分析-中间推导-最终答案”。
- 零样本思维链:不举例子,直接用“让我们一步一步思考”这类指令触发分步输出。
- 结构化拆解:要求模型先列已知条件、再列未知目标、然后分步求解。
- 自我校验:要求模型在得出答案后回头检查哪一步可能有问题。
这些方法背后其实共享同一个机制:把输出空间从“直接给答案”扩展成“结论加推导路径”,让模型在每一步都有一个可观测的中间目标,减少因为局部生成偏差导致全盘崩溃的概率。
我自己的测试里,少样本思维链在中低难度题目上最稳,但有个隐性成本:示例一多,输入长度暴涨,推理速度变慢。零样本思维链的开销小,可稳定性差一些,碰上那些本来就不太会做的题,容易生成看似合理但一步错步步错的伪推导。
2.2 权重层:把推理固化进参数里
提示层再怎么调,也改变不了模型内部权重。想让推理真正“长在”模型里,必须动权重层。常见路径有两条:
- 监督微调:准备一批高质量推理轨迹,让模型在给定题目时学会生成类似的推理链。
- 偏好优化:不直接固定推理路径,而是让模型比较不同回答的好坏,比如哪条推理链更严谨、哪条更简洁、哪条最终答案正确。
权重层的改动比提示层深远得多。提示层的效果随着上下文变化可能时有时无,而权重层的效果是“默认行为”层面的:哪怕你不给推理示例,模型也倾向于分步输出。代价是训练成本高、周期长,而且数据质量稍有问题,模型就可能把错误推理方式也固化进去。
2.3 解码层:让模型多试几次,而不是只试一次
这层经常被忽略,但我认为它特别重要。模型在生成时本质是在概率空间里做采样,同样的输入、同样的提示,多次运行可能产生不同结果。于是我们可以用自洽性策略:让同一个模型在同一个题目上采样多次,然后对最终答案做多数投票。
这个思路的直观解释是:如果模型真是靠推理解决问题,那么即便中间步骤略有差异,最终答案倾向于收敛到正确值;如果模型是瞎猜的,那么多次答案会分散,投票后正确率也不会显著提升。实操中,采样次数在五到八次时收益最明显,再往上收益递减,而成本线性增长。
解码层面还有一个值得玩的点是“推理预算控制”:通过显式限定“请用不超过多少步完成推理”,可以观察模型在不同计算预算下的行为模式。部分模型在被迫更简短时反而准确率上升,因为它们删掉了那些自嗨式的废话推导。
3. 提示层的实战观察:哪些技巧真的有用,哪些是自我安慰
3.1 思维链的真正价值在于“分段提交”
我做过一个对比测试:同样是让模型解一道鸡兔同笼变体题,直接问“答案是多少”,模型给了个错的整数;加上“请逐步思考”后,模型列方程式、解方程、代入验证,最终得出了正确答案。看起来是思维链的功劳,但进一步测试发现,真正起作用的是“分段提交”这个行为本身:每生成一步,模型等于做了一次局部约束,后续生成依赖前面刚生成的中间结果,而不是依赖可能已经混乱的全局语义。
这让我后来在设计提示词时形成了一个习惯:如果模型很容易在长推导中跑偏,就要求它每做一步都“重新引用一次题干的关键条件”。这个简单的复述动作,经常能让推导稳定度提升不少。
3.2 少样本示例不是越多越好,而是越“对齐”越好
很多人的直觉是示例越多,模型越容易模仿。实际并不完全对。模型对示例的模仿更多是格式级别的,比如“解题步骤的排版”“答案的表述方式”,而不是逻辑结构。如果给的两个示例都是同一类解法,模型很容易把特定解法当成唯一解法,遇到需要换思路的题就僵住。
我推荐的示例搭配方式是:
- 两个示例最好覆盖不同的解题路径(比如一个用代数、一个用枚举)。
- 示例长度不要过长,两到四步能讲清的为主,特别长的示例会让模型过度延长输出。
- 可以在示例里顺带展示“检查”动作,让模型模仿时不只输出推导,还会输出校验过程。
3.3 最容易翻车的几种提示方式
以下是我在实际评测中踩过、或观察别人踩过的坑:
- 把推理过程强塞到一句话里。比如“请分步思考,但不要输出中间步骤”,这种方法基本没用,因为你不让模型输出中间步骤,它就很难真正组织中间推理。
- 在提示里用“你是一个逻辑专家”这类身份设定。偶尔有效,但方差大,而且容易让模型在前缀上过度投入,生成一堆无关身份陈述。
- 追求每一步都是自然语言。有些模型在自然语言表达上绕来绕去,反而被自己绕晕。对这类模型,要求它用符号、公式、编号列表表达推理,效果更好。
- 忽略数字和单位的约束。我见过不少模型在推理中把“千克”和“克”混在一起算,提示里明确要求“全程统一单位”,准确率能直接拉高几个点。
3.4 为什么会出现“越提示越差”的反常现象
提示不是万能的,它有时还有副作用。我碰到过一种情况:某些模型在短答案模式下能靠直觉蒙对,一旦强制它长推理,它反而会生成一个冗长但错误的推导,并且因为推导过程看起来完整,最终答案也自信地错了。
这类现象说明一个深层问题:提示只是改变了生成路径,并没有改变模型内部的真实推理能力。如果模型本身没有掌握某类问题的解法,逼它分步走只是让它更系统地犯错。所以在做提示优化时,一定要配套一个“推理崩溃率”指标——统计推理链中有多少步是错的,而不是只统计最终答案对错。
4. 训练侧的突破:怎么把“诱导来的推理”变成“内化的能力”
4.1 用大模型生成推理轨迹做蒸馏,注意“干净度”
一个很常规的操作是:拿大模型当“推理教师”,让它生成一批带解题过程的问答对,再用这批数据微调小模型。这条路确实有效,但核心风险在数据质量。大模型生成推理轨迹时,经常出现最终答案对、中间步骤错的情况,小模型学过去后,会把这些错误推理方式原封不动复制下来。
我在处理这类数据时,会加一道“反向校验”流程:把生成好的推理轨迹交给另一个模型做审查,专门标注那些“中间推导和最终答案不自洽”的样本,筛掉或重写。清洗后的数据训出来的模型,推理稳定性明显好于直接用原始数据训的模型。
4.2 偏好数据比正确答案数据更耐训
监督微调本质上是在“背”推理轨迹,模型学到的是给定题目的标准解法。但实际使用中,一道题的解法不止一种,标准解法也不一定是最适合模型自身参数分布的解法。偏好优化在这点上更灵活:它不是给模型一条固定路径,而是让模型看到“两条路径,哪条更好”,从而学会判断推理的优劣。
我在实践中用偏好数据训练模型时,有一个比较具体的经验:
- 构造偏好对时,不能只看答案对错。一个答案正确但推理很跳跃的样本,应该排在“答案错误但推理过程每一步都暴露了问题所在”的样本之后,因为后者更有教学价值。
- 偏好对里的两个样本最好来自同一条推理链的不同分支,这样模型能更快定位到“在哪一步开始偏离”的敏感位置。
- 数据量不需要很大,几千条高质量偏好对,往往比几万条监督微调数据效果更明显,尤其是对推理步骤紧凑性的提升。
4.3 评估集本身也是训练的一部分,别用一个尺子量所有模型
有的读者可能觉得评估是评测阶段的事,和训练无关。但我自己的经验是,评估集设计直接影响训练决策,特别是在迭代训练时。
如果你的评估集只有“最终答案是否正确”这个指标,你会发现训练中模型的损失降得很快,但模型实际推理能力提升很慢。原因是模型在优化“输出正确答案”的概率,而不是“推导过程合理”的概率。所以我在训练迭代中会额外盯三个指标:
- 逐步正确率:把推理链按步骤切开,看每一步的单独正确率。
- 回跳率:模型在推理后半段有没有推翻自己前半段的结论,回跳次数越多说明模型越不稳定。
- 无关内容率:生成内容里有多少是重复性套话、无关解释,这类内容多了说明模型在“表演推理”而不是推理。
5. 评估的暗礁:最终答案对了,不代表推理真的发生了
5.1 测试集污染:你在测记忆,不是测推理
推理评测最大的敌人是数据污染。公开推理基准的题目大量出现在模型训练语料里,模型看到的“推理题”很可能早就见过答案了。这时候你测到的分数,本质上是在测记忆。
规避方法没有完美的,但可以多管齐下:
- 使用新造的、不在公开数据里的题目,比如把现有题目的数字、实体、场景全部替换。
- 在评测中加入“题目太难也不影响语言模型记忆”的控制组:把同样的题反复做小改动,看模型表现是否大幅波动。
- 记录模型对题目的“反应时间”——虽然这个指标在API上不容易拿准,但本地部署时可以测量生成首字符前的处理耗时,见过类似题的模型往往首字符生成更快。
5.2 伪推理:过程漂亮,根子是错的
我在很多模型输出里见过一种现象:推理链写得特别完整,有已知条件、有公式、有代入、有结论,但第一步的条件理解就是错的。后面每一步看起来都合情合理,实际全部建立在错误前提上。
这说明模型在“生成推理过程”和“执行推理计算”之间仍然是脱节的。它擅长生成一段推理语境的文本,却不擅长真正沿着逻辑做计算。面对这种情况,我的处理办法是给模型出“反事实题”:把一道常规题目的一个条件改成矛盾条件,看模型能不能识别出题目无解。能识别出无解的,才算真正理解条件之间的约束关系。
5.3 难度分布才是评估推理能力的关键
用一个全是中等难度题目的测试集来评测,分数高不具有说服力。推理能力的标志是在难度跨越时保持稳定。我建议评测集至少包含三档难度:
- 低难度:一眼能看懂,验证模型的基本步骤输出能力。
- 中难度:需要两到三次转译才能落到公式,验证模型的中间表征能力。
- 高难度:需要引入额外假设或分情况讨论,验证模型处理复杂逻辑树的能力。
一个我经常用来判断模型“有没有在推理”的指标是“失败模式分布”。如果模型在低难度题目上几乎全对,在中难度开始出现系统性错误,在高难度上完全靠猜,那说明它掌握的可能是“模式识别”;如果模型在三个难度段上的失败模式比较接近,比如都是某一类约束处理不好,那反而说明它有统一的推理框架,只是框架有缺陷。
6. 结合我自己的实操,给你一个“最小成本推理提升”行动清单
6.1 先从提示层开始,别急着微调
绝大多数项目的推理瓶颈,都是提示配置没有最优化,而不是模型能力不够。所以我的第一个建议永远是:先把提示工程做到位。
具体的低成本实验顺序,我建议这样走:
- 准备一个一百道题的验证集,覆盖三档难度。
- 基准测试:不加任何推理提示,直接让模型给答案。
- 加法测试:依次叠加零样本思维链、少样本思维链、自洽性采样。
- 记录每一组配置下的准确率、平均输出长度、推理崩溃率。
- 选出一组在准确率和成本之间最平衡的配置,作为后续实验的固定基线。
这套流程不需要训练资源,只需要耐心的API调用和结果统计。很多项目在这个阶段就能把准确率提升十个百分点左右。
6.2 如果提示层已经榨干,再考虑“采样换准确率”
当提示层优化进入平台期,下一步不是直接微调,而是先上自洽性采样。这个思路前面讲过,就是多次采样加多数投票。
实操上注意几个参数:
- 温度建议控制在0.4到0.7之间。温度太低,多次采样的结果高度趋同,投票没有意义;温度太高,答案过于发散,有效票数变少。
- 采样次数从五次起步,逐步提升到八次、十次,观察准确率增益曲线。如果八次相比五次提升不到两个点,说明模型真实推理能力有限,再增加次数只会烧token。
- 投票时最好对“答案格式”做归一化处理,不然同一个数学结果可能因为表述方式不同而被计成不同答案。
6.3 预算充足的团队,把训练重点放在偏好优化和推理数据清洗
如果项目允许投入训练资源,我建议不要在单纯扩大监督数据量上死磕。更值得做的两件事是推理数据清洗和偏好优化。
推理数据清洗的方式前面提过:用审查模型过滤那些“答案对但推导错”的样本。很多团队直接用大模型生成几万条轨迹,筛掉格式不合规的就去训练,这是对数据价值的浪费。你需要做的是让筛掉的条件更聚焦,比如“推导步骤中存在数学符号冲突”“冗余地重复同一结论超过两次”,这些规则性筛查比人工抽检覆盖率高得多。
偏好优化的训练成本比监督微调高一些,但收益点不一样:它提升的是模型的“选择判断力”,让模型在遇到没见过的题目时更倾向于走一条稳健的推理路径,而不是贸然给出一个没有依据的结论。
6.4 几个经常被忽视的细节
最后分享几个我在实操里踩过的细节坑:
- 推理提示和业务指令打架时,优先保障业务指令。比如客服场景要求简洁回复,你硬塞“请逐步思考”,用户会直接投诉。
- 输出长度限制会影响推理深度。如果API设置了最大输出token,模型在推理后半段会被迫压缩步骤,导致跳步错误。需要推理的任务,输出上限至少留够推理链长度的两倍。
- 多数投票在答案分布极不均匀时效果不好。比如某个题目大部分采样结果都集中到一个错误答案,投票结果就锁死在错误上。这种情况说明模型在该题上存在系统偏差,提示干预已经不够了。
- 模型版本升级后,原来的提示配置可能要重新调。我在实际项目中多次遇到“升级后同样提示效果变差”的情况,所以每次模型版本切换,都要跑一遍基准回归测试。
我在这些实验里最大的感受是,所谓“进一步激发LLM推理”,不是靠某一个单一技巧的灵光一现,而是提示、解码、训练、评估四个环节的持续协作。每一层都在原有基础上推进一步,叠加起来的效果才算是真正往前迈了一步。方向对了,剩下的只是耐心迭代。