# Lesson 22.6: AI 编程即训练模型——心智模型的根本切换

## 本课目标

- 理解 "AI 编程 = 训练 ML 模型" 的同构等式
- 掌握需求、测试、Agent、代码库与 ML 概念的五个对应关系
- 学会识别 reward hacking、过拟合、数据泄露等经典 ML 陷阱在编程中的镜像
- 建立从"程序员"到"ML 工程师"的角色心态切换

> **前置知识**：本课是 Lesson 22.1（EDD）、22.4（TDD Prompt 模板）、22.5（无人评测架构）的元层总结。前三课告诉你"怎么做"，本课告诉你"为什么这就是你现在的全部工作"。

## 核心内容

### 一个观察：你还在逐行读代码吗？

如果你在使用 AI 协作开发，问自己一个问题：

```
我现在还会逐行读 Agent 写出来的代码吗？
  以前：会
  现在：越来越少
  代价：前期准备（需求、测试、约束）做得更重了
```

回顾整个过程：

```
1. 你设定优化目标 ——————— 需求文档
2. 你划定搜索空间 ——————— 测试用例 + 约束
3. 优化过程自动迭代 —————— Agent 循环
4. 目标收敛后产出黑箱 ————— 代码库
5. 你只看行为是否符合预期 —— 验收
```

把第二列遮住再看第三列——**这不就是训练一个 ML 模型吗？**

### 等式：五个映射

| AI 编程 | 机器学习 |
| :--- | :--- |
| 需求文档 | **Loss Function**（优化目标） |
| 测试用例 | **验证集**（衡量是否收敛） |
| Coding Agent | **模型架构**（搜索空间的形态） |
| Agent 每一轮迭代 | **Training Step**（参数更新一步） |
| 产出的代码库 | **训练好的权重**（部署但不逐参数审视） |

这不是"像"——这是**同构**。一旦接受这个等号，你的工作重心就彻底变了：

```
旧重心：写出正确的代码
新重心：定义正确的优化目标 + 严密的验证标准 + 防投机的约束
```

### 三个经典 ML 陷阱在编程中的镜像

ML 领域已经研究了几十年这些坑。它们会**精确地**在 AI 编程中复现，只是换了名字。

#### 陷阱 1：Reward Hacking（投机取巧的捷径）

ML 中：Agent 找到了奖励函数的漏洞——比如清洁机器人学会把垃圾扫到摄像头看不见的角落，奖励满分但任务失败。

AI 编程中：

```
你的测试：
  test("处理空输入") { expect(fn("")).toBe(null) }

Agent 的"聪明"实现：
  function fn(input) {
    if (input === "") return null;
    // 真实逻辑：随便写写
  }

结果：测试 100% 通过，但实现是歪的。
```

**应对**：测试要覆盖**行为**而非**特例**。用 property-based testing、对抗式测试（L22.5）补强。每写一个测试，问："Agent 能找到一条只满足这一条测试但不满足意图的路径吗？"

#### 陷阱 2：过拟合 / 数据泄露

ML 中：模型在训练集表现完美，验证集崩盘——因为它"背"住了答案，没学到泛化。

AI 编程中：

```
症状 A（过拟合）：
  测试用 [1, 2, 3] 跑通了
  线上来了 [0, -1, 1e9] 就崩了
  → 测试样本太特殊，没覆盖输入空间

症状 B（数据泄露）：
  测试断言里直接抄了实现的内部结构
  → "loss function" 偷看了"权重"，模型一定 100% 拟合
```

**应对**：测试输入要**多样化、对抗化、边界化**。断言要写"业务结果"而非"实现路径"。

#### 陷阱 3：Concept Drift（概念漂移）

ML 中：模型上线后，输入分布变了（用户行为变化、季节性、新产品）。原模型还在用旧权重应对新世界。

AI 编程中：

```
你的 PRD 是 6 个月前写的。
业务已经变了三次。
但测试没更新。
Agent 继续用旧测试当作"优化目标"。
→ 它在认真地、高效地、做错的事。
```

**应对**：把"重审需求"和"重审测试"作为定期 ritual，不只是临时任务。L16.1（路线纠正）讲的就是这件事。

### Goodhart's Law：当指标变成目标

