File size: 2,601 Bytes
e2492ec
71dabc7
f8d2531
71dabc7
dd18e84
71dabc7
dd18e84
71dabc7
f8d2531
 
 
e2492ec
f8d2531
 
 
 
e2492ec
71dabc7
f8d2531
71dabc7
dd18e84
71dabc7
dd18e84
 
 
71dabc7
dd18e84
 
71dabc7
dd18e84
 
71dabc7
 
dd18e84
71dabc7
 
dd18e84
f8d2531
 
 
 
 
 
 
 
 
71dabc7
 
f8d2531
 
71dabc7
dd18e84
71dabc7
f8d2531
71dabc7
dd18e84
f8d2531
71dabc7
 
dd18e84
f8d2531
 
 
71dabc7
f8d2531
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
# laya-ad v2.2 代码

单模型四头结构(二分类 + 7 类 kind + scope + severity)的加载、推理与训练代码。模型权重在仓库根目录的精度子目录:`fp32/`、`fp16/`、`bf16/`、`fp8/`、`int8/`、`int4/`。

## 文件

| 文件 | 说明 |
|---|---|
| `scripts/dual_head_model.py` | `DualHeadModernBert` 四头结构 + `load_dual_head_any()`(自动识别 fp32/fp16/bf16/fp8/int8/int4) |
| `scripts/predict_dual_head.py` | CLI 推理:输出 is_ad / kind / scope / severity |
| `scripts/train_multi_head.py` | 四头训练(含 `--freeze_encoder --freeze_binary --freeze_kind --ad_only` 头级微调) |
| `scripts/build_optimized_dataset.py` | 合并/去重/广告过采样/稀有 kind/severity 补齐(`--gmeow` 接入 gmeow 封禁广告语料,`--gmeow_val_texts` 留出防泄漏 val) |
| `scripts/build_teacher_dataset.py` | teacher 清洗数据切分 |
| `scripts/build_cleaned_dataset.py` | teacher 原始输出转训练格式 |
| `scripts/clean_with_teacher.py` | jev teacher 清洗脚本(参考) |
| `scripts/eval_4head_variants.py` | 六精度变体评测 |
| `scripts/eval_v22_vs_v21.py` | 跨版本对比评测(teacher_holdout / earlier_val / gmeow_val128) |

旧的 v1.1/v2 脚本仍保留在 `scripts/` 中,供历史参考。

## 加载

```python
import sys, torch
from transformers import AutoTokenizer

sys.path.insert(0, "code/scripts")
from dual_head_model import load_dual_head_any

tok = AutoTokenizer.from_pretrained("bf16")
model = load_dual_head_any("bf16", device="cpu", dtype=torch.bfloat16)
```

## 推理

```bash
cd code/scripts
python predict_dual_head.py --model ../../bf16 --text "日入500+,宝妈学生均可,私聊领教程"
```

输出字段:

```json
{"is_ad": true, "p_ad": 0.9999, "kind": "scam", "kind_probs": {...},
 "scope": "message", "scope_probs": {...},
 "severity_score": 2.96, "severity_probs": {...}}
```

- `scope`:account / message
- `severity_score`:0–3 的期望值(服务端 Jev API 同口径)

## 数据格式(训练脚本参考)

四头训练数据:

```json
{"text": "...", "label_bin": 0, "label_kind": 5, "label_scope": 0, "label_sev": 3}
```

- `label_bin`:0=ad,1=normal
- `label_kind`:0..6(crypto/gambling/porn/porn_bait/promo/scam/spam_flood)或 -100
- `label_scope`:0=account,1=message,-100 忽略
- `label_sev`:0..3,-100 忽略(normal 的 scope/severity 由二分类 gate 处理)

`build_optimized_dataset.py` / `clean_with_teacher.py` 的输入路径是内部数据布局,公开仓库只保留脚本作为方法参考,不附带数据。