# 3.7 过程式表述与结果式表述

> 状态（2026 年 10 月）：中英文各 12 次（两档难度 × 两种表述 × 3 次）全部跑完。设计和判定规则见 `CONTRACT.md`。

## 问的是什么

把一件事交给 AI 有两种说法：

- 过程式：“做完这几件事，你就算完成了”。
- 结果式：“满足这几条标准，你就算完成了，路径你自己找”。

我们想知道的是：任务复杂到事先列不出能保证结果的步骤时，过程式会不会碰到天花板？如果会，这个天花板是不是来自表述，而不是来自模型或步骤写得差。

## 结果

### 复杂档：约五十五分钟的会议录音，分成两个文件

| | 过程式 | 结果式 |
|---|---|---|
| 五条标准全部满足 | 中文 0/3，英文 0/3 | 中文 3/3，英文 3/3 |
| 两个文件的重叠被发现并去重 | 0/6 | 6/6 |
| 第二个文件的时间戳对应整场会议 | 0/6（交付了文件的 5 次里，第二个文件 98% 以上的段落整体晚了约 40 秒，正是重叠的长度） | 6/6 |
| 电话参会者的 8 段发言全部保留 | 4/6 | 6/6 |
| agent 报告“步骤里有做不到的事” | 4/6 | 0/6 |
| agent 宣布完成，但标准其实没满足 | 2/6 | 0/6 |

过程式没有一次是因为偷懒失败的。逐次看下来，有三件事：

1. **六份步骤清单都写下了同一个错误的假设。** 规划者在开工前推断“第二个文件的起点等于第一个文件的时长”，这是没听过录音时最合理的推断，但录音中途换了设备，两个文件重叠了 40 秒。执行者照做，结果重叠区重复了，第二个文件的时间戳全部偏了。结果式的 agent 在对照“时间戳要对应整场会议”这条标准时，通过比对两段波形发现了重叠（例如 `trials/zh_complex_outcome_1/log/transcript.jsonl` 第 333 秒那条消息）。
2. **步骤写得很周全，但核对的是步骤自己的假设。** 规划者都写了大量核对步骤，比如两遍独立识别、逐个窗口复核、最终覆盖检查。这些核对在 4/6 次里补回了电话参会者的发言，但都建立在“第二个文件接在第一个后面”这条时间轴上，所以查不出时间轴本身错了。
3. **步骤规定了执行者没有的手段。** 好几份清单要求逐段回听原音频（中文清单写作“核听”），执行的 agent 听不了音频。有 4 次执行者如实报告步骤里有做不到的事，其中一次（中文第 2 次）干脆拒绝交付正式文件，只留了一份待核听的草稿。另外 2 次宣布完成，英文第 3 次还写着“通过了格式和时间戳检查”，但它检查的是自己那条错的时间轴。结果式不会遇到这个问题，因为怎么核对是它自己选的，它用的是响度检测、截段重转和波形比对。

### 简单档：一条 15 秒的备忘录（W01）

| | 过程式 | 结果式 |
|---|---|---|
| 中文全部通过 | 3/3 | 3/3 |
| 英文全部通过 | 1/3 | 3/3 |

中文两种表述都没问题，说明过程式本身不是错的，事先列得出步骤时它照样管用。

英文过程式两次没通过，原因是同一处人名：带着词表转写时，识别接口把 Saoirse 认成了 Xochitl，而步骤里写着“只在音频能确认时才改人名”，执行者就保留了错的名字。这只是一处人名，样本也只有 3 次，不足以说明简单档里两种表述有差别，正文里如实写出即可。

### 人名和术语（不是本实验的变量，只作记录）

复杂档里，结果式的人名和术语几乎全对（中文 523/525，英文 482/486）。过程式在交付了正式文件的几次里也在 97% 左右。

## 设计要点

