思维链(Chain-of-Thought, CoT)是一种引导大语言模型(LLM)通过中间推理步骤解决复杂问题的提示技术,自2022年提出以来已成为提升LLM推理能力的核心方法之一。
Chain-of-Thought(CoT)由 Google 的 Jason Wei 等人于2022年在一篇题为 "Chain-of-Thought Prompting Elicits Reasoning in Large Language Models" 的论文中正式提出。其核心思想是:在提示中提供一系列中间推理步骤的示例(而非直接给出答案),引导模型生成类似的逐步推理过程,从而显著提升模型在算术、常识推理、符号推理等复杂任务上的表现。
CoT 的提出背景在于:尽管大语言模型在各类 NLP 任务上表现出色,但在需要多步推理的复杂问题上(如数学应用题、逻辑谜题)表现往往不尽如人意。传统的直接输入输出映射(input → output)范式无法显式建模推理过程,而 CoT 通过引入中间推理链(input → reasoning chain → output)填补了这一空白。
| 时间 | 里程碑 | 关键贡献 |
|---|---|---|
| 2022.01 | CoT Prompting (Wei et al.) | 首次提出思维链提示,Few-shot CoT |
| 2022.05 | Zero-shot CoT (Kojima et al.) | 无需示例,只需添加"Let's think step by step" |
| 2022.07 | Self-Consistency (Wang et al.) | 多次采样取多数答案,提升鲁棒性 |
| 2023.03 | Tree-of-Thought (Yao et al.) | 将线性链扩展为树状搜索结构 |
| 2023.05 | Graph-of-Thought (Besta et al.) | 进一步扩展为图结构,支持多路径聚合 |
| 2024 | PoT / Tool-integrated CoT | Program-of-Thought,结合代码执行验证 |
Chain-of-Thought 的核心思想可以用以下范式表述:
传统 Prompt(无推理链):
Q: Roger 有5个网球,他又买了2罐网球,每罐有3个。现在他有多少个网球?
A: 11
CoT Prompt(含推理链):
Q: Roger 有5个网球,他又买了2罐网球,每罐有3个。现在他有多少个网球?
A: Roger 一开始有5个网球。2罐网球,每罐3个,所以一共买了 2 × 3 = 6 个。5 + 6 = 11。所以答案是 11。
Q: 食堂有23个苹果,用了20个做午餐,又买了6个。现在有多少个苹果?
A: 食堂原来有23个苹果。用了20个,所以剩下 23 - 20 = 3 个。又买了6个,所以现在有 3 + 6 = 9 个。所以答案是 9。
CoT 的有效性可以从以下几个角度理解:
1. 显式推理分解:将复杂问题分解为一系列更简单的子步骤,降低每一步的推理难度,使模型"逐个击破"。
2. 工作记忆扩展:推理链作为外部工作记忆,帮助模型在后续步骤中回顾中间结果,避免信息遗忘。这类似于人类在解复杂问题时在纸上写下中间结果。
3. 错误定位与修正:当最终答案错误时,推理链提供了可追溯的中间步骤,便于定位错误发生的环节。研究表明,CoT 的错误往往发生在推理链的中后期步骤。
4. 组合泛化:CoT 使模型能将其在训练中习得的基本推理能力组合起来解决新型问题,体现了一种组合泛化(compositional generalization)能力。
原理:在提示中包含若干包含完整推理链的示例(demonstrations),然后让模型对新的问题进行类似的逐步推理。
关键发现:
示例构建原则:
# Few-shot CoT 示例格式
prompt = """Q: {问题1}
A: {推理链1} 所以答案是 {答案1}。
Q: {问题2}
A: {推理链2} 所以答案是 {答案2}。
Q: {新问题}
A:"""
由东京大学的 Kojima 等人于2022年提出,是 CoT 技术的重要突破——无需任何示例。
原理:在问题后添加一个简单的触发句 "Let's think step by step"(让我们一步步思考),即可诱导模型生成推理链。
# Zero-shot CoT
prompt = "一个香蕉3个,小明买了5串香蕉,每串有4个香蕉。他一共有多少个香蕉?\n让我们一步步思考。"
Zero-shot CoT 的优势:
触发短语的变体:
| 触发短语 | 效果评估 |
|---|---|
| "Let's think step by step" | 最通用,效果稳定 |
| "Let's work this out" | 类似效果 |
| "首先," | 中文场景有效 |
| "一步一步分析," | 中文场景有效 |
| "We can solve this by" | 对数学问题略优 |
关键发现:Kojima 等人的实验表明,Zero-shot CoT 在 GSM8K(小学数学)上准确率从 10.4% 提升至 40.7%,改善约 4 倍。
由 Wang 等人于2022年提出,解决了单次 CoT 推理路径不稳定的问题。
核心思想:同一问题在不同采样下的推理路径可能不同,通过多次采样并取多数答案,可以获得更可靠的最终结果。
输入: "小明有 12 个苹果,给了小红 1/3,又给了小刚一半剩下的,还剩下几个?"
采样1: 12 → 给小红 12×1/3=4 → 剩下 8 → 给小刚 8×1/2=4 → 剩下 4
采样2: 12 → 给小红 4 → 剩下 8 → 给小刚 4 → 剩下 4
采样3: 12 → 给小红 4 → 剩下 8 → 给小刚 4 → 剩下 4
采样4: 12 → 给小红 4 → 剩下 6(错误) → 给小刚 3 → 剩下 3
投票结果: 答案 4 出现 3 次,答案 3 出现 1 次 → 最终答案: 4
Self-Consistency 的完整性表述:
其中 是采样次数, 是第 次解码的输出结果。
关键参数:
效果:在 GSM8K 上,Self-Consistency 将 CoT 准确率从 58% 提升至 74%(Wang et al., 2022)。
由普林斯顿大学的 Yao 等人于2023年提出,将线性推理链扩展为树状搜索结构。
核心思想:在每个推理步骤,模型生成多个可能的"思考节点",然后通过评估函数选择最有希望的节点继续探索,类似蒙特卡洛树搜索(MCTS)。
[问题: 24点游戏: 6, 10, 8, 4]
/ | \
[6+10=16] [10-6=4] [10×6=60]
/ \ / \ / \
[16+8=24] [16-8] [4-8] [4×8] ... ...
| |
[24×4] [32-4?]
ToT 的关键组件:
ToT 的具体实现:
def tree_of_thought(problem, max_depth=3, branching=5, eval_threshold=0.7):
"""Tree-of-Thought 的简化实现"""
from queue import PriorityQueue
# 初始化搜索树
start_node = {"state": problem, "path": [], "depth": 0}
frontier = PriorityQueue()
frontier.put((-1.0, start_node)) # 负分实现最大堆
best_solutions = []
while not frontier.empty():
_, node = frontier.get()
depth = node["depth"]
if depth >= max_depth:
# 评估最终解
score = evaluate_solution(node["state"], problem)
best_solutions.append((score, node))
continue
# 生成候选思维
candidates = generate_thoughts(node["state"], n=branching)
for candidate in candidates:
# 评估候选
score = evaluate_thought(candidate, problem)
if score >= eval_threshold:
new_state = node["state"] + "\n" + candidate
child = {
"state": new_state,
"path": node["path"] + [candidate],
"depth": depth + 1
}
frontier.put((score, child))
# 返回最佳解
best_solutions.sort(key=lambda x: x[0], reverse=True)
return best_solutions[0][1] if best_solutions else None
效果:ToT 在 24 点游戏上的成功率从 CoT 的 7.3% 大幅提升至 74%(GPT-4 + ToT)。
由 Besta 等人于2023年提出,进一步将推理结构从树扩展为有向无环图(DAG)。
核心创新:
GoT 与传统方法的对比:
| 特性 | Standard CoT | ToT | GoT |
|---|---|---|---|
| 数据结构 | 线性链 | 树 | 有向无环图 |
| 推理方向 | 单向 | 单向 | 双向/多向 |
| 路径聚合 | 不支持 | 不支持 | 支持 |
| 复杂度 | (更高) | ||
| 适用场景 | 简单推理 | 中等复杂 | 高度复杂推理 |
由 Zhang 等人提出,自动化构建 CoT 示例的过程,减少人工成本。
流程:
优势:无需人工标注,可随领域扩展自动适配。
由 Chen 等人提出,用代码执行代替自然语言推理。
核心思路:让模型生成 Python 代码而非自然语言推理链,然后通过执行代码获得正确答案。这种方法尤其适用于数值计算密集的任务。
Q: 一个数列前3项为2, 6, 18,求第10项。
# PoT 输出
def solve():
# 观察到这是等比数列,公比为 3
a1 = 2
r = 3
n = 10
result = a1 * (r ** (n - 1))
return result
answer = solve()
# 执行结果: 39366
PoT 的优势:
由 Zhang 等人于2023年提出,将 CoT 扩展到多模态场景(图文推理)。
关键贡献:
CoT 效果对采样参数较为敏感,以下是推荐设置:
import openai # 或对应的 LLM API
def chain_of_thought_inference(prompt, model="gpt-4", temperature=0.7, top_p=0.9):
"""
CoT 推理函数
"""
response = openai.ChatCompletion.create(
model=model,
messages=[
{"role": "user", "content": prompt}
],
temperature=temperature, # 0.7 适合 CoT 的多样性
top_p=top_p,
max_tokens=1024,
stop=["\n\n"] # 防止推理链过度延伸
)
return response.choices[0].message.content
def self_consistency_inference(prompt, model="gpt-4", n_samples=10, temperature=0.7):
"""
Self-Consistency 推理
"""
responses = []
for i in range(n_samples):
response = chain_of_thought_inference(prompt, model, temperature)
responses.append(response)
# 提取并投票选择最佳答案
answers = extract_answers(responses)
final_answer = majority_vote(answers)
return final_answer, responses
在中文场景下,触发短语的本地化选择会影响效果:
# 中文 Zero-shot CoT 示例
prompt_variants = [
"请一步一步推理,然后给出最终答案。",
"让我们一步步思考。",
"首先,我们来分析这个问题。",
"逐步分析:",
"我们来拆解这个问题。",
]
def zero_shot_cot_zh(question, trigger="让我们一步步思考。"):
prompt = f"{question}\n{trigger}"
return llm_generate(prompt)
CoT 生成的结果通常是"推理链 + 最终答案"的组合,因此需要可靠地从输出中提取答案:
import re
def extract_answer(text, answer_prefix="所以答案是"):
"""
从 CoT 输出中提取最终答案
"""
# 方法1: 查找答案前缀
if answer_prefix in text:
after_prefix = text.split(answer_prefix)[-1]
answer = after_prefix.strip().rstrip("。.!!")
return answer
# 方法2: 正则匹配最后出现的数字
numbers = re.findall(r"[=]\s*(\d+\.?\d*)", text)
if numbers:
return numbers[-1]
# 方法3: 取最后一行
lines = [l.strip() for l in text.split("\n") if l.strip()]
return lines[-1] if lines else text
CoT 推理可能产生"看似合理但实际错误的推理链"(hallucinated reasoning)。缓解策略包括:
def verified_cot(question):
"""带验证的 CoT 推理"""
# 阶段1: 生成推理链
chain = generate_cot(question)
# 阶段2: 验证推理链
verification_prompt = f"""请检查以下推理的每一步是否逻辑正确:
问题: {question}
推理: {chain}
如果有错误,请指出具体哪一步错误以及为什么。"""
verification = llm_generate(verification_prompt)
if "错误" in verification or "无误" not in verification:
# 推理有误,重新生成
return corrected_cot(question, verification)
# 阶段3: 答案提取
return extract_answer(chain)
问题:一个班级有 45 名学生。其中 2/5 是女生,剩下的都是男生。
如果男生中有 1/3 戴眼镜,那么戴眼镜的男生有多少人?
CoT 推理:
第一步:女生人数 = 45 × 2/5 = 18 人。
第二步:男生人数 = 45 - 18 = 27 人。
第三步:戴眼镜的男生人数 = 27 × 1/3 = 9 人。
所以答案是 9。
问题:如果所有的 A 都是 B,所有的 B 都是 C,那么以下哪个结论必然成立?
1. 所有的 A 都是 C 2. 所有的 C 都是 A 3. 有些 A 不是 C
CoT 推理:
第一步:所有的 A 都是 B,意味着 A ⊆ B。
第二步:所有的 B 都是 C,意味着 B ⊆ C。
第三步:由传递性,A ⊆ B ⊆ C,所以 A ⊆ C。
第四步:A ⊆ C 意味着所有的 A 都是 C,即结论1成立。
第五步:结论2和3不一定成立,因为没有足够信息。
所以答案是 1。
问题:一个人走进了一个房间,里面有一支蜡烛、一盏煤油灯和一个壁炉。
但他只有一根火柴。他应该先点燃什么?
错误回答:蜡烛(因为通常先点蜡烛)。
CoT 推理:
第一步:这个人有一根火柴,需要点亮某种东西来照明。
第二步:无论他想点燃蜡烛、煤油灯还是壁炉,他都需要先点火柴。
第三步:只有先点燃火柴,才能用火柴点燃其他东西。
所以答案是:先点燃火柴。
def sort_cities_by_latitude(cities):
"""
问题:有一个城市列表,需要按纬度排序返回城市名。
使用思维链辅助复杂代码生成。
"""
# 思路:
# 1. 假设输入是 [("北京", 39.9), ("上海", 31.2), ("广州", 23.1)]
# 2. 需要根据纬度(第二元素)排序
# 3. 返回城市名(第一元素)的有序列表
# 使用关键函数 sort + key
sorted_cities = sorted(
cities,
key=lambda x: x[1] # 按纬度排序
)
return [city[0] for city in sorted_cities]
| 维度 | 传统 Prompting | Chain-of-Thought |
|---|---|---|
| 推理方式 | 直接映射 (input → output) | 逐步推理 (input → steps → output) |
| 可解释性 | 黑盒 | 推理链可追溯 |
| 多步推理 | 弱 | 强 |
| 算术任务 | 中低 (~10-30%) | 高 (~60-90%) |
| 符号推理 | 弱 | 强 |
| 推理成本 | 低 | 较高(更多 token) |
| 延迟 | 低 | 较高(更多生成步骤) |
| 维度 | 微调 | CoT Prompting |
|---|---|---|
| 成本 | 高(训练数据 + 计算资源) | 低(仅推理时) |
| 灵活性 | 单一任务专用 | 通用推理增强 |
| 模型覆盖 | 所有模型 | 仅大型模型(>10B) |
| 迁移性 | 差 | 好 |
RAG 与 CoT 解决的是不同层次的问题,可以互补使用:
CoT 的效果与模型规模正相关。Wei 等人的实验表明,CoT 的显著收益仅在模型参数量达到约 100B 以上时才出现。小模型(如 T5-11B)上 CoT 的效果不明显甚至可能下降。
CoT 生成推理链产生的 token 数通常数倍于直接回答,导致更高的推理延迟和计算成本。对于在线部署场景,这可能带来实际的性能问题。
缺乏衡量推理链质量的自动化标准。目前主要依靠:
并非所有任务都受益于 CoT:
将 CoT 与 Self-Consistency 深度结合,通过多个采样路径的聚合进一步提升鲁棒性。最新的研究引入加权投票机制,根据每个推理路径的置信度赋予不同权重。
模型在推理过程中主动识别信息缺口,决定何时需要外部知识、何时推理路径需要回溯。这体现了"知道何时不知道"的元认知能力。
将复杂问题分解为层次结构,每一层处理不同粒度的推理子任务,最后整合结果。类似于人类解决问题的结构化方法。
CoT 在非英语语言上的表现正在被广泛研究。初步结果表明,用目标语言进行 CoT 推理通常优于先用英语推理再翻译。中文 CoT 的研究也在快速发展中。
CoT 正被广泛应用于 AI Agent 的规划模块中,作为 Agent 的"思考引擎",帮助 Agent 进行任务分解、工具选择和中间结果验证。
新的研究方向探索将 CoT、ToT、GoT 等不同推理结构进行动态组合,根据任务特性自动选择最优的推理拓扑。
Chain-of-Thought 是近年来大语言模型推理能力提升的关键技术之一。从最初的 Few-shot 到 Zero-shot,从线性链到树状/图状结构,CoT 正在不断进化。它的核心价值在于:
随着模型的持续进步,CoT 及其变体将成为 AI 系统架构中的基础设施级组件,就像"注意力机制"之于 Transformer 一样普遍。
本文是 AI 知识库 的一部分。