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