使用"让我们一步步思考"技术,让 AI 解决下面的问题:
Level 1:应用 zero-shot CoT问题:一个团队有 8 个人,每人每天工作 6 小时。项目需要 240 人时的工作量。如果团队扩大到 12 人,项目能提前几天完成?
请写出完整的 prompt(包含"让我们一步步思考"),然后预测 AI 会展示哪些中间步骤。
本课目标:
- 理解 chain-of-thought 的原理和作用
- 学会用"让我们一步步思考"引导 AI 推理
- 识别适合使用 CoT 的任务类型
前置知识:<< 03 Few-shot Learning | 下一课 05 >>
你问 AI 一道数学应用题,它给了答案"42"。你检查后发现答案是对的——但如果换一道类似的题,答案就错了。问题在哪?AI 可能是猜对的,或者用了错误的推理路径碰巧得到正确答案。
对于需要多步推理的任务(数学题、逻辑推理、复杂分析),让 AI 展示推理步骤比直接要答案更可靠12。这就是 chain-of-thought(思维链)prompting 的核心思想——把结论拆成可检查的中间步骤。
Chain-of-thought (CoT) prompting 是一种让 AI 在给出最终答案前,先展示中间推理步骤的技术1。就像我们解数学题时在草稿纸上列式子、写中间结果,AI 也把思考过程"写出来"。
对比两种方式:
❌ 不使用 CoT:
AI 可能直接输出:
如果答案错了,你不知道是哪一步算错了。
✅ 使用 CoT:
AI 输出:
每一步都清晰可见,如果某步错了,你能立刻发现并纠正 prompt。
研究表明,在涉及多步推理的任务上,CoT 能显著提升推理准确率——在某些复杂推理任务上提升幅度可达 2-3 倍12。
在 prompt 最后加一句"让我们一步步思考"(Let's think step by step)12。
这一句话就能触发 AI 的逐步推理模式。不需要给示例,AI 会自动拆解问题。
示例展示了推理的格式和步骤详细程度,AI 会模仿这种风格。
CoT 最适合需要多步推理的任务2:
✅ 数学和逻辑推理
✅ 因果分析
✅ 计划和决策
✅ 代码调试
不适合的场景:
❌ 简单的事实查询:"Python 是什么时候发布的?"——不需要推理 ❌ 创意写作:写诗、写故事——推理步骤会破坏创作流 ❌ 格式转换:JSON → CSV——机械操作,不需要推理
判断标准:如果你自己做这个任务时会在草稿纸上列步骤,那就适合用 CoT。
不使用 CoT(结论不可信):
只有结论,不知道为什么。
使用 CoT(推理清晰):
AI 会展示:
每一步推理都可验证,如果有错你能立刻看出来。
问题:
AI 输出:
这种逐步排除的推理过程,展示出来后更容易检查逻辑是否严密。
把一个复杂问题拆成几个子问题。
列出假设,逐个验证。
列出支持和反对的理由,再得出结论。
CoT 不是万能的,有几个局限:
1. 增加响应长度和时间
展示推理步骤会让输出变长,消耗更多 token,响应时间也更长。
何时值得:复杂任务上,多花 2-3 倍 token 换取准确率提升是值得的。 何时不值得:简单任务("今天星期几"),推理步骤是纯粹的浪费。
2. 推理步骤本身可能出错
AI 展示的推理步骤看起来合理,但逻辑可能有漏洞。你仍然需要检查推理是否正确。
CoT 的价值在于让错误可见——直接给答案时,错误藏在黑盒里;展示步骤后,错误暴露在某一步,更容易发现和纠正。
3. 不适合需要直觉的任务
有些任务(比如创意写作、艺术评价)依赖整体感觉,强行拆步骤反而破坏了完整性。
Chain-of-thought prompting 让 AI 展示推理步骤,而不是直接给答案。通过在 prompt 中加入"让我们一步步思考",或者提供包含推理过程的示例,可以显著提升多步推理任务的准确率。
CoT 适合数学推理、逻辑分析、因果推断、复杂决策等需要多步思考的任务。它让推理过程可见、可检查,虽然会增加输出长度,但在复杂任务上收益远大于成本。
下一课学习如何调试和改进 prompt——当 AI 的输出不符合预期时,如何系统化地找出问题并优化。
下一课 调试和改进 Prompt >>
问题:一个团队有 8 个人,每人每天工作 6 小时。项目需要 240 人时的工作量。如果团队扩大到 12 人,项目能提前几天完成?
请写出完整的 prompt(包含"让我们一步步思考"),然后预测 AI 会展示哪些中间步骤。
设计一个 few-shot CoT prompt,包含 2 个示例(一个 O(n)、一个 O(n²)),展示完整的推理步骤。
记下想法、痛点、没懂的地方。只写进这门课的附录,正课文件不动。
问题:一个咖啡店早上卖出了 23 杯咖啡,中午卖出了 17 杯,下午卖出了两倍于早上的数量。全天总共卖出多少杯?
答案:86 杯问题:一个咖啡店早上卖出了 23 杯咖啡,中午卖出了 17 杯,下午卖出了两倍于早上的数量。全天总共卖出多少杯?
让我们一步步思考:让我们一步步思考:
1. 早上卖出:23 杯2. 中午卖出:17 杯3. 下午是早上的两倍:23 × 2 = 46 杯4. 全天总计:23 + 17 + 46 = 86 杯
答案:86 杯问题:如果 5 个工人需要 5 天完成一个项目,那么 10 个工人需要多少天?
让我们一步步思考:示例:问题:一辆车以 60 公里/小时的速度行驶,3 小时能走多远?推理:- 速度 = 60 公里/小时- 时间 = 3 小时- 距离 = 速度 × 时间 = 60 × 3 = 180 公里答案:180 公里
现在解决这个问题:问题:一辆车以 80 公里/小时的速度行驶了 2.5 小时,然后以 60 公里/小时又行驶了 1 小时。总共走了多远?推理:这段代码的性能有问题吗?
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```
答案:有性能问题分析这段代码的性能问题。一步步说明:1. 识别循环结构2. 计算时间复杂度3. 指出具体的瓶颈4. 给出优化建议
```pythondef find_duplicates(items): duplicates = [] for i in range(len(items)): for j in range(i + 1, len(items)): if items[i] == items[j] and items[i] not in duplicates: duplicates.append(items[i]) return duplicates```性能分析:
1. 循环结构: - 外层循环:遍历每个元素,O(n) - 内层循环:对每个元素再遍历后续元素,O(n) - 总体:嵌套循环,O(n²)
2. 时间复杂度: - 主循环:O(n²) - `items[i] not in duplicates` 检查:最坏 O(m),m 是已找到的重复项数量 - 总复杂度:O(n² × m)
3. 性能瓶颈: - 嵌套循环在数据量大时(n > 1000)会非常慢 - `not in` 对列表的线性查找进一步拖慢速度
4. 优化建议: - 使用集合(set)代替列表存储 duplicates,检查从 O(m) 降到 O(1) - 或者用计数器(Counter)一次遍历找出所有出现次数 > 1 的元素,降到 O(n)三个人 A、B、C 参加比赛。已知:- A 不是第一名- B 不是最后一名- C 不是第一名也不是最后一名
他们的排名是什么?
让我们一步步推理:让我们一步步推理:
1. 从 C 的条件入手: - C 不是第一名,也不是最后一名 - 所以 C 必定是第二名
2. 确定 A 和 B: - A 不是第一名 - B 不是最后一名 - C 已经是第二名,剩下第一名和第三名给 A 和 B 3. 分配剩余名次: - A 不是第一名,所以 A 是第三名 - B 不是最后一名(第三名),所以 B 是第一名
答案:B 第一名,C 第二名,A 第三名问题:一个软件项目有 5 个工程师,每人每天工作 6 小时,项目需要 120 人天的工作量。如果增加到 8 个工程师,项目能提前多少天完成?
让我们一步步计算:1. 当前配置下需要多少天?2. 增加人手后需要多少天?3. 能提前多少天?这段代码报错"TypeError: unsupported operand type(s)",可能的原因是什么?
让我们逐个检查可能的原因:1. 检查运算符两侧的变量类型2. 检查是否有 None 值参与运算3. 检查是否有字符串和数字混用应该用微服务架构还是单体架构?
让我们从两个角度分析:
支持微服务的理由:1. ...2. ...
支持单体的理由:1. ...2. ...
综合判断:基于当前团队规模和项目复杂度,建议...