File size: 12,541 Bytes
9d0d4e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394

下面是更完整版,可直接丢给训练 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:
   - `<concept>{injection_char}</concept>`
   - 要求输出 `<explanation>...</explanation>`
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: <int>
num_hidden_layers: <int>
d_model: <int>
activation_source: residual_stream
token_position_policy: selected_token_or_last_token
extraction:
  injection_scale: <float>
  mse_normalization: l2_direction
tokens:
  injection_char: "<char>"
  injection_token_id: <int>
prompt_templates:
  av: |
    ...
  ar: |
    ...
training:
  device: cpu_or_mps
  dtype: fp32_or_bf16
  dataset_size: <int>
  teacher: claude_or_local_qwen_instruct
  created_at: <timestamp>
```

推理脚本必须读 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。
```