一、什么是 Chain of Thought

Chain of Thought(CoT,思维链)是一种让大语言模型在给出最终答案前,先展示中间推理步骤的提示技术。由 Wei et al. (2022) 在论文 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models” 中首次提出。

1.1 核心思想

传统 Prompt 要求模型直接输出答案——这相当于让人不假思索地回答复杂问题。而 CoT 通过引导模型"自言自语"地推理,显著提升复杂推理任务的准确率。

# 标准 Prompt(直接输出)
Q: 小明有 23 个苹果,吃了 3 个,又买了 12 个。他有多少个苹果?
A: 32

# CoT Prompt(展示推理步骤)
Q: 小明有 23 个苹果,吃了 3 个,又买了 12 个。他有多少个苹果?
A: 小明开始有 23 个苹果。吃了 3 个之后,剩余 23 - 3 = 20 个。又买了 12 个后,总数为 20 + 12 = 32 个。所以答案是 32。

1.2 为什么 CoT 有效

因素说明
分解复杂度将多步推理拆解为可管理的子步骤
中间监督错误定位到具体步骤,而非全盘错误
计算复用中间结果可作为后续推理的上下文
注意力聚焦每一步聚焦当前子问题,减少信息丢失

二、CoT 的核心方法

2.1 Zero-shot CoT

通过简单短语 “Let’s think step by step” 触发推理链。无需示例,对大多数模型有效。

Prompt: 如果 5 个工人 5 小时能挖 5 个洞,那么 10 个工人 10 小时能挖多少个洞?让我们一步步思考。

模型输出: 5 个工人 5 小时挖 5 个洞 → 每个工人每小时挖 5/(5×5)=0.2 个洞。
10 个工人 10 小时能挖 10×10×0.2 = 20 个洞。答案是 20。

适用场景: 数学计算、逻辑推理、常识判断。

2.2 Few-shot CoT

在 Prompt 中提供 2-3 个带推理步骤的示例。示例质量直接影响效果。

# Few-shot CoT Prompt 结构
prompt = """Q: 一个篮球 120 元,一个足球比篮球贵 30 元,一副羽毛球拍比足球便宜 50 元。羽毛球拍多少钱?
A: 篮球价格 = 120 元。足球价格 = 120 + 30 = 150 元。
羽毛球拍价格 = 150 - 50 = 100 元。答案是 100。

Q: 图书馆有 3 层书架,每层 120 本书。周一借出 45 本,周二还回 28 本,周三借出 67 本。还剩多少本?
A: 总书数 = 3 × 120 = 360 本。
剩余 = 360 - 45 + 28 - 67 = 276 本。答案是 276。

Q: 一条绳子对折 3 次后每段长 15 厘米,绳子原来多长?
A: 对折 1 次 = 2 段,对折 2 次 = 4 段,对折 3 次 = 8 段。
原长 = 15 × 8 = 120 厘米。答案是 120。"""

2.3 自动 CoT(Auto-CoT)

当不愿手工编写示例时,让模型自己生成推理链示例:

  1. 将问题按难度聚类
  2. 每类选代表性样本,用 Zero-shot CoT 生成推理链
  3. 筛选高质量推理链作为 Few-shot 示例
import json
from openai import OpenAI

client = OpenAI()

def auto_cot(question: str) -> str:
    # Step 1: 生成演示示例
    demo_questions = [
        "小明有 10 元,花了 3 元买笔,又得到 5 元零花钱,现在有多少元?",
        "一个正方形周长 36 厘米,面积是多少?",
    ]
    
    demonstrations = []
    for q in demo_questions:
        resp = client.chat.completions.create(
            model="gpt-4",
            messages=[
                {"role": "user", "content": f"{q}\n让我们一步步思考。"}
            ]
        )
        demonstrations.append(f"Q: {q}\nA: {resp.choices[0].message.content}")
    
    # Step 2: 用生成的示例回答目标问题
    full_prompt = "\n\n".join(demonstrations) + f"\n\nQ: {question}\nA:"
    
    final_resp = client.chat.completions.create(
        model="gpt-4",
        messages=[{"role": "user", "content": full_prompt}]
    )
    return final_resp.choices[0].message.content

三、CoT 的高级变体

3.1 Self-Consistency(自一致性)

多次采样推理路径,通过投票选取最一致的答案。显著提升可靠性的技术。

