
最近经常被身边做应用的朋友问一个问题模型写文案、改代码都挺顺为什么一到需要“认真想”的任务就露怯比如让它解一道多步应用题或者根据几条事实做逻辑推理答案经常看着像那么回事一验算却是错的。这个问题的背后正是标题里那句话Can We Further Elicit Reasoning in LLMs直译过来就是——我们还能不能进一步把大语言模型脑子里的推理能力“勾出来”。我之所以强调“勾出来”而不是“教出来”是因为在很多场景里模型并不是完全没有推理能力而是这些能力被埋在了“最概然续写”的目标之下需要合适的提问方式、采样策略甚至验证机制才能被稳定释放。过去一年多关于这套“eliciting”的方法已经多到让人眼花缭乱但真正落到工程上大部分人其实只用了最简单的思维链。这篇文章想把我在实际项目中反复试过的思路、参数、坑以及后续可以继续挖的方向一次讲清楚给正在调模型的朋友一个可以直接抄作业的参考。1. 标题拆解所谓“eliciting reasoning”到底是在解决什么问题1.1 先把“推理”和“记忆”分开看很多人第一次接触大模型时会下意识把它当成一个“什么都知道的知识库”。但预训练语言模型的核心目标其实只是根据前文预测下一个词。它确实通过海量文本记住了大量事实性知识和语言模式但“记住答案”和“推出答案”是两回事。举个最直观的例子让模型回答“法国首都是哪里”它能秒回因为这句话在语料里出现过无数次但让它解决“甲比乙大三岁乙比丙小两岁丙今年十岁请问甲几岁”模型就算知道所有单点事实也可能在“谁比谁大、谁比谁小”的链条上绕晕。这不是知识不够而是推理链条没有被有效组织起来。Elicit这个词之所以精准是因为它暗示了一个前提模型参数里已经隐式地具备了某些推理能力但需要外部提示或环境把这些能力“诱发”出来。顺着这个思路工程上才有了无数种prompt技巧、采样方法和训练策略。理解这一点你就知道为什么我们不需要每次提升推理能力都去重新训练一个模型——很多时候换个提问方式和解码策略就能涨好几个点。1.2 “进一步”三个字背后的三层空间标题里的“further”很关键因为它承认一件事当前模型已经有一定的推理表现但还不够稳定、不够深、不够可控。研究者和工程师可以进一步下手的位置大致分成三层输入侧改变给模型的指令、示例或问题分解方式让模型更可能走“一步步思考”的路径解码侧改变采样参数、生成次数、搜索策略用计算量换取更多高质量候选答案模型侧通过微调、强化学习或数据筛选把推理能力固化进模型参数让它即使在没有复杂提示时也能稳定推理。三层互不排斥而且往往叠着用效果最好。在我自己的项目里第一步永远是先做输入侧的改进因为成本最低、反馈最快当prompt优化到瓶颈后再叠加解码侧的“多次采样投票”如果还要继续压榨才考虑在训练数据或验证模型上做文章。这个顺序也符合“从外到内”的资源投入逻辑。2. 目前主流的推理激发方法盘点2.1 Prompt侧思维链与它的各种变体要聊推理激发绕不开思维链Chain-of-ThoughtCoT。它的做法很朴素不要直接让模型给答案而是让模型先把推理过程一步步写出来。这个操作之所以有效我倾向于把它理解成“给模型一个慢思考的模板”。模型在生成时每一步只负责一个局部的小决策但连续输出“中间结果”的过程会迫使它把隐式的计算过程显式化地落到文本里。最省事的用法是零样本思维链在问题后面加一句“请一步步思考最后再给出答案”。这句话不依赖任何示例却经常能让模型在数学、逻辑类任务上显著提升。更稳一点的做法是少样本思维链在Prompt里给两三个完整的“问题-推理过程-答案”示例让模型模仿这种输出格式。基于这个思路后来又出现了不少变体从简到繁Least-to-Most先把大问题拆成若干子问题再按顺序解决。适合复杂任务因为它能降低“一步跨太大”的失误率。先规划再求解Plan-and-Solve要求模型先写出解题计划再执行计划。它的好处是让模型在生成具体步骤前先在大方向上收敛一下。自我提问Self-Ask让模型在推理过程中主动提出子问题并逐个回答特别适合需要查询外部知识的多跳问答。不过Prompt侧的方法有个共同问题它们只是在“输出格式”上做约束无法保证模型每一步都想对了。模型可能生成一条看起来逻辑顺滑但每一步都错的推理链。所以接下来有必要引入解码侧的手段。2.2 采样侧一致性投票与树状搜索思维链默认只让模型生成一条路径但大模型解码本身带有随机性。同一个问题用同样的Prompt跑多次模型可能给出不同思路和不同答案。既然如此一个自然的想法是多采样几条推理路径然后让答案投票多数获胜。这就是自洽性Self-Consistency方法。这个方法非常有工程价值。因为它不需要额外训练只是在“生成次数”上做加法。实测下来对数学应用题这类结果可比较的任务自洽性通常能把准确率再往上抬三到五个百分点尤其适合那些模型“第一直觉经常错但偶尔能蒙对”的题目。比平铺采样更进一步的是树状搜索。思维链是一条直线而真实解题过程往往是有分支的你可能需要尝试一种思路走到一半发现矛盾再换一种思路。树状搜索就是把这个试错过程显式建模先生成若干中间步骤然后用一个评估函数判断这些步骤的“价值”只保留得分高的分支继续扩展最后在叶子节点汇总答案。这种方法的收益很高代价也很高。它需要你手写一个评估函数或者让模型自己打分再配合搜索策略决定扩展哪些节点。在小规模Demo里还可以接受一旦问题复杂度上升搜索空间会迅速膨胀响应时间和计算成本都会变得很难看。所以我的经验是部门内部做原型时先上自洽性如果效果还不够再考虑用树状搜索去解决那批“模型反复在同一个地方出错”的顽固问题。2.3 验证侧结果奖励与过程奖励采样多了以后自然产生一个新问题投票是“少数服从多数”但错误答案不一定独立随机可能特定类型的问题总会把模型带偏到同一个错误上去。这时候靠投票不够需要一个单独的验证器来打分。验证器分两种结果奖励模型ORM只看最终答案对不对过程奖励模型PRM则给中间每一步打分。从原理上讲过程监督更符合“推理”的本质——一道题中间错一步最后答案偶尔也会被后面几步凑对但那不叫真会。过程奖励模型能在每一步识别出疑似错误这种细粒度反馈对后续训练和推理搜索都更有用。工程上最难的点在于过程标注从哪来。完全靠人工标注太重通常的替代方案是用强模型生成推理过程再自动判断每步是否与最终答案一致也可以用“从错误参考答案反推哪一步开始出错”的方式生成负样本。我在项目里用过一种相对省力的做法先用规则把推理步骤切分再让模型在每一步旁边标注“可信度”最后拿硬性的结果答案去校准这些可信度分数。虽然不是最精细但已经能把大部分短而虚的推理链筛掉。3. 实操环节我在项目里怎么用这些方法3.1 一个多跳逻辑任务的完整配置为了讲得具体我拿一个做过的模拟项目X举例。任务是自然语言多跳推理给出一组事实和规则比如“所有A类的物品都放在B区C物品属于A类请问C放在哪”。基础模型选的是一个没有经过专门推理强化、参数量在百亿级别的开源底座模型。目标是只通过推理时手段把效果从“基本不可用”拉到可交付状态。第一步就是设计Prompt。我没有用一句冷冰冰的“请一步步推理”而是给了模型更明确的阶段划分先抽取关键事实再做规则匹配最后给出结论。提示词大概是这样一个模板请完成下面的逻辑推理任务。 要求 1. 先列出问题中出现的事实和规则 2. 说明这些规则之间如何连接 3. 最后给出结论并用“结论”开头单独一行。 问题{question}这个模板看起来简单但它有三个隐藏作用。第一把推理过程拆成“抽取-连接-结论”三个阶段模型不容易一次性跳太久第二要求结论单独成行方便程序解析答案不需要在大量文字里找结果第三强制输出事实和规则相当于让模型把内部注意力集中到关键信息上降低被无关信息干扰的概率。3.2 参数选型与成本/效果权衡在设计完Prompt后真正影响结果的是解码参数。我整理了一张在实际项目中反复使用过的参数表适用于大多数开源底座模型上的思维链类任务参数推荐范围说明temperature0.2 - 0.7做单次确定性输出用低值做自洽性采样用0.7左右top_p0.9 - 1.0配合temperature使用一般开在0.95max_new_tokens每步150 - 300多跳推理总输出建议预留1500 - 2000repetition_penalty1.0 - 1.1超过1.1容易破坏推理连贯性谨慎调高采样次数 N5 - 20N5起步超过20边际收益明显下降关于采样次数我有过一个真实体验某次测试中把N从5提到10准确率涨了两个点从10提到20只涨了0.3个点从20提到50不仅没涨反而因为引入了大量偏远路径把投票结果带偏了一点。所以不要在N上盲目堆算力更重要的是保证每次采样之间“足够多样”。多样性的来源一是temperature二是Prompt里给出的示例风格。如果N次采样生成的都是同一套错误解法投票次数再多也救不回来。成本方面最容易忽略的是max_new_tokens。推理链一旦被max_tokens截断答案可能停在一半整个采样作废。你多花的那点token费用远比不上一次无效采样的浪费。我习惯把总预算分为两部分前80%留给推理过程后20%留给最终答案和格式收尾然后在输出示例里明确告诉模型“答案不要太长”。3.3 常见失败案例与排查实录再稳的方案也会踩坑我把自己遇到最多的四类问题整理成了一张排查表症状可能原因处理办法模型直接给结论跳过推理示例里没有强调步骤或指令被用户输入干扰在模板中加入“不展示步骤不给分”的约束推理链很长但答案错误中间某步计算/匹配出错导致错误传播拆解子任务每步增加自校验或引入计算器多次采样结果高度相似temperature过低或Prompt路径过于单一提高temperature尝试给出多种思路的少样本示例投票结果被某个错误答案占据模型对特定题型有系统性偏好引入验证器或对每类错误做针对性的反例提示这里我想特别展开第二个问题。模型输出“看上去很长的推理链”并不等于“有效的推理链”。我见过最典型的失败案例是模型为了一道加法题写了一百多词的解释最后答案错了。后来我让它在每步后面标注计算规则结果发现它在第一步就把条件搞反了。所以排查时不要只看最终答案要把中间步骤落下来逐段检查。这也是为什么我坚持在Prompt里强制“分阶段输出”而不是给一个大段自由发挥的窗口。另外如果任务涉及数值计算千万别指望模型在长链条里保持精确。我通常会让模型输出一个“调用表达式”比如“calc(12*35)”然后由外部解释器真正执行计算再把结果回填给模型。这一步看似绕实际上把最容易出错的部分从语言模型里剥离了出去效果立竿见影。4. 更深一层模型自身的推理elicitation4.1 把推理能力固化到参数里推理时手段的天花板取决于模型本身的能力。如果模型在预训练阶段很少见过结构化推理文本你就算Prompt写得再花它也只能模仿形式内核不扎实。因此“进一步eliciting”的另一条路是把推理能力固化进参数。常用的办法是在后训练阶段用包含详细推理过程的数据做监督微调。数据来源可以是用强模型生成的长思维链也可以是人工标注的解题步骤。这一步的核心不是让模型“看到更多答案”而是让它反复接触“从条件到结论”的中间状态。模型在微调后即使面对没有见过的题目也更倾向于生成结构化推理而不是直接蹦答案。我做过一组对比实验同一个底座模型一份直接用“问题-答案”数据微调另一份用“问题-逐步推理-答案”数据微调。在十个不同难度的逻辑基准上后者平均高出前者大概8到10个百分点尤其在需要三步以上推理的题目上差距更大。这说明“推理过程”本身也是一种模式可以被模型从训练数据里学到。4.2 推理时计算把思考变成一个可扩展的过程过去一年里最让我兴奋的方向不是简单的CoT而是“推理时计算扩展”。这个思路的本质是把推理从“一次生成”变成“一个可以持续投入计算的过程”。模型先生成若干候选思路再通过自我批评、外部反馈、搜索和修正反复迭代直到得出更可靠的结论。一个很简单的实现方式就是“自我辩论”让模型扮演正方和反方分别论证某个答案为什么成立、为什么不成立然后综合两边的观点重新给出结论。这种多角色方法不需要额外训练只需要多个Prompt调用和一次结果汇总却能显著减少“想当然”的错误。把它理解为“给模型装了一个复核流程”可能更贴切。更进一步的做法是让模型调用外部工具。比如代码解释器、计算器、知识库搜索。工具的作用不是替代模型思考而是给模型提供可验证的中间信号。模型说“计算结果是42”那就真的让计算器算一遍模型不确定某条事实那就去知识库里查一下。通过这种“生成-验证-修正”的循环模型的推理结果会被反复挤压向正确答案。这套流程在工程上已经有不少实现本质是把传统的“搜索校验”框架和大模型生成能力结合。4.3 关于“隐藏推理链”的工程现实随着推理能力被重视一些模型开始默认隐藏完整思考过程只给用户一个简洁的最终答案。这给工程集成带来了新麻烦你拿不到中间步骤就没办法做过程校验也没办法定位失败原因。我的建议是分清场景。如果你只是做一个面向终端用户的产品隐藏冗长思考过程反而是好事因为没人想看一长串自我纠正但如果你是想把模型接入一个需要稳定输出的业务系统那尽量选择允许你拿完整推理链的模型或开源模型。毕竟“可解释的过程”是排查问题的基础什么都藏起来出了问题只能干瞪眼。如果只能使用不暴露中间过程的接口也有替代方案让模型输出“简洁摘要版推理”或者把一个大任务拆成多次独立调用每次调用只负责一个小步骤。这样即使看不到隐藏思考你也能通过各步骤的输入输出定位到大致出错范围。5. 后续可以继续做的方向与评估建议5.1 评估时不要只看最终正确率很多团队在验证“推理激发”效果时只用最终准确率一个指标来对比这是不够的。准确率会掩盖两种关键差异第一模型是否正确推理但算错结果第二模型是否蒙对结果但推理过程一塌糊涂。对业务系统来说第二种更危险因为它的错误是随机且不可信的。我建议在评估体系里加入三个额外维度。一是步骤有效率把模型的推理过程拆成多个原子步骤人工或规则判断每步是否符合逻辑二是错误定位率当最终答案错误时模型是否能明确指出自己哪一步可能出错三是对扰动稳定性在问题措辞做微小变化时答案是否还能保持一致。一个擅长“真正推理”的模型在这些维度上的表现通常会比“纯模仿答案格式”的模型稳定得多。做对比实验时也注意不要只跑一次就下结论。由于解码随机性同一个设置跑三次准确率波动两三成都是常见现象。正确的做法是在一组固定测试集上至少跑三到五次取均值和方差再画一条“准确率随采样次数N变化”的曲线观察方法在哪个区间收益开始饱和。5.2 一套可复用的组合拳流程如果让我给一个务实路径我会推荐“提示词分层 自洽投票 验证器兜底 工具修正”的组合流程先写一个包含分阶段输出要求的Prompt并在少样本示例里混合不同解题思路用0.7左右temperature采样N条推理路径用一个轻量验证器对每条路径打分去掉低分路径对分数接近但结果不同的路径用外部工具如计算器或检索修正关键步骤最后对幸存路径的结果做加权投票权重来自验证器分数。这套流程实现起来不算复杂但每一步都需要监控成本和延迟。在成本敏感场景下一个有效的技巧是“先小模型多采样再大模型做验证”。小模型负责提供多样化的候选路径大模型不必每个都跑只负责对关键分歧点做最终裁断。这样既拿到了多样性又控制住了昂贵模型的调用量。开源社区的模型迭代非常快新模型越来越擅长长链条推理但“会推理”和“稳定推理”之间仍有距离。作为工程师与其等待一个完美模型不如先把上述这套围绕推理过程的工程框架搭好。模型一换框架依然可以复用。最后再分享一个我个人的心得在折腾这些方法时如果效果没有提升问题往往不在模型而在“目标定义”。你有没有想清楚什么才算这道题的正确推理如果你自己都无法评判中间步骤对不对那模型就更不可能自我纠正。所以开始调Prompt之前先花时间把评估标注规则写清楚。带着这个前提下一步不管是用CoT、自洽投票还是树搜索方向都不会跑偏。