2.3 思维链提示
📌 本节目标
学完本节,你将掌握思维链提示(Chain-of-Thought Prompting)的核心原理与使用方法。你将能够通过设计包含中间推理步骤的提示,引导大语言模型解决需要多步逻辑的复杂问题,尤其是数学推理任务。
1. 核心概念讲解
什么是思维链提示?
思维链提示是一种高级提示工程技术,它通过在提示中提供一系列中间推理步骤的示例,来引导模型在回答问题时也展示出类似的逐步推理过程。简单来说,就是"教模型像人一样一步一步思考"。
为什么需要它?
直接问大语言模型一个复杂数学题,模型往往直接给出答案——而且常常是错的。但是,如果你在提示中展示"先这样想,再那样算,最后得到答案"的完整过程,模型就会模仿这种推理模式,显著提高正确率。
核心要素
- 中间步骤:在提示中明确写出从问题到答案的推理链条
- 格式一致性:每个步骤都用相同的格式呈现(比如"步骤1:... 步骤2:...")
- 最终答案标记:在推理链末尾用特殊标记(如"因此答案是:")引出最终结果
比如:
假设你想让模型计算:"小明有5个苹果,小红给了他3个,然后他吃掉了2个,还剩几个?"
❌ 不好的提示(直接问):
问:小明有5个苹果,小红给了他3个,然后他吃掉了2个,还剩几个?
答:
模型可能直接回答"6个"(运气好)或"5个"(错误)。
✅ 好的思维链提示:
问:小明有5个苹果,小红给了他3个,然后他吃掉了2个,还剩几个?
答:让我们一步一步思考。
步骤1:小明最初有5个苹果。
步骤2:小红给了他3个,所以现在有 5 + 3 = 8 个。
步骤3:他吃掉了2个,所以现在有 8 - 2 = 6 个。
因此答案是:6个。
然后你再问模型新的问题,它就会模仿这种"步骤1、步骤2、步骤3"的推理格式。
代码示例(使用 OpenAI API 演示两种方式的对比):
# 导入所需库
import openai
# 设置 API 密钥(请替换为你的密钥)
openai.api_key = "your-api-key"
# 1. 直接提问(无思维链)
direct_prompt = """
问:一个农场有12只鸡和8只兔子,总共有多少条腿?
答:"""
response_direct = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": direct_prompt}]
)
print("直接回答:", response_direct.choices[0].message.content)
# 2. 思维链提示(包含推理示例)
cot_prompt = """
问:一个农场有3只鸡和2只兔子,总共有多少条腿?
答:让我们一步一步思考。
步骤1:每只鸡有2条腿,3只鸡有 3 × 2 = 6 条腿。
步骤2:每只兔子有4条腿,2只兔子有 2 × 4 = 8 条腿。
步骤3:总腿数 = 6 + 8 = 14 条腿。
因此答案是:14。
问:一个农场有12只鸡和8只兔子,总共有多少条腿?
答:"""
response_cot = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": cot_prompt}]
)
print("思维链回答:", response_cot.choices[0].message.content)
2. 深入理解
为什么思维链提示有效?
大语言模型的本质是"下一个词预测器"。当你直接问"12只鸡和8只兔子有多少条腿"时,模型需要在没有中间计算过程的情况下"猜"出答案——这相当于让一个人心算而不打草稿。
思维链提示做了三件关键的事:
- 分解复杂度:把一个大问题拆成多个小步骤,每一步都更容易计算
- 提供推理模板:模型学会了"我应该先算什么,再算什么"的结构
- 自我纠错:中间步骤暴露了推理过程,如果某一步错了,模型可能在后续步骤中修正
初学者常见误区
| 误区 | 错误做法 | 正确做法 | |------|----------|----------| | 步骤太少 | 只给1-2个步骤就跳到答案 | 每个逻辑转换都写成一个步骤 | | 跳过计算细节 | "然后计算总数"(不写出具体算式) | "3×2=6,4×2=8,6+8=14"(写出算式) | | 格式不一致 | 第一个例子用"步骤1",第二个用"首先" | 保持完全相同的格式模板 | | 忘记最终标记 | 推理完直接结束,没有明确答案 | 用"因此答案是:"明确引出结果 | | 问题太简单 | 用1+1=2做示例,模型学不到推理模式 | 使用需要3步以上推理的示例 |
一个重要的发现:思维链提示的效果与模型规模有关。研究表明,对于参数量小于100亿的模型,思维链提示的效果提升有限;而对于更大的模型(如GPT-3.5、GPT-4、Claude系列),效果非常显著。所以当你使用小模型时,可能需要更明确、更详细的推理步骤。
3. 实战演示
案例:设计一个"找零钱"问题的思维链提示
场景:你想让模型计算"买一个35元的商品,付了100元,应该找多少零钱?"
步骤1:准备示例
先手工编写一个完整的思维链示例:
问:买一个27元的商品,付了50元,应该找多少零钱?
答:让我们一步一步思考。
步骤1:顾客付了50元。
步骤2:商品价格是27元。
步骤3:需要找零 = 50 - 27 = 23元。
因此答案是:23元。
步骤2:构建完整的提示模板
# 完整的思维链提示模板
cot_template = """
问:买一个27元的商品,付了50元,应该找多少零钱?
答:让我们一步一步思考。
步骤1:顾客付了50元。
步骤2:商品价格是27元。
步骤3:需要找零 = 50 - 27 = 23元。
因此答案是:23元。
问:买一个35元的商品,付了100元,应该找多少零钱?
答:让我们一步一步思考。
"""
# 发送给模型
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": cot_template}]
)
# 输出结果
print(response.choices[0].message.content)
步骤3:期望的输出
模型应该输出类似这样的内容:
步骤1:顾客付了100元。
步骤2:商品价格是35元。
步骤3:需要找零 = 100 - 35 = 65元。
因此答案是:65元。
步骤4:扩展到更复杂的问题
一旦模型学会了这个模式,你可以问更复杂的问题,比如涉及多个商品的情况:
问:买一个18元的笔记本和一个23元的笔袋,付了50元,应该找多少零钱?
答:让我们一步一步思考。
步骤1:顾客付了50元。
步骤2:笔记本价格是18元,笔袋价格是23元。
步骤3:商品总价 = 18 + 23 = 41元。
步骤4:需要找零 = 50 - 41 = 9元。
因此答案是:9元。
模型会自动适应新的问题结构,因为它在示例中学到了"分解问题、逐步计算"的思维方式。
4. 关键要点
- 思维链的核心是"展示推理过程":不是告诉模型"要思考",而是用示例展示"如何思考",包括每一步的具体计算
- 示例质量决定效果:一个精心设计的示例胜过十个粗糙的示例。确保你的示例包含完整的步骤、清晰的算式和明确的答案标记
- 格式一致性至关重要:所有示例使用完全相同的格式模板(步骤编号、算式写法、答案标记),减少模型的理解负担
- 适用于需要多步推理的任务:数学题、逻辑推理、代码调试、复杂问答等任务效果最佳;简单的直接问答不需要思维链
- 模型规模影响效果:大模型(100亿参数以上)从思维链中获益更多,小模型可能需要更详细的步骤或更多示例
✏️ 练习任务
基础练习:设计一个数学问题的思维链提示
任务描述:设计一个完整的思维链提示,让模型正确计算以下问题:
"一个水果店上午卖了25千克苹果,下午卖了18千克苹果,每千克苹果8元。这一天卖苹果一共收入多少元?"
要求:
- 先编写一个示例(使用类似但不同数值的问题,如"上午卖20千克,下午卖15千克,每千克6元")
- 示例必须包含至少3个推理步骤
- 使用"让我们一步一步思考"作为推理的开头
- 用"因此答案是:"标记最终答案
- 将示例和问题组合成一个完整的提示文本
期望输出格式(填空):
问:[你的示例问题]
答:让我们一步一步思考。
步骤1:[第一步推理]
步骤2:[第二步推理]
步骤3:[第三步推理]
因此答案是:[示例答案]
问:[目标问题]
答:让我们一步一步思考。
进阶挑战(选做):设计一个包含"单位转换"的思维链问题
设计一个需要先进行单位转换再计算的数学问题(例如:"小明跑了3千米,小红跑了2500米,他们一共跑了多少米?"),并编写相应的思维链提示。注意:你的示例中也需要包含单位转换的步骤。
💡 下一节我们将学习"少样本提示"(Few-Shot Prompting),它和思维链提示经常结合使用,能进一步提升模型的推理能力。敬请期待!
本节由 StudyAI8 AI 课程团队生成并审核。