# T1 逐步拆解：从题目到提交

## 1. 输入是什么

2025 官方 T1 的每条输入对应一名学生，核心字段是：

| 字段 | 含义 |
|---|---|
| `student_id` | 必须原样带回输出 |
| `content` | 5 道题及学生作答的自然语言文本 |
| `expected_judgements` | 评测使用；考场最终数据不可见 |

`content` 会混入算式、过程、评论、表情和错误建议。你的 Prompt 不能只抓第一个数字，而要按每一题定位学生最终核心答案。

## 2. 输出是什么

唯一安全输出是一个 JSON 对象：

```json
{"student_id":"student_001","judgements":[true,false,true,true,false]}
```

- `student_id`：字符串，与输入完全一致。
- `judgements`：长度为 5 的数组。
- 数组元素：JSON 布尔值 `true` 或 `false`，不能是 `"true"`、`1`、`"1"`。
- 输出前后不要加入任何文字或 Markdown 代码块。

## 3. Prompt 应该怎么设计

用四层结构，短而明确：

1. **角色与任务**：你是批改助手，输入是一名学生的作业文本。
2. **标准答案**：列出 5 个题的确定答案，避免模型自行猜题。
3. **提取规则**：每题取最终核心数值，忽略过程、评论、表情、其他人的说法。
4. **输出契约**：仅返回一个 JSON 对象，写出字段名、数组长度和布尔值示例。

不要做：

- 把可见自测学生的具体内容写进 Prompt。
- 用很长的理论介绍占掉 token。
- 要求输出“详细解释”，再希望模型只给 JSON。
- 让模型使用随机采样。

## 4. JSON 的硬性要求

官方 2025 评测器会尝试从文本中提取 JSON，但你的训练应更严格：只输出 JSON。原因是隐藏测试、模型输出和解析器实现可能变化，纯 JSON 最稳定。

| 风险 | 错误示例 | 正确做法 |
|---|---|---|
| 多余前缀 | `结果如下：{...}` | 直接从 `{` 开始 |
| Markdown | ```json ...``` | 不要代码块 |
| 布尔类型错 | `[1, 0]` | `[true, false]` |
| ID 丢失 | 没有 `student_id` | 原样回传输入 ID |
| 长度错 | 只输出 4 个判断 | 按题目数输出 5 个 |

## 5. 2025 评测器具体检查什么

从官方 `evaluate.py` 可确认：

1. 先移除 `<think>...</think>`。
2. 尝试从模型文本提取 JSON。
3. 检查是否含 `student_id` 和 `judgements`。
4. 检查 `judgements` 是否为列表、长度是否与该学生题数相同。
5. 每个判断与期望值逐项对比；每题 2 分。

官方评测器未在这段代码中强制检查 `student_id` 是否等于输入 ID、也较宽松地尝试从夹带文本中提取 JSON；但不要依赖这些宽松行为。考试时写纯 JSON、原样回传 ID 才是正确策略。

## 6. 最容易失分的地方

1. Prompt 未给标准答案，模型反复自己算错。
2. 抓到过程中的中间数字，而非学生最后答案。
3. `do_sample=True` 让相同输入输出不稳定。
4. 输出含解释或 Markdown，解析失败。
5. `judgements` 里是字符串而不是真布尔值。
6. 针对自测数据硬编码，最终数据格式变动后崩溃。
7. 不先运行 `evaluate.py --mode demo`，看不到模型原始输出到底哪里不合规。

## 7. 标准解法的关键逻辑

参考文件：[standard_solution/submission.py](standard_solution/submission.py)。

### `build_system_prompt()`

- 第一段固定“输入是一名学生的作业文本”，让模型先建立任务边界。
- 第二段列出 5 个标准答案，避免模型在算式识别之外再引入不必要的猜测。
- “保留 student_id”防止字段值被模型重新命名或遗漏。
- “最终核心数值”是 T1 的关键：它要求模型忽略草稿、评论、表情和他人的说法。
- 最后一段把 JSON 字段、数组顺序、布尔类型和“无额外文本”写死。

### `build_generation_parameters()`

- `do_sample=False`：同一个作业输入应得到稳定结果；这类严格判定题不需要创意。
- `max_new_tokens=1024`：给思考和最终 JSON 足够空间，不因截断损坏大括号。
- `enable_thinking=True`：这是 2025 官方评测器支持的参数；评测器会移除 thinking 标签再提取 JSON。2026 是否支持，须以官方环境为准。

## 8. 考场做题顺序

1. 读 README，再读 `evaluate.py` 中“导入 submission”“输出解析”“评分”的代码。
2. 记下：允许改哪些函数、字段名、长度、分数和时间限制。
3. 先写最短的 Prompt 契约和确定性生成参数。
4. 跑 demo，先看 JSON 是否可解析，再看判断是否正确。
5. 用不同噪声文本做人工变例，防止只适配自测。
6. 最后再压缩 Prompt，保证不超过题目设定的 token 上限。
