大模型复杂推理:思维链(CoT)基础用法与进阶技巧
COT 基础用法
Few-shot COT
Chain of Thought Prompting Elicits Reasoning in Large Language Models 是 CoT 的开山之作。其核心逻辑是通过 Few-shot 方案,引导模型生成中间推理过程,从而提高解决复杂问题的能力。
通过在 Few-shot 样本中加入推理过程,可以引导模型在解码过程中,先给出推理过程,再得到最终答案。类似中间推理过程的加入,可以显著提高模型在常识推理、数学问题、符号推理等复杂推理问题上的表现。
COT 带来的效果提升具有涌现性,通常在百亿参数以上的大模型上才出现显著更优的效果。COT 带来的效果提升在复杂问题例如 GSM8K 上表现更显著。
Few-shot 模板构建示例
我们使用 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 部分只加入公式并不能显著提升效果。个人感觉这个消融实验不太完整,因为很多复杂 MWP 问题模型很难映射到单一的公式,而先进行问题分解后再逐步映射到中间公式,在我们的场景里是可以提升效果的。
- 准确率提升是否因为 Few-shot-COT 帮助模型更好的召回相应的知识? 尝试了先给出答案再进行推理的 prompt 模板,发现效果显著变差。说明 Few-shot-COT 只是激活模型给出推理,推理过程本身才是模型效果提升的核心。
Zero-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 结果 |
|---|---|---|


