Chain of Thought #
什么是 Chain of Thought? #
基本概念 #
Chain of Thought(CoT,思维链)是一种提示技术,通过引导模型展示推理过程,逐步解决复杂问题。它让模型"思考"而不是直接给出答案。
text
┌─────────────────────────────────────────────────────────────┐
│ 直接回答 vs 思维链对比 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 直接回答: │
│ 问题:小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?│
│ 回答:6 个 │
│ (可能错误,无法验证) │
│ │
│ 思维链: │
│ 问题:小明有 5 个苹果,给了小红 2 个,又买了 3 个,现在有几个?│
│ 思考过程: │
│ 1. 小明最初有 5 个苹果 │
│ 2. 给了小红 2 个,剩下 5 - 2 = 3 个 │
│ 3. 又买了 3 个,现在有 3 + 3 = 6 个 │
│ 回答:小明现在有 6 个苹果 │
│ (步骤清晰,易于验证) │
│ │
└─────────────────────────────────────────────────────────────┘
Chain of Thought 的优势 #
text
1. 提高准确性
└── 分步推理减少错误
2. 增强可解释性
└── 推理过程透明可见
3. 便于调试
└── 可以定位推理错误
4. 支持复杂任务
└── 适合需要多步推理的问题
5. 提升可信度
└── 用户可以验证推理逻辑
Chain of Thought 基本用法 #
基本触发方式 #
text
方式一:直接要求
─────────────────────────────────────────────────
"请一步步思考并回答以下问题:"
"请展示你的推理过程:"
"让我们一步步来分析:"
─────────────────────────────────────────────────
方式二:示例引导
─────────────────────────────────────────────────
示例:
问题:...
思考过程:
1. ...
2. ...
答案:...
现在请解决:
问题:...
─────────────────────────────────────────────────
方式三:零样本 CoT
─────────────────────────────────────────────────
"请一步步思考"(Let's think step by step)
─────────────────────────────────────────────────
零样本 CoT #
最简单的 Chain of Thought 方式,只需添加一句话:
text
提示词:
一个班级有 30 名学生,其中 60% 是女生,女生中有 50% 戴眼镜。
请问戴眼镜的女生有多少人?
让我们一步步思考。
输出:
1. 首先计算女生人数:30 × 60% = 18 人
2. 然后计算戴眼镜的女生:18 × 50% = 9 人
答案:戴眼镜的女生有 9 人
Few-shot CoT #
通过示例展示推理过程:
text
提示词:
请解决以下数学问题:
示例 1:
问题:小明有 10 元钱,买了 3 支铅笔,每支 2 元,还剩多少钱?
思考过程:
1. 计算花费:3 支 × 2 元 = 6 元
2. 计算剩余:10 元 - 6 元 = 4 元
答案:还剩 4 元
示例 2:
问题:一本书有 200 页,第一天读了 30 页,第二天读了 40 页,还剩多少页?
思考过程:
1. 计算已读页数:30 + 40 = 70 页
2. 计算剩余页数:200 - 70 = 130 页
答案:还剩 130 页
请解决:
问题:商店有 100 个苹果,上午卖出 35 个,下午卖出 28 个,还剩多少个?
Chain of Thought 高级技巧 #
技巧一:分解复杂问题 #
text
提示词:
请分析以下代码的时间复杂度:
代码:
def find_pairs(arr, target):
pairs = []
for i in range(len(arr)):
for j in range(i+1, len(arr)):
if arr[i] + arr[j] == target:
pairs.append((arr[i], arr[j]))
return pairs
请一步步分析:
输出:
分析过程:
1. 识别代码结构
- 外层循环:遍历数组,执行 n 次
- 内层循环:遍历剩余元素,平均执行 n/2 次
- 循环内操作:常数时间 O(1)
2. 计算总操作次数
- 外层循环 n 次
- 每次外层循环,内层循环平均 n/2 次
- 总次数 ≈ n × (n/2) = n²/2
3. 确定时间复杂度
- 忽略常数因子:O(n²)
答案:时间复杂度为 O(n²)
技巧二:多路径推理 #
text
提示词:
请分析以下问题的多种解决方案:
问题:如何提高网站的加载速度?
请从多个角度分析:
输出:
分析过程:
角度 1:前端优化
1. 压缩静态资源(CSS、JS、图片)
2. 使用 CDN 加速
3. 实现懒加载
4. 减少 HTTP 请求
角度 2:后端优化
1. 优化数据库查询
2. 使用缓存(Redis、Memcached)
3. 实现负载均衡
4. 代码性能优化
角度 3:网络优化
1. 启用 Gzip 压缩
2. 使用 HTTP/2
3. 配置浏览器缓存
4. DNS 预解析
综合建议:
优先实施成本低、效果明显的优化,如启用缓存、压缩资源。
技巧三:验证推理 #
text
提示词:
请计算并验证结果:
问题:一个长方形的长是 12 厘米,宽是 8 厘米,求面积和周长。
请一步步计算,并验证结果:
输出:
计算过程:
步骤 1:计算面积
- 面积 = 长 × 宽
- 面积 = 12 × 8 = 96 平方厘米
步骤 2:计算周长
- 周长 = 2 × (长 + 宽)
- 周长 = 2 × (12 + 8) = 2 × 20 = 40 厘米
验证:
- 面积验证:12 × 8 = 96 ✓
- 周长验证:2 × 12 + 2 × 8 = 24 + 16 = 40 ✓
答案:
- 面积:96 平方厘米
- 周长:40 厘米
技巧四:反向推理 #
text
提示词:
请通过反向推理解决问题:
问题:某数加上 5,再乘以 3,结果是 30,求这个数。
请从结果反向推导:
输出:
反向推理过程:
1. 最终结果是 30
2. 这一步是"乘以 3"得到的
- 所以之前的结果是:30 ÷ 3 = 10
3. 这一步是"加上 5"得到的
- 所以原来的数是:10 - 5 = 5
正向验证:
- 5 + 5 = 10
- 10 × 3 = 30 ✓
答案:这个数是 5
Chain of Thought 应用场景 #
场景一:数学问题 #
text
提示词:
请解决以下数学问题,展示完整的推理过程:
问题:一个水池有两个进水管和一个出水管。甲管单独注满需要 6 小时,
乙管单独注满需要 8 小时,出水管单独放完需要 12 小时。
如果三管同时开放,多少小时可以注满水池?
输出:
推理过程:
1. 确定各管的工作效率
- 甲管:1/6 池/小时(进水)
- 乙管:1/8 池/小时(进水)
- 出水管:1/12 池/小时(出水)
2. 计算三管同时开放的净效率
- 净效率 = 甲 + 乙 - 出水
- 净效率 = 1/6 + 1/8 - 1/12
- 通分(分母为 24):4/24 + 3/24 - 2/24 = 5/24
3. 计算注满时间
- 时间 = 1 ÷ (5/24) = 24/5 = 4.8 小时
答案:4.8 小时(或 4 小时 48 分钟)可以注满水池
场景二:逻辑推理 #
text
提示词:
请通过逻辑推理解决以下问题:
问题:有五栋不同颜色的房子,每栋房子住着不同国籍的人,
每个人喝不同的饮料,抽不同的烟,养不同的宠物。
已知:
1. 英国人住在红房子里
2. 瑞典人养狗
3. 丹麦人喝茶
4. 绿房子在白房子左边
5. 绿房子主人喝咖啡
...
请推理谁养鱼?
输出:
推理过程:
步骤 1:整理已知条件
- 英国人 → 红房子
- 瑞典人 → 狗
- 丹麦人 → 茶
...
步骤 2:建立关系表
| 房子颜色 | 国籍 | 饮料 | 烟 | 宠物 |
|----------|------|------|-----|------|
| ... | ... | ... | ... | ... |
步骤 3:逐步推理
...
答案:德国人养鱼
场景三:代码调试 #
text
提示词:
请分析以下代码的 Bug,展示调试过程:
代码:
def calculate_average(numbers):
total = 0
for num in numbers:
total += num
return total / len(numbers)
问题:当传入空列表时程序崩溃
输出:
调试过程:
步骤 1:分析问题
- 错误现象:传入空列表时程序崩溃
- 预期行为:应该返回 0 或抛出有意义的异常
步骤 2:定位错误
- len([]) = 0
- total / 0 会触发 ZeroDivisionError
步骤 3:确定修复方案
- 方案 A:检查空列表,返回 0
- 方案 B:检查空列表,抛出异常
步骤 4:实现修复
def calculate_average(numbers):
if not numbers:
return 0 # 或 raise ValueError("列表不能为空")
total = 0
for num in numbers:
total += num
return total / len(numbers)
步骤 5:验证修复
- calculate_average([]) → 0 ✓
- calculate_average([1, 2, 3]) → 2.0 ✓
场景四:决策分析 #
text
提示词:
请分析以下技术选型问题,给出推荐方案:
背景:需要为一个小型电商网站选择后端框架
候选:Django、Flask、FastAPI
请从多个维度分析:
输出:
分析过程:
维度 1:开发效率
- Django:★★★★★(内置功能丰富)
- Flask:★★★☆☆(需要自己组装)
- FastAPI:★★★★☆(自动生成文档)
维度 2:性能
- Django:★★★☆☆
- Flask:★★★★☆
- FastAPI:★★★★★(异步支持)
维度 3:学习曲线
- Django:★★★☆☆(概念较多)
- Flask:★★★★★(简单直观)
- FastAPI:★★★★☆(需要了解类型注解)
维度 4:生态支持
- Django:★★★★★(成熟稳定)
- Flask:★★★★☆(插件丰富)
- FastAPI:★★★☆☆(相对较新)
综合分析:
- 小型电商网站需要快速开发
- 需要处理订单、用户、商品等复杂业务
- Django 的内置功能最适合
推荐方案:Django
理由:内置 Admin、ORM、认证系统,适合快速构建电商系统
Chain of Thought 最佳实践 #
实践一:明确步骤标记 #
text
使用清晰的步骤标记:
✅ 好的标记:
步骤 1:...
步骤 2:...
步骤 3:...
或
1. 首先,...
2. 然后,...
3. 最后,...
❌ 不好的标记:
先算一下...然后...再...最后...
(缺乏结构,难以跟踪)
实践二:中间结果验证 #
text
在推理过程中验证中间结果:
提示词:
请计算 (15 + 27) × 3 - 8,并在每步验证结果。
输出:
步骤 1:计算括号内
- 15 + 27 = 42
- 验证:15 + 27 = 42 ✓
步骤 2:计算乘法
- 42 × 3 = 126
- 验证:42 × 3 = 126 ✓
步骤 3:计算减法
- 126 - 8 = 118
- 验证:126 - 8 = 118 ✓
答案:118
实践三:错误处理 #
text
在推理中考虑可能的错误:
提示词:
请分析以下代码可能的问题:
代码:
def divide(a, b):
return a / b
输出:
分析过程:
步骤 1:识别潜在问题
- b 为 0 时会触发 ZeroDivisionError
- a 和 b 可能不是数字类型
步骤 2:分析影响
- ZeroDivisionError 会导致程序崩溃
- 类型错误会产生意外结果
步骤 3:提出解决方案
def divide(a, b):
if b == 0:
raise ValueError("除数不能为 0")
if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
raise TypeError("参数必须是数字")
return a / b
Chain of Thought 变体 #
Self-Consistency CoT #
text
生成多个推理路径,选择最一致的答案:
提示词:
请用三种不同的方法解决以下问题,然后选择最可靠的答案:
问题:一个数的 30% 是 45,这个数是多少?
输出:
方法 1:
- 30% = 0.3
- 这个数 = 45 ÷ 0.3 = 150
方法 2:
- 设这个数为 x
- 0.3x = 45
- x = 45 ÷ 0.3 = 150
方法 3:
- 30% 对应 45
- 100% 对应 45 ÷ 30% = 150
三种方法结果一致,答案可靠。
答案:150
Tree of Thoughts #
text
探索多个推理分支:
提示词:
请用决策树的方式分析以下问题:
问题:是否应该跳槽到新公司?
输出:
决策树分析:
根节点:考虑跳槽
├── 分支 1:薪资更高
│ ├── 子分支:发展空间大 → 建议跳槽
│ └── 子分支:发展空间小 → 谨慎考虑
├── 分支 2:薪资相同
│ ├── 子分支:工作环境更好 → 建议跳槽
│ └── 子分支:工作环境相似 → 不建议跳槽
└── 分支 3:薪资更低
├── 子分支:学习机会多 → 可以考虑
└── 子分支:学习机会少 → 不建议跳槽
建议:根据具体情况选择对应分支进行决策
下一步 #
现在你已经掌握了 Chain of Thought,接下来学习 角色扮演与人格设定,了解如何创建专业的 AI 助手!
最后更新:2026-04-05