大模型复杂推理:思维链(CoT)基础用法与进阶技巧
大模型思维链(CoT)的基础用法与进阶技巧。内容包括 Few-shot COT 和 Zero-shot COT 的原理及效果对比,分析了激活词对推理的影响。进阶部分讲解了 Self-Consistency 通过投票机制提升准确率的方法,以及 Least-to-Most 通过问题拆解循序渐进解决的策略。文章还提供了 Python 代码实现示例,并总结了 CoT 技术的局限性如幻觉风险和 Token 成本,最后给出了实际应用中的最佳实践建议。

大模型思维链(CoT)的基础用法与进阶技巧。内容包括 Few-shot COT 和 Zero-shot COT 的原理及效果对比,分析了激活词对推理的影响。进阶部分讲解了 Self-Consistency 通过投票机制提升准确率的方法,以及 Least-to-Most 通过问题拆解循序渐进解决的策略。文章还提供了 Python 代码实现示例,并总结了 CoT 技术的局限性如幻觉风险和 Token 成本,最后给出了实际应用中的最佳实践建议。

Chain of Thought Prompting Elicits Reasoning in Large Language Models 是 CoT 的开山之作。其核心逻辑是通过 Few-shot 方案,引导模型生成中间推理过程,从而提高解决复杂问题的能力。
通过在 Few-shot 样本中加入推理过程,可以引导模型在解码过程中,先给出推理过程,再得到最终答案。类似中间推理过程的加入,可以显著提高模型在常识推理、数学问题、符号推理等复杂推理问题上的表现。
COT 带来的效果提升具有涌现性,通常在百亿参数以上的大模型上才出现显著更优的效果。COT 带来的效果提升在复杂问题例如 GSM8K 上表现更显著。
我们使用 Belle 的数学 COT 指令样本采样 10 个构建了一组 few-shot 思维链指令。以下是一个经典的汽车相遇问题测试:
问题: 两辆汽车从相距 500 千米的两城同时出发,相向而行。一辆摩托车以每小时 80 千米的速度在两辆汽车之间不断往返联络。已知这两辆汽车的速度分别是每小时 40 千米和 60 千米,求两汽车相遇时,摩托车共行驶了多少千米?
正确解法: 500 / (40 + 60) * 80 = 400 千米
以下是分别使用 ChatGPT 和 ChatGLM 在 Greedy-search 模式下进行解码的结果对比:
| Prompt 类型 | ChatGPT 输出结果 | ChatGLM-6B 输出结果 |
|---|---|---|
| 直接提问 | 设两汽车相遇时间为 t 小时... 代入可得,摩托车共行驶了 800 千米。(错误) | 设两汽车相遇时,摩托车行驶了 x 小时... 因此,两汽车相遇时,摩托车共行驶了 4000 千米。(错误) |
| Few-shot COT | 设摩托车共行驶了 x 千米... 根据摩托车的速度和时间,可以得到:x = 80 千米/小时 × 5 小时 = 400 千米。(正确) | 设两汽车相遇时,摩托车行驶了 x 小时... 因此,摩托车共行驶了 400 千米。(正确) |
加入 COT 之后,ChatGPT 和 ChatGLM 都答对了。虽然不加入 Few-shot COT 模型同样会进行推理再给出答案,但加入 Few-shot COT 能显著提升准确率。
论文还进行了一些消融实验:
除了使用 Few-shot-COT 样本可以让模型给出推理过程,单纯用指令也可以让模型给出思维链,且能进一步提升模型复杂问题推理能力。论文中效果最好的激活思维链的指令是 "Let's think step by step"。
Zero-shot-COT 在论文中需要两步解码,第一步用 "Let's think step by step" 让模型给出推理过程,第二步把推理过程和问题一起输入模型,让模型给出结果。但实际使用时你会发现,基本上第一步解码模型就会在推理结束时给出结果,所以其实 Zero-shot-COT 也可以直接一步到位。
| 激活词 | ChatGPT 结果 | ChatGLM 结果 |
|---|---|---|
| 请一步步的推理分析解决以下问题 | 设两汽车相遇时间为 t 小时... 因此,摩托车共行驶的距离为 400 千米。(正确) | 设两汽车相遇时,摩托车行驶了 x 小时... 因此,两汽车相遇时,摩托车共行驶了 3000 千米。(错误) |
| 请逐步推理回答问题 | 设两汽车相遇时间为 t 小时... 因此,两汽车相遇时,摩托车共行驶了 800 千米。(错误) | 设两汽车相遇时,摩托车行驶了 x 小时... 因此,两汽车相遇时,摩托车共行驶了 490 千米。(错误) |
整体提示词的效果比较玄学,但只要指令词有引导模型逐步推理的含义,对模型效果都是有提升的。Zero-shot-COT 同样具有规模效应,只在大模型上才表现出超越常规指令的效果。
以上不论是 Few-shot 还是 Zero-shot COT 都是基于模型自身给出推理过程,而人工不会过多干预推理过程。在进阶用法中会对推理过程做进一步的人工干预来引导解码步骤,进一步提升解码准确率,且以下的进阶方案是可以组合使用的。
Self-Consistency 是在 Few-shot-COT 的基础上,用 Ensemble 来替换 Greedy Search,来提高解码准确率的一种解码策略。论文显示加入 Self-Consistency,可以进一步提升思维链的效果(GSM8K +17.9%)。
在使用大模型进行固定问题回答例如多项选择、数学问题时,我们往往会采用 Greedy-Search 的方式来进行解码。但每一步都选 Top Token 的局部最优的解码方案很显然不是全局最优的,而 Self-Consistency 提供了一种无监督的 Ensemble 方案,来对模型随机解码生成的多个回复'投票'出一个更准确答案。
Self-Consistency 的基础假设很人性化:同一个问题不同人也会给出不同的解法,但正确的解法们会殊途同归得到相同的正确答案。以此类比模型解码,同一问题不同随机解码会得到不同的思维链推理过程,期望概率最高的答案,准确率最高。
针对解码输出,如何对答案进行聚合,论文对比了以下几种方案:
如果说上面的 Self-Consistency 多少有点暴力出奇迹,那 Least-to-Most 明显更优雅一些。思路很简单,在解决复杂问题时,第一步先引导模型把问题拆分成子问题;第二步逐一回答子问题,并把子问题的回答作为下一个问题回答的上文,直到给出最终答案,主打一个循序渐进的解决问题。
在实际工程中,我们可以通过 Python 脚本快速构建 Few-shot CoT 的 Prompt。以下是一个简单的实现示例:
def build_cot_prompt(question, examples):
"""
构建 Few-shot Chain of Thought Prompt
Args:
question: 当前待解决的问题
examples: 包含推理过程的示例列表,格式为 [(question, reasoning, answer), ...]
Returns:
str: 完整的 Prompt 字符串
"""
prompt_parts = []
for ex_q, ex_r, ex_a in examples:
prompt_parts.append(f"Question: {ex_q}\nReasoning: {ex_r}\nAnswer: {ex_a}")
prompt_parts.append(f"Question: {question}\nReasoning:")
return "\n".join(prompt_parts)
# 示例数据
examples = [
(
"小明有 5 个苹果,吃了 2 个,还剩几个?",
"小明初始有 5 个苹果。他吃了 2 个,意味着数量减少。我们需要计算 5 减去 2。",
"3"
),
(
"一辆车以 60km/h 行驶 2 小时,走了多远?",
"距离等于速度乘以时间。速度是 60km/h,时间是 2 小时。计算 60 乘以 2。",
"120km"
)
]
problem = "一辆车以 80km/h 行驶 3 小时,走了多远?"
prompt = build_cot_prompt(problem, examples)
print(prompt)
尽管 CoT 技术显著提升了大模型的推理能力,但在实际应用中仍需要注意以下几点:
思维链(CoT)通过显式地引导模型生成推理步骤,有效解决了大模型在复杂推理任务上的短板。从基础的 Few-shot 和 Zero-shot 方法,到进阶的 Self-Consistency 和 Least-to-Most 策略,CoT 技术栈正在不断丰富。开发者应根据具体业务场景,选择合适的 Prompt 策略,并结合代码实现进行优化,以最大化利用大模型的推理潜力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online