💻 源码
# 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 先给带推理过程的例题,让模型模仿写法。