# T2 逐步拆解：最小 RAG 题怎样拿分

## 1. 输入、输出与评分规则

2025 官方 T2 有三类输入：

| 输入 | 用途 |
|---|---|
| `problem_bank.json` | 100 道带题目、答案、解析的参考题 |
| `similarity_test_T2.jsonl` | 20 个查询与预期最相似题 ID |
| `test_data_T2.jsonl` | 6 道待解题，最终答案不可见 |

评分共 50 分：

- 20 分：余弦相似度能否找出预期最相似题。
- 30 分：RAG 回答的 `answer` 是否正确且 JSON 可解析。

最终输出：

```json
{"reasoning":"简洁计算过程","answer":"63"}
```

`answer` 必须是数字字符串，不能带单位、公式或解释。

## 2. PyTorch Embedding / Tensor 操作

官方评测器负责提供 `get_embedding_func(text, embedding_model, tokenizer)`。2025 的实现使用：

```text
tokenizer → model → last_hidden_state
→ attention_mask 加权平均池化
→ 一维 embedding
```

你的 `submission.py` 不需要重新加载模型；只要拿到 embedding，做相似度和检索即可。

最常用操作：

```python
query = query_embedding.flatten().float()
document = doc_embedding.flatten().float()
dot = query @ document
norm = query.norm() * document.norm()
```

## 3. cosine similarity

```python
similarity = (query @ document) / (query.norm() * document.norm())
```

必须做两件事：

1. 除以两个 L2 范数；只算点积不是余弦相似度。
2. 对零向量返回 `0.0`，避免 NaN 或除零。

返回值必须是 Python `float`，故要 `.item()`。

## 4. Top-K 检索

正确顺序：

1. 为查询取 embedding。
2. 遍历题库，为每道参考题取 embedding。
3. 用 `compute_similarity` 得分。
4. 按分数**降序**排序。
5. 返回前 `top_k` 道。

安全边界：

- 空题库或 `top_k <= 0` 返回空列表。
- `top_k > len(problem_bank)` 时自然切片，不报错。
- 同分时按题库原顺序，保证可复现。

## 5. 最小 RAG 流程

```text
当前问题
  → query embedding
  → 相似度排序
  → Top-K 参考题（题目 + 解析 + 答案）
  → 构造用户消息
  → LLM 生成 reasoning + answer JSON
```

RAG 不是“把检索到的答案直接复制出去”。Prompt 必须写清：参考题只用于学习方法，最终要独立解当前问题。

## 6. Prompt 与用户消息组装

用户消息必须清楚分隔：

- 【当前问题】
- 【检索到的参考题】
- 每道参考题的 ID、题目、解析、答案

system prompt 只强调：

1. 参考题是方法提示，不是当前题答案。
2. `reasoning` 是简洁过程。
3. `answer` 仅数字字符串。
4. 只输出 JSON，无 Markdown、前后缀。

## 7. 隐藏测试与泛化

2025 官方明确：最终数据与自测数据不同。不要：

- 用查询 ID、公开题号或自测答案写分支。
- 假设题库只有 100 条、`top_k` 永远是 3。
- 只处理公开样例中出现的文本格式。
- 修改 `evaluate.py` 或绕开它的调用链。

要做：

- 调用评测器传入的 `get_embedding_func`。
- 只依赖题库字段和函数参数。
- 用未见过的变例回归测试。

## 8. 常见 bug 与失分点

| 错误 | 后果 | 修复 |
|---|---|---|
| 只算 `q @ d` | 检索排序错 | 除以两向量 norm |
| `reverse=False` | 取到最不相似题 | 降序排序 |
| 忘记 `.item()` | 返回 Tensor，比较或排序异常 | 返回 float |
| 忘记 `top_k` | 全题库塞进 Prompt | 只返回前 K |
| 当前题/参考题混写 | 模型照抄参考答案 | 写清楚两个区块 |
| `answer: "96元"` | 答案字段失分 | 只输出 `"96"` |
| 夹带 Markdown | JSON 解析风险 | 只输出对象 |
| 公开样例硬编码 | 隐藏集失分 | 通用检索与通用 Prompt |

## 9. 官方环境的最终验证

将你写好的 `submission.py` 放入官方 T2 目录，使用官方环境运行：

```bash
python evaluate.py --mode demo
python evaluate.py --mode grading
```

先看相似度 20 题，再看 RAG 6 题；不要在没过相似度前只调 Prompt。
