层1/T2: teacher.py 批量生成 + sha256 JSONL 缓存;teacher 改定 MiniMax-M3

- teacher.py: 通用 OpenAI 兼容客户端(配置驱动 base_url,替代 OpenRouter 专用);
  缓存即断点(逐条落盘+flush,重跑自动续传);单条失败先落盘其余、结束汇总显式报错;
  M3 思考段 <think>...</think> 入库前剥离(只剥开头一段)
- configs.py: 新增 TeacherGenConfig(采样参数显式化;连接三元组走 .env)
- scripts/generate_teacher_completions.py: 自包含生成脚本(本地跑,与训练侧
  同 seed 同子集约束已注明)
- teacher 决策变更同步:.env.example / docs/00 关键设定与存档点 / docs/02
- tests/test_teacher.py: 10 个单测(假客户端注入),含与 attach 的端到端契约闭环

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-18 07:52:53 -04:00
parent f5bb852fde
commit 20e6d97427
7 changed files with 414 additions and 7 deletions
+39
View File
@@ -111,3 +111,42 @@ class SFTConfig:
raise ValueError(
f"max_steps 只接受 -1(按 epoch)或正整数,收到 {self.max_steps}"
)
@dataclass(frozen=True)
class TeacherGenConfig:
"""teacher 批量生成(层 1 能力)的采样与执行参数。
连接信息(API 地址/密钥/模型名)不在这里——那是部署环境的事实,走 `.env`
teacher.py 读取);这里只放"换一组值就是换一个实验"的采样参数。
"""
temperature: float = 1.0
top_p: float = 0.95
"""MiniMax M 系官方推荐采样参数:temperature=1.0, top_p=0.95。"""
max_tokens: int = 8192
"""teacher 单条回复的 token 上限。非显然约束:M3 的思考段也计入此额度,
设太小会把解答挤没(只剩被截断的思考);student 侧超长解答由 collator 的
completion 预算兜住,这里宁可给足。"""
strip_think: bool = True
"""剥离 content 开头的 <think>...</think> 思考段。SFT 的监督目标是最终
解答;student 以 enable_thinking=False 训练,学思考段会与模板约定矛盾。"""
concurrency: int = 8
"""并发请求数(线程池大小)。"""
max_retries: int = 3
"""单请求的网络级重试次数(openai 客户端内建指数退避)。"""
system_prompt: str | None = None
"""None = 不加 system 轮(DAPO 题面自带作答指令,不需要额外指挥)。"""
def __post_init__(self) -> None:
if self.max_tokens <= 0:
raise ValueError(f"max_tokens 必须为正,收到 {self.max_tokens}")
if self.concurrency < 1:
raise ValueError(f"concurrency 必须 ≥1,收到 {self.concurrency}")
if self.temperature < 0:
raise ValueError(f"temperature 必须 ≥0,收到 {self.temperature}")