# CoT 与 Few-shot CoT — 课堂讲解指南

> 配套代码：`06_代码/Day_02/fewshot_cot_demo/`  
> 结构说明 / 题目位置：[`项目说明.md`](项目说明.md)  
> 数学陷阱题对比：`06_代码/Day_02/cot_demo/`

---

## 课前必看：题目和代码在哪？

讲课前打开下面三个文件即可，不用在整个项目里翻：

| 要讲的内容 | 文件 | 变量名 |
|---|---|---|
| **今天的主考题** | `question.py` | `MAIN_QUESTION` |
| **Few-shot 示范题** | `examples.py` | `FEW_SHOT_EXAMPLES` |
| **三种模式怎么问模型** | `prompts.py` | `SYSTEM_DIRECT` / `SYSTEM_ZERO_SHOT_COT` / `SYSTEM_FEW_SHOT_COT` |

**主题目（可直接念给学生）：**

> 当小明 6 岁时，他的妹妹年龄是他的一半。他的哥哥比小明大 4 岁。现在小明 70 岁了，请问他的妹妹和哥哥年龄加起来是多少？

**正确答案：141 岁**

**两个 Few-shot 示例题（只在模式 C 出现）：**

1. 苹果题：3 个又买 2 个 → 教「先列条件再计算」的写法（`examples.py` 第 1 条）
2. 小红弟弟题：8 岁时弟弟是一半 → 教「年龄差不变」（`examples.py` 第 2 条，预热主题目易错点）

**运行演示：**

```bash
cd 06_代码\Day_02\fewshot_cot_demo
python main.py
```

---

## 老师 15 分钟讲课路线（可按表执行）

| 时间 | 步骤 | 动作 | 指着哪里 |
|---|---|---|---|
| 0～3 min | 导入 | 让学生心算主题目，收集 141 / 109 / 136 等答案 | `question.py` 或下方第六节板书 |
| 3～5 min | 说明 | 讲清主题目、示例题、提示词分别在三个文件 | 上表 |
| 5～8 min | 演示 A | 运行后先看模式 A（无 CoT），通常答错 | 终端 + `prompts.py` 的 `SYSTEM_DIRECT` |
| 8～11 min | 演示 B | 看模式 B（零样本 CoT），通常答对 | `USER_ZERO_SHOT_COT_TEMPLATE` |
| 11～14 min | 演示 C | 看模式 C（少样本 CoT），格式贴近示例 | `examples.py` + `demo.py` |
| 14～15 min | 实验 | `python main.py --shots 1` 对比示例数量的影响 | 终端 |

---

## 一、给同学的一句话：什么是 CoT？

**CoT（Chain of Thought，思维链）= 先写推理步骤，再给最终答案。**

可以类比：

- 做应用题不能只在草稿纸上写个结果，老师要看列式过程。
- 大模型生成文本时，是「根据上文预测下一个字」。复杂题如果直接要答案，它容易跳过中间步骤，像心算跳步一样出错。
- 让模型把「第一步、第二步…」写出来，相当于给它一张**草稿纸**，把大问题拆成小步骤。

---

## 二、三种写法对比（板书可用）

| 写法 | 有没有示例 | 有没有要求分步 | 一句话 |
|---|---|---|---|
| 无 CoT | 无 | 无 | 「直接告诉我答案」 |
| 零样本 CoT | 无 | 有 | 「请一步一步思考」 |
| 少样本 CoT（Few-shot CoT） | **有推理示例** | 有 | 「照着示例的写法推理」 |

```mermaid
flowchart LR
    Q[复杂问题] --> A[无 CoT：直接猜答案]
    Q --> B[零样本 CoT：自己展开推理]
    Q --> C[Few-shot CoT：模仿示例的推理格式]
    A --> R1[易跳步 / 易想当然]
    B --> R2[常有推理，但格式不稳定]
    C --> R3[推理格式更稳定，关键技巧可被示例带出来]
```

---

## 三、Few-shot 和 Few-shot CoT 别混了

### 普通 Few-shot（教「输出格式」）

```text
文本：某公司发布三季度营收数据。
类别：财务报告

文本：央行宣布降息。
类别：
```

示例只展示「输入 → 最终标签」，适合分类、抽取、固定格式输出。

### Few-shot CoT（教「推理过程 + 输出格式」）

```text
问题：小红 8 岁时，弟弟是她的一半。小红现在 20 岁，弟弟几岁？

第一步：8 岁时弟弟 4 岁，年龄差 4 岁不变
第二步：20 - 4 = 16
最终答案：16 岁

现在请按示例回答：
问题：小明 6 岁时，妹妹是他的一半……
```

示例里的 assistant 必须写出**完整思维链**，不能只给最终数字。

---

## 四、课堂导入（约 3 分钟）

**教师：** 大家心算一下：当小明 6 岁时，妹妹是他的一半；哥哥比他大 4 岁。现在小明 70 岁，妹妹和哥哥年龄加起来是多少？