- **两组用同一个模型**（gpt-6.1-sol，ChatGPT 订阅 OAuth，走 Codex Responses 接口，推理强度 medium），同样的工具（一个 `shell`），同样的文件夹。两组只差提示词。
- **过程式的步骤由 gpt-6.1-sol 自己写**（推理强度 high）。规划者能看到任务、全部五条目标和文件清单（含文件大小和时长），但没有听过录音。执行者只拿到任务和步骤。每次试验各自生成一份清单，原文在 `trials/*_process_*/plan.md`。
- **两种“静默”的意外，事先都在真实接口上试过**（`pilot/`）：
  - 电话参会者音量小、音质窄，夹在正常录音里时，Grok 转写接口会把他的部分发言整段丢掉，不报错；单独截出来再转就完整。中文用原音量的 0.12 倍；英文要到 0.06 倍才出现同样程度的丢段（0.12 倍时 8 段只丢 1 段）。
  - 两个文件重叠 40 秒，第二个文件从第一个文件结束前 40 秒开始。
  - 试点排除掉的意外：静音段（Grok 不会凭空编字）、五十分钟的整段长文件（一次就能完整转完）。
- **打分用台词真值**（`grade.py`、`grade_simple.py`），执行者读不到。一句台词在逐字稿里找得到相似度 ≥70 的对应文字，就算覆盖；在去掉第一次匹配后还能再找到一次，就算重复；段落时间戳落在对应台词起止时间的 ±10 秒以外，就算偏了。“五条标准全部满足”指覆盖、不重复、时间戳都达标，人名另计。

## 文件

- `CONTRACT.md`：实验合同（问题、逆向推导的设计、理想结论与其他可能）。
- `harness/mini_agent.py`：最小 agent，一个模型加一个 `shell` 工具。命令在 macOS `sandbox-exec` 里执行：只能写工作文件夹，读不到 `experiments/` 目录和本机凭据；输出里的 API key 一律替换成 `<redacted>`。
- `run_trial.py`：跑一次试验（建工作文件夹 → 过程式先生成步骤 → 运行 agent → 拷回交付物和日志 → 打分）。
- `prompts_zh/`、`prompts_en/`：任务、验收标准和三种提示词模板（规划者、过程式、结果式）。
- `fixture_zh/`、`fixture_en/`：工作文件夹里的 `API.md` 和 `names.md`。
- `meeting_zh/`、`meeting_en/`：台词脚本（`script.json`，由 gpt-6.1-sol 按 `script_prompt.md` 生成）、合成配置（`config.json`）、真值时间轴（`truth.json`）。音频用 Gemini TTS 的预置声音合成，不涉及任何人的克隆声音，用 `build_meeting.py` 重建。
- `trials/<语言>_<难度>_<表述>_<次>/`：每次试验的提示词、步骤清单、agent 日志（`log/transcript.jsonl`、`log/summary.json`）、交付物和打分（`grade.json`）。agent 放在隐藏目录里的中间文件没有拷回。
- `results.json`：`summarize.py` 汇总的全部结果。

## 怎么跑

都在 textbook 仓库根目录执行。

```bash
# 合成会议录音（需要 GEMINI_API_KEY；每句台词的音频有缓存）
op run --env-file <(printf 'GEMINI_API_KEY=op://dev/dev-api-keys/gemini_api_key\n') -- .venv/bin/python experiments/3_7_formulation/build_meeting.py zh

# 跑一次试验：语言 难度 表述 次数（需要 ChatGPT OAuth 登录，见 chat_gpt_oauth skill）
cd experiments/3_7_formulation
op run --env-file ../aib.env -- ../../.venv/bin/python run_trial.py zh complex outcome 1

# 汇总
../../.venv/bin/python summarize.py
```

## 成本

执行者和规划者都走 ChatGPT 订阅，不按 token 计费。单次复杂档试验大约读入一百万到两百万 token，用时 7 到 15 分钟。语音识别走 AI Builder Space，每小时音频约 0.1 美元，全部试验加试点不到 5 美元。Gemini TTS 合成两场会议不到 2 美元。

## 公开前要做的事

- 日志里有本机绝对路径（工作文件夹在 `knowledge_working/tmp/3_7_runs/` 下），公开前替换掉。
- 已扫过 `trials/`，没有 key（`sk_` 开头的字符串为零）。
- 录音文件（`.m4a`）和合成中间文件（`.wav`）不进 git，部署时单独上传 `recordings/`。
