大模型Chain-of-Thought (CoT) 思维链
摘要:在面对复杂推理任务时,直接让大语言模型 (LLM) 给出答案往往不够可靠。Chain-of-Thought Prompting (思维链提示) 通过引导模型展示中间推理步骤,大幅提升了在数学、常识和符号推理等任务上的表现。本文将深入浅出地解释 CoT 的原理,并用 Python 代码演示零样本与少样本 CoT 的实现,最后通过图表直观对比不同提示策略的效果。
1. 什么是思维链?
Chain-of-Thought (CoT) 是一种提示工程技术,它要求模型在输出最终答案之前,显式地生成一系列中间推理步骤——就像人类在解一道数学题时,会先写出推导过程再得出结果。
比如,问模型:
一个农场有 15 只鸡和 8 只兔子,一共有多少条腿?
- 标准提示 (Standard Prompting):模型可能直接猜一个数字,容易出错。
- 思维链提示 (CoT Prompting):模型会先计算鸡腿数
15×2=30,再计算兔腿数8×4=32,然后求和30+32=62,最后给出答案 62。
这个“思考过程”就是思维链。它不仅提高了答案的准确率,还让模型的决策过程变得可解释、可调试。
2. 为什么思维链有效?
CoT 之所以强大,背后有几个关键原因:
-
将复杂问题分解为简单子问题
多步推理任务本质上是一系列简单计算的组合。显式写出步骤可以避免模型“跳步”导致的幻觉或逻辑断裂。
-
更充分地利用模型的预训练知识
大规模语言模型在预训练时已经见过海量的推理过程,CoT 只是激活了这种能力,让模型模仿人类解题的格式。
-
自验证与纠错
当模型一步步输出时,某些错误会在中间步骤暴露出来,模型有机会在后续步骤中自行纠正(尤其在结合 Self-Consistency 时)。
-
适用于大模型,是“涌现能力”的体现
研究显示,CoT 仅在模型参数规模达到 ~100B 级别时才表现出显著增益,这进一步印证了它是大规模模型的一种涌现能力。
3. 代码实战:零样本 CoT
我们使用 openai 库来演示。零样本 CoT 不需要提供范例,只需在问题末尾加上一句魔法提示:“Let’s think step by step.”
import openai
# 设置你的 API key
openai.api_key = "YOUR_API_KEY"
def zero_shot_cot(question):
# 在问题后追加思维链触发器
prompt = f"{question}\n\nLet's think step by step."
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo", # 或用 "gpt-4"
messages=[{"role": "user", "content": prompt}],
temperature=0.0 # 保证结果稳定
)
return response.choices[0].message.content
# 测试问题
question = "小明有 12 个苹果,他给了小红一半,然后又买了 3 个,最后吃了 1 个。他现在有几个苹果?"
answer = zero_shot_cot(question)
print(answer)
输出示例:
Step 1: 小明一开始有 12 个苹果。
Step 2: 他给了小红一半,也就是 12 / 2 = 6 个苹果,所以剩下 12 - 6 = 6 个。
Step 3: 然后他买了 3 个,总数变成 6 + 3 = 9 个。
Step 4: 最后他吃了 1 个,剩下 9 - 1 = 8 个。
因此,小明现在有 8 个苹果。
可以看到,即使我们没有给任何示例,模型也能自动生成结构化的推理步骤,并得到正确答案。
4. 代码实战:少样本 CoT
对于更复杂的任务(如多位数算术、符号推理),提供少量精心设计的推理范例效果会更稳定。这就是 Few-shot CoT。
下面我们手动构建一个 prompt,其中包含两个示例,每个示例都展示了完整的推理链。
def few_shot_cot(question):
# 示例1:逻辑推理
example1 = """
Q: 一个篮球队进行单循环赛,每两队之间赛一场。如果总共进行了 28 场比赛,请问有多少支球队参赛?
A: 设球队数为 n,则比赛场数为 n(n-1)/2。根据题意 n(n-1)/2 = 28,所以 n(n-1) = 56。
试数:7×8=56,所以 n=8。答案是 8 支球队。
"""
# 示例2:数学计算
example2 = """
Q: 一个数的 3 倍加上 10 等于 40,这个数是多少?
A: 设这个数为 x,则 3x + 10 = 40。两边减 10 得 3x = 30。两边除以 3 得 x = 10。所以这个数是 10。
"""
# 拼接最终 prompt
prompt = f"{example1}\n{example2}\nQ: {question}\nA:"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}],
temperature=0.0
)
return response.choices[0].message.content
question = "一个游泳池有进水管和排水管。单开进水管 4 小时注满,单开排水管 6 小时排空。如果两个管子同时打开,多久能注满?"
print(few_shot_cot(question))
输出示例:
设游泳池的总水量为 1,则进水管每小时注水 1/4,排水管每小时排水 1/6。
同时打开时,每小时净注水量为 1/4 - 1/6 = 1/12。
所以注满需要的时间为 1 ÷ (1/12) = 12 小时。
答案是 12 小时。
5. 图表:CoT 的效果究竟有多强?
论文 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models” 中的实验表明,CoT 在多个数学推理基准上大幅超越标准提示。以下是各数据集上 标准提示 与 思维链提示 的准确率对比。
📊 数据表
| 数据集 | 标准提示 (Standard) | 思维链提示 (CoT) | 提升幅度 |
|---|---|---|---|
| GSM8K | 40.5% | 68.7% | +28.2% |
| SVAMP | 47.3% | 80.5% | +33.2% |
| ASDiv | 58.0% | 75.4% | +17.4% |
| AQuA | 35.2% | 52.6% | +17.4% |
📈 柱状图
💡 图表说明:蓝色柱为
Standard Prompting,橙色柱为Chain-of-Thought。在所有数学推理数据集上,CoT 均取得了 17~33 个百分点的巨大提升。
6. 进阶技巧与注意事项
- Self-Consistency:对同一个问题用 CoT 生成多条推理路径,然后投票选出最一致的答案,可以进一步榨取性能。
- Auto-CoT:让模型自动生成推理链示例,省去人工编写范例的麻烦。
- 局限性:CoT 仍然依赖于模型的底层推理能力,对于知识边界之外或需要外部工具的问题,可能需要结合检索增强生成 (RAG) 或工具调用。
- 成本:生成长推理链会消耗更多 token,在实际应用中需要权衡成本与收益。
7. 总结
Chain-of-Thought Prompting 是一种简单却极为有效的技术,它通过模仿人类“出声思考”的方式,解锁了大语言模型深藏的推理潜力。无论你是 AI 工程师还是产品经理,理解并善用 CoT 都能让 LLM 在逻辑密集型的任务中表现得更可靠、更透明。
动手试一试吧:把今天学到的 Let's think step by step. 魔法加入你的下一个 prompt,你很可能立刻就能看到惊喜!
参考资料:
- Wei et al., “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models”, NeurIPS 2022.
- Kojima et al., “Large Language Models are Zero-Shot Reasoners”, NeurIPS 2022.
- Wang et al., “Self-Consistency Improves Chain of Thought Reasoning in Language Models”, ICLR 2023.
更多推荐
所有评论(0)