（等学生口算，收集答案：141、105、175 都可能出现。）

**追问：** 有人算成 35 + 74 = 109 吗？为什么？

**点破误区：** 「一半」说的是**小时候**的关系，不是现在 70 的一半。年龄差一旦确定就不会变——这是这道题的关键。

**过渡：** 大模型也会犯同样错误。我们看看：直接要答案、让它自己想、给它看标准推理示例，哪种更稳。

---

## 五、演示顺序（约 15 分钟）

> 课前先在编辑器里打开 `question.py`、`examples.py`、`prompts.py` 三个标签页，演示时来回切换。

### 第 0 步：确认题目（不要跳过）

打开 `question.py`，向学生展示 `MAIN_QUESTION`：

- `question`：今天要考模型的原题
- `expected_answer`：141 岁
- `common_mistake`：把「一半」误用到现在
- `correct_reasoning`：标准板书过程

再打开 `examples.py`，说明模式 C 会**额外**带上 `FEW_SHOT_EXAMPLES` 里的示范题，不是替换主题目。

### 第 1 步：运行项目

```bash
cd 06_代码\Day_02\fewshot_cot_demo
python main.py
```

终端开头会再次打印主题目和示例说明，可对照 `question.py` / `examples.py` 看是否一致。

### 第 2 步：先看模式 A（无 CoT）

观察：

- 回复是否只有一行？
- 最终答案是不是 141？有没有出现 35（把一半用错）？

**讲解要点：** 不是模型「不会」，而是**没被逼着展开推理**，容易走捷径。

### 第 3 步：再看模式 B（零样本 CoT）

观察：

- 是否出现「第一步 / 第二步」？
- 有没有提到「年龄差」？

**讲解要点：** 加一句「请一步一步思考」往往就能触发思维链，这叫 **Zero-shot CoT**。但推理是否抓住关键条件，不一定每次一样。

### 第 4 步：最后看模式 C（Few-shot CoT）

观察：

- 格式是否更像示例（先列条件 → 算年龄差 → 再算现在）？
- 和模式 B 比，哪次更稳定？

**讲解要点：** 示例相当于**现场示范解题过程**。示例 2（小红弟弟题）专门预热「年龄差不变」，能帮助模型少犯「现在也是一半」的错误。

### 第 5 步：小实验

```bash
python main.py --shots 1
python main.py --shots 2
```

讨论：**示例不是越多越好**，要「典型、相关、覆盖易错点」。示例 1 只教加法格式，对年龄题帮助有限；加上示例 2 后效果通常更好。

---

## 六、标准推理（板书）

题目：小明 6 岁时，妹妹是他的一半；哥哥比他大 4 岁。小明现在 70 岁，妹妹和哥哥年龄加起来是多少？

1. 小明 6 岁时，妹妹 3 岁 → 妹妹比小明小 **3 岁**（年龄差不变）
2. 哥哥比小明大 **4 岁**（年龄差不变）
3. 小明现在 70 岁 → 妹妹 67 岁，哥哥 74 岁
4. 67 + 74 = **141 岁**

---

## 七、学生常问 FAQ

**Q：CoT 是不是让模型变聪明了？**  
A：不是重新训练，只是在本次对话的上下文里**引导它先写推理再写答案**，属于提示词技巧。

**Q：是不是所有任务都要 CoT？**  
A：不是。简单翻译、问候、单句分类用 CoT 反而浪费 Token、变慢。多步推理、多条件判断才值得用。

**Q：分步写很长是不是一定更好？**  
A：不是。好的 CoT 是**有用的中间步骤**（列条件、算年龄差），不是废话堆砌。

**Q：Few-shot CoT 示例谁写？**  
A：通常由**人**根据业务经验和易错点设计；示例质量往往比数量更重要。

---

## 八、和 cot_demo 怎么搭配讲

| 顺序 | 项目 | 讲什么 |
|---|---|---|
| 1 | `cot_demo` | 用 9.9 vs 9.10 建立直觉：无 CoT 易错，有 CoT 易对 |
| 2 | `fewshot_cot_demo` | 深入 Few-shot CoT：示例怎么设计、年龄差陷阱 |
| 3 | 作业 / 笔记 | Zero-shot vs Few-shot CoT 对比表默写 |

---

## 九、课后练习（可直接布置）

1. 在 `examples.py` 里把示例 2 删掉，只保留示例 1，重新运行，记录模式 C 是否仍答对。
2. 自己写一个「易混淆但更简单」的 Few-shot CoT 示例（如买卖找零），替换示例 1。
3. 用一句话向同桌解释：Zero-shot CoT 和 Few-shot CoT 的区别是什么？

**参考答案（第 3 题）：**  
Zero-shot CoT 只要求分步想，不给示范；Few-shot CoT 先给带推理过程的例题，让模型模仿写法。
