# 闭卷必须会写的代码

## 1. T1 纯 JSON 契约

```python
def build_generation_parameters():
    return {
        "max_new_tokens": 1024,
        "do_sample": False,
        "enable_thinking": True,
    }
```

Prompt 中必须写：任务、标准答案/规则、最终答案提取、student_id 原样保留、只输出布尔 JSON。

## 2. cosine similarity

```python
def compute_similarity(query_embedding, doc_embedding):
    q = query_embedding.flatten().float()
    d = doc_embedding.flatten().float()
    denom = q.norm() * d.norm()
    if denom.item() == 0:
        return 0.0
    return ((q @ d) / denom).item()
```

## 3. Top-K retrieval

```python
def retrieve_relevant_problems(query, problem_bank, embedding_model,
                               tokenizer, top_k=3, get_embedding_func=None):
    if not problem_bank or top_k <= 0:
        return []
    query_emb = get_embedding_func(query, embedding_model, tokenizer)
    scored = []
    for index, item in enumerate(problem_bank):
        doc_emb = get_embedding_func(item["problem"], embedding_model, tokenizer)
        score = compute_similarity(query_emb, doc_emb)
        scored.append((score, index))
    scored.sort(key=lambda pair: (-pair[0], pair[1]))
    return [problem_bank[index] for _, index in scored[:top_k]]
```

## 4. RAG 用户消息

```python
def build_user_message(problem, retrieved):
    lines = ["【当前问题】", problem, "", "【参考题】"]
    for rank, item in enumerate(retrieved, 1):
        lines += [
            f"参考题 {rank}（ID={item['id']}）",
            f"题目：{item['problem']}",
            f"解析：{item['explanation']}",
            f"答案：{item['answer']}",
        ]
    lines.append("参考题只用于学习方法；独立解当前问题。")
    return "\\n".join(lines)
```

## 5. T2 输出约束

```python
def build_system_prompt():
    return """
只输出一个 JSON：
{"reasoning":"简洁过程","answer":"数字"}
answer 只能是数字字符串，不要单位、Markdown、前后缀。
""".strip()
```

## 6. JSONL 最小读法

```python
import json

records = []
with open("data.jsonl", encoding="utf-8") as f:
    for line in f:
        if line.strip():
            records.append(json.loads(line))
```

其余代码优先看模板，不建议考前临时背完整训练循环、LoRA 或复杂 Agent。