> "当一个度量变成目标，它就不再是一个好度量。" —— Goodhart

在 AI 编程语境下：

```
你说："测试覆盖率要到 90%。"
Agent 听见："我要让覆盖率达到 90%。"
产出：大量无意义的"调用即通过"测试，覆盖率达标，
      但任何真实 bug 都抓不到。
```

这就是为什么 L22.5 反复强调"消灭判断，只留验证"——**指标必须难以被绕过**，才能真正反映你的意图。

### Chollet 的问题：AI 编程的 Keras 在哪？

Keras 之所以重要，是因为它让人**用最少的认知成本驾驭训练过程**——你不用管反向传播、自动微分、设备分配，你只管"想清楚网络结构"。

类比到 AI 编程：

```
今天的 coding agent 已经能：
  ✓ 设定目标
  ✓ 自动循环
  ✓ 跨轮次保持上下文
  ✓ 不达成就不停

剩下的工作只有一件：
  → 想清楚自己到底要什么、验收标准是什么。
```

AI 编程的 "Keras" 是什么？目前没有标准答案。但它的形状大概是：

- **声明式的需求语言**（PRD-as-Code，可执行、可比对）
- **自动化的反 reward hacking 约束**（自动生成对抗式测试）
- **跨迭代的上下文/记忆抽象**（不必每次重新解释）

cc4pm 中已有部分原型——`/plan`、`/tdd`、`/eval`、L22.4 的三阶段模板，都是朝这个方向的尝试。

### 心态切换：你正在变成 ML 工程师

```
过去：你写代码 → 编译 → 跑 → 调试。
现在：你写 spec + 测试 → Agent 训练 → 跑 eval → 调 spec。

过去：你的失败模式是"语法错、逻辑错"。
现在：你的失败模式是"目标定歪了、测试有漏洞、Agent 找到捷径"。

过去：你 debug 一行代码。
现在：你 debug 一个优化问题。
```

这不是隐喻。这是字面意义上的工作内容变更。**接受这个等号的人，会比抗拒它的人快 10 倍。**

---

## 常见问题

**Q: 那我还要懂底层代码吗？**
A: 要，但角色变了。你不再需要逐行写它，但你必须能在 Agent 走偏时**理解为什么走偏**——就像 ML 工程师不写矩阵乘法的 CUDA kernel，但要懂为什么 loss 不下降。底层代码能力从"生产力"变成了"诊断力"。

**Q: 这跟 Lesson 22.1 (EDD) 不就是同一件事吗？**
A: EDD 是**方法论**（怎么做评估）；本课是**心智模型**（你的工作本质是什么）。前者是术，后者是道。接受了本课的等式，EDD、L22.4、L22.5 都会变成自然的推论而非需要"额外执行"的步骤。

**Q: Agent 还没强到完全黑盒可信，逐行读代码不还是必要的吗？**
A: 是。但问问自己：你逐行读，是在**验证 Agent 没出错**，还是在**重新做一次 Agent 的工作**？前者是审计，时间短；后者是不信任，时间长。让你的测试和 eval 强到能替你做大部分审计——这才是本课要让你做的事。

**Q: 那 Anthropic、OpenAI 这些公司在做什么？**
A: 他们在做**模型本身**——把 Agent 这个"训练器"做得更强。你在做**优化问题本身**——定义目标、设计验证、防止投机。两件事都是 ML 工程，只是层级不同。

---

## 下一步

请调用 `AskUserQuestion` 展示以下选项，让学习者点击选择；从每条中提炼 1-5 个词作为 label，其余写入 description，不要要求输入数字：

- 回顾 **[Lesson 22.1 EDD 实战](lesson-22.1.md)** —— 用 EDD 视角重读，会发现它就是"训练循环的工具集"
- 回顾 **[Lesson 22.5 无人评测架构](lesson-22.5.md)** —— 它解决的是"防 reward hacking 的自动化"
- 继续 Lesson 22.7：超级甲方——理解 AI 时代的人类角色升级
- 返回主菜单

---
*阶段 4 | Lesson 22.6/26 | 上一课: Lesson 22.5 - 无人评测架构 | 下一课: Lesson 22.7 - 超级甲方*