def self_consistency(question: str, n_samples: int = 5, temperature: float = 0.7):
    answers = []
    for _ in range(n_samples):
        resp = client.chat.completions.create(
            model="gpt-4",
            messages=[{"role": "user", "content": f"{question}\n让我们一步步思考。"}],
            temperature=temperature
        )
        # 提取最终答案(简化版)
        full_text = resp.choices[0].message.content
        # 假设最后一行包含答案
        final_ans = full_text.strip().split("\n")[-1]
        answers.append(final_ans)
    
    # 多数投票
    from collections import Counter
    most_common = Counter(answers).most_common(1)[0][0]
    return most_common

# 示例
result = self_consistency("从 1 到 100 中,所有能被 3 或 5 整除的数之和是多少?")
print(f"最终答案: {result}")

3.2 思维树(Tree of Thoughts - ToT)

将线性推理扩展为树状搜索,探索多条推理路径并评估。

方法结构评估方式适用场景
CoT链式无中间评估步骤固定的问题
ToT树状BFS/DFS + 自评估需要探索的开放问题
Self-Consistency多链投票答案空间有限的问题

3.3 思维链与工具调用结合

让 CoT 在推理过程中调用外部工具(计算器、搜索引擎、代码执行器)。

import math

def cot_with_calculator(question: str) -> str:
    """
    CoT + 计算器:模型生成推理步骤,实际计算由代码完成
    """
    system_prompt = """你是一个带计算器的推理助手。请遵循以下格式:
推理: <你的推理过程>
计算: <需要计算的表达式>
...
最终答案: <数值结果>"""
    
    resp = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": question}
        ],
        temperature=0
    )
    
    text = resp.choices[0].message.content
    
    # 提取所有计算步骤并验证
    import re
    calculations = re.findall(r"计算:\s*(.+)", text)
    for calc in calculations:
        try:
            result = eval(calc, {"__builtins__": {}}, {"math": math})
            print(f"验证: {calc} = {result}")
        except:
            print(f"计算失败: {calc}")
    
    return text
工具类型结合方式典型应用
计算器解析表达式 → eval数学题、财务计算
代码解释器生成代码 → 执行数据分析、图表生成
搜索引擎推理中插入搜索实时信息问答
知识图谱推理中查询实体多跳知识推理

四、CoT 的最佳实践

4.1 Prompt 模板设计

你是一个逐步推理的助手。对于每个问题:

1. **理解**:用自己的话重述问题,确认理解正确
2. **分解**:将问题拆解为独立的子问题
3. **推理**:逐一解决每个子问题,展示中间结果
4. **整合**:汇总所有子问题的结果
5. **验证**:反向验证答案是否合理
6. **答案**:给出最终结论

请遵循以下格式:

问题: <用户问题>
理解: ...
分解: ...
推理: ...
整合: ...
验证: ...
答案: <最终结果>

4.2 常见陷阱

陷阱表现解决方案
过早收敛模型跳过关键推理步骤明确要求"每一个步骤都不能省略"
虚假推理推理正确但答案错误添加验证步骤 + Self-Consistency
上下文稀释长推理链中丢失早期信息定期总结中间状态
过度推理简单问题也深度推理根据问题复杂度动态选择策略

4.3 复杂度动态选择

def adaptive_cot(question: str) -> str:
    """根据问题复杂度自动选择推理策略"""
    
    # 判断复杂度
    word_count = len(question)
    has_numbers = any(c.isdigit() for c in question)
    has_conditions = any(kw in question for kw in ["如果", "假设", "条件", "unless", "if"])
    
    # 简单问题 → 直接回答
    if word_count < 20 and not has_numbers and not has_conditions:
        return direct_answer(question)
    
    # 中等问题 → Zero-shot CoT
    if word_count < 60 and has_numbers:
        return zero_shot_cot(question)
    
    # 复杂问题 → Few-shot CoT + Self-Consistency
    return self_consistency(question, n_samples=3, temperature=0.5)

五、效果评估

任务类型标准 PromptCoTSelf-Consistency CoT提升幅度
小学数学58%78%86%+28pp
符号推理35%65%72%+37pp
常识推理72%81%84%+12pp
多步复合42%67%76%+34pp

六、总结

Chain of Thought 是 Prompt 工程中最重要的推理增强技术之一。它简单、有效、普适。最关键的实践要点:

  1. Zero-shot CoT 是零成本提升 — 任何时候都可以先加"让我们一步步思考"
  2. Few-shot 示例质量决定上限 — 精心设计 2-3 个代表性示例远胜 10 个随意示例
  3. Self-Consistency 是最佳搭档 — 与 CoT 组合,效果提升最显著
  4. 工具集成是下一阶段 — CoT + 代码/搜索/计算器 = 可靠推理

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。