下面是更完整版,可直接丢给训练 agent。核心改动:默认硬件按 Apple M4 Pro 本地 CPU/MPS,明确跳过 RL;数据 teacher 策略交给子 agent 判定;加入“不能只写计划,达成 DoD 才能成功退出”。 ```text # 任务:在 InfoLens 上训练一个 Qwen3-0.6B Tiny-NLA(AV + AR) 你是训练执行 agent。你的任务不是写调研报告,而是把一个能跑的 Tiny-NLA 原型训练出来,并交付可复现脚本、checkpoint、评估样例。 请完整读完本任务书再动手。任何红线冲突立即停止并报告。除非遇到明确硬阻塞,否则你不能只输出计划后退出;你必须持续执行、修正、评估,直到满足“Definition of Done”。 --- ## 0. 已知项目与硬件约束 Repo: `/Users/cccmmd/InfoLens` InfoLens 是本地 LLM 可解释性工具,已有: - `/api/prediction-attribute`:next-token attribution - `/api/ablation-attribute`:ablation attribution - `/api/logit-lens`:逐层 hidden state 经过 final norm + lm_head 的 top-k 与目标 token 概率轨迹 默认模型见 `model_paths.py`: - Base: `qwen3-0.6b` -> `Qwen/Qwen3-0.6B-Base` - Instruct: `qwen3-0.6b-instruct` -> `Qwen/Qwen3-0.6B` 硬件已知: - 本机是 Apple M4 Pro 本地机器。 - 不要假设有 CUDA。 - 可以探测 MPS,但必须先 smoke test 反向传播;MPS 不可靠时退回 CPU。 - 默认策略:只做 SFT,不做 RL。 - RL / GRPO 在本机视为 out of scope,除非用户另行提供远程 CUDA 训练机。 --- ## 1. 红线 违反任意一条即任务失败,立即停止并报告: 1. 禁止下载或运行 7B 及以上模型。 2. 禁止使用官方 released NLA checkpoint。它们绑定 Qwen2.5-7B / Gemma / Llama 的激活空间,与 Qwen3-0.6B 不兼容。 3. 禁止照搬 Miles + SGLang + Megatron 训练栈。本任务只能使用轻量依赖:`torch`、`transformers`、`peft`、`datasets/pyarrow`、`numpy`、`pyyaml` 等。 4. 禁止把官方 7B/70B 超参当成默认值。0.6B 必须自己做小规模 smoke 与轻量调参。 5. 禁止把大模型权重、parquet 数据、训练 artifacts 提交到 git。 6. 不要改动生产 UI/API,除非用户后续明确要求。本任务只做实验脚本与 artifacts。 --- ## 2. 目标 训练一对 Tiny-NLA 组件,用于解释 `Qwen/Qwen3-0.6B-Base` 某一层 residual stream activation。 - AV / Activation Verbalizer: `activation vector -> natural language explanation` - AR / Activation Reconstructor: `explanation -> reconstructed activation vector` - 比较向量前必须 L2 normalize。 - round-trip loss 使用 `MSE = 2 * (1 - cosine)` 或等价 normalized MSE。 - 最终 InfoLens 更依赖 AV:输入某层 activation,输出一句可读中文解释。 - AR 用于客观评估与未来 reward,不要求达到官方 7B 水平,但必须训练、评估、和 baseline 比较。 --- ## 3. 成功退出条件 Definition of Done 你不能在满足以下条件前声称任务完成: 1. 已确认并记录环境: - device: CPU / MPS / CUDA - `Qwen/Qwen3-0.6B-Base` 的 `num_hidden_layers` 与 `hidden_size` - 选择的 layer index,按约 2/3 深度计算,并说明理由 - injection token 是否为单 token - injection scale 如何估计 2. 已完成可复现数据生成: - 至少 smoke 数据 200 条 - 如果速度允许,扩到 500-2000 条 - 数据包含:context、token index、layer、activation_vector、teacher explanation、target token/top-k debug 信息 - 数据与 sidecar 存在 artifacts 目录,且不进入 git 3. 已完成 Stage 0 smoke: - 能提取 Qwen3-0.6B-Base hidden state - 能用 `input_embeds` 注入 activation - 能跑一次 AV forward/generation,不崩溃、不 shape mismatch 4. 已完成 AR SFT: - 有训练脚本 - 有 checkpoint - 有 val metrics - 必须和 mean baseline / shuffled baseline 对比 - 如果 AR 训练失败,必须至少做两轮合理修正后才能报告 blocker 5. 已完成 AV SFT: - 有训练脚本 - 有 checkpoint 或 LoRA adapter - 能对 held-out activation 生成中文解释 - 至少输出 20 条 worked examples - 20 条里不能大面积乱码、空输出、模板废话;若质量很差,必须继续修正数据或训练设置,不能直接交付 6. 已交付推理脚本: - 输入文本 + token position,自动提取 selected layer activation - 调用 AV 输出解释 - 若 AR 可用,同时输出 reconstruction cosine/MSE - 从 `nla_meta.yaml` 读取配置,不硬编码 layer/token/scale/template 7. 已交付最终报告: - 环境 - 数据策略 - 训练耗时 - AR 指标 - AV 质量观察 - 20 条样例 - 失败案例与局限 - 下一步建议 只有以上完成,才能输出“任务完成”。否则只能输出“阻塞报告”,并附证据与已尝试修复项。 --- ## 4. 外部参考,只学算法,不照搬基础设施 参考仓库: `https://github.com/kitft/natural_language_autoencoders` 开工前阅读: - `README.md` - `docs/inference.md` - `docs/design.md` - `nla/schema.py` - `nla/config.py` - `nla/models.py` - `nla/loss.py` - `nla/reward.py` - `nla/datagen/` 你要借鉴: - AV 把 activation 当作一个虚拟 token embedding 注入 prompt - AR 从 explanation text 重建 activation - sidecar 记录 prompt、injection token、layer、scale、d_model - normalized MSE / cosine 作为评估 你不要借鉴: - 7B+ released checkpoints - Miles / SGLang / Megatron - 多 H100 训练配置 - RL 默认流程 --- ## 5. 数据生成策略:必须交给子 agent 判断与执行建议 在生成 teacher explanation 前,先启动一个 focused subagent,任务是: “判断当前环境是否可使用 Claude/外部 API 生成 Tiny-NLA teacher explanations;如果可用,给出低预算批量生成策略;如果不可用,给出本地 `Qwen/Qwen3-0.6B` instruct 生成策略。必须返回具体 prompt 模板、批大小、成本/速度风险、fallback 方案。” 子 agent 必须检查: - 是否存在 `ANTHROPIC_API_KEY` - 是否存在其他可用 teacher API key - 用户是否已明确预算 - 如果无法确认预算,不要擅自大规模调用外部 API 主 agent 根据子 agent 结论执行: ### 有 Claude API 且预算明确 - 先生成 200 条 smoke teacher explanations - 人工/程序抽查质量 - 再扩到 500-2000 条 - 每条 explanation 优先中文,短句,描述该位置模型可能关注的语义 ### 没有 API 或预算不明确 - 使用本地 `Qwen/Qwen3-0.6B` instruct 做 weak teacher - 允许降级,用户接受本地 teacher 质量较差 - 必须在报告中标注:teacher 是 weak local teacher,不是真正 Claude-quality NLA labels Teacher prompt 应包含: - 原始 context - token 位置 - target token / final top-k - logit lens 中该层附近的 top-k 摘要(如果容易取得) - 要求输出 1-2 句中文解释,不要长篇推理 注意:AR 的标签始终是原始 activation vector,不依赖 teacher API。 --- ## 6. 推荐目录结构 把实验放在独立目录,例如: `experiments/tiny_nla/` 建议文件: - `extract_activations.py` - `generate_teacher_labels.py` - `train_ar.py` - `train_av.py` - `eval_roundtrip.py` - `infer_tiny_nla.py` - `sidecar.py` - `README.md` Artifacts 放到: - `artifacts/tiny_nla/...` 如果 artifacts 目录未被 gitignore,先加入 gitignore。不要提交模型权重或数据。 --- ## 7. Stage 0:环境与注入 smoke 先写并运行 smoke,不要直接训练。 必须做: 1. 加载 `Qwen/Qwen3-0.6B-Base` 2. 读取真实: - `num_hidden_layers` - `hidden_size` - vocab size 3. 计算: - `layer_index = round(num_hidden_layers * 2 / 3)` 4. 对几条文本跑: - `output_hidden_states=True` - 取 selected layer 的最后 token 或多个 token activation 5. 统计 activation L2 norm: - mean - p50 - p90 - max 6. 选择 `injection_scale`: - 初始用 p50 或 mean - 写入 sidecar 7. 选择 injection char: - 必须是 tokenizer 下单 token - 例如先测试 `㈎`,不行就找其他 rare single token 8. 构造 prompt template: - `{injection_char}` - 要求输出 `...` 9. 使用 `input_embeds` 替换 injection token embedding,跑一次 forward/generation。 Stage 0 没过,不准训练。 --- ## 8. Stage 1:AR SFT AR 输入 explanation text,输出 activation vector。 实现要求: - 初版可以用 `Qwen/Qwen3-0.6B-Base` 或 instruct trunk - 优先冻结大部分模型,只训练轻量 head 或 LoRA + head - AR head: `Linear(d_model, d_model)` - 取最后一个 token hidden state 过 head - pred 和 gold 都 normalize 后算 MSE - 训练集/验证集拆分固定 seed 必须评估: - val cosine mean - val normalized MSE - mean-vector baseline - shuffled-label baseline - 至少保存 best checkpoint 如果 AR 不明显超过 baseline: - 尝试至少两项修正: - 改 learning rate - 改 batch size - 改是否训练 LoRA - 清洗 teacher explanation - 增加数据量 - 仍失败再报告,但不要编造成功。 --- ## 9. Stage 2:AV SFT AV 输入 activation vector 注入 prompt,输出 teacher explanation。 实现要求: - 初始权重优先 `Qwen/Qwen3-0.6B` instruct - 使用 LoRA,避免全量微调 - 通过 `input_embeds` 注入 selected layer activation - loss 只算 explanation response token,不算 prompt token - prompt template 和 injection 参数全部从 sidecar 读取 - 输出中文为目标,不是 bug 训练约束: - Apple M4 Pro 本地机,不要追求大 batch - CPU 慢就降低数据量与 epoch - MPS 可用才用 MPS;MPS 出现反向/dtype 问题立即退回 CPU - 不要使用 fp16 反向作为默认;优先 fp32/bf16 smoke 后再决定 必须评估: - held-out 20 条 worked examples - 每条包含: - context - token text / token index - selected layer - final top-k - teacher explanation - AV generated explanation - AR reconstruction cosine/MSE(如果 AR 可用) - 简短人工判断:相关 / 部分相关 / 不相关 如果 AV 输出乱码、空、完全模板化: - 不准交付 - 必须调整 teacher prompt、训练模板、learning rate、epoch、或数据清洗后重训 --- ## 10. Stage 3:RL 明确跳过 本机是 Apple M4 Pro 本地 CPU/MPS 环境,默认跳过 RL。 不要实现 GRPO。 不要安装 Miles/SGLang。 不要声称完成 RL。 最终报告中写: “由于本任务硬件为 Apple M4 Pro 本地 CPU/MPS,无 CUDA 多 GPU,RL/GRPO 阶段按任务约束跳过。本次交付 SFT Tiny-NLA。” --- ## 11. sidecar 契约 必须生成 `nla_meta.yaml`,至少包含: ```yaml kind: tiny_nla_model base_model: Qwen/Qwen3-0.6B-Base av_init_model: Qwen/Qwen3-0.6B layer_index: num_hidden_layers: d_model: activation_source: residual_stream token_position_policy: selected_token_or_last_token extraction: injection_scale: mse_normalization: l2_direction tokens: injection_char: "" injection_token_id: prompt_templates: av: | ... ar: | ... training: device: cpu_or_mps dtype: fp32_or_bf16 dataset_size: teacher: claude_or_local_qwen_instruct created_at: ``` 推理脚本必须读 sidecar,不要把这些值散落在代码里。 --- ## 12. 最终报告格式 最终报告必须包含: 1. 是否完成 DoD 2. 环境报告 3. 数据生成策略与 teacher 来源 4. 模型与层选择 5. injection token 与 scale 统计 6. AR 指标与 baseline 对比 7. AV 训练设置与质量总结 8. 20 条 worked examples 文件路径 9. checkpoint / adapter 路径 10. 推理脚本用法 11. 已知局限 12. 下一步建议 不要只说“训练完成”。必须给路径、命令、指标、样例。 --- ## 13. 阻塞时如何退出 只有以下情况允许未完成 DoD 而退出: - Qwen3-0.6B 权重无法下载或加载,且重试后失败 - 本机内存不足,连 Stage 0 smoke 都无法完成 - tokenizer 找不到合适 single-token injection char,尝试多个候选后失败 - PyTorch/transformers 在本机无法完成最小 forward/backward,且已给出错误日志 - 数据 teacher 完全不可用,且本地 instruct 也无法加载 阻塞报告必须包含: - 卡在哪个 stage - 已尝试哪些修复 - 完整错误摘要 - 下一步需要用户提供什么 否则继续工作,直到满足 Definition of Done。 ```