# 作用域（5 棵树）—— 不放静态词表，实时定位

作用域是 5 棵分类树（不是固定 enum），节点上千且**不断生长**，所以这里**不放静态 JSON**——Phase2 实时定位到 DB 里的真实节点。

| scope_type | 中文 | 判别（带值时各给一个具体词） |
|---|---|---|
| `substance` | 实质 | 讲**什么**（题材 / 对象 / 内容实质），如 `赛道共识`、`脚本要素` |
| `form` | 形式 | **怎么呈现**（结构 / 体裁 / 表现手法），如 `三幕结构`、`分镜骨架` |
| `feeling` | 感受 | 勾**什么情绪**（读者/观众的情感反应），如 `羞耻感/冒犯`、`角色代入共鸣` |
| `effect` | 作用 | 起**什么表达功能**（在内容里干什么活），如 `撕裂共识`、`吸引点击` |
| `intent` | 意图 | 创作者**图什么**（最终目的），如 `引爆传播`、`提升打开率` |

## 定位（scope-link）怎么用

值要**定位到 5 棵树的现有节点**——对得上就复用原名（避免同义词污染树），对不上才保留为新值（顺带丰富树）。基建已落地：

```bash
# 候选值 + 树名 → 火山 embedding 余弦最近邻 top-K
python 创作知识提取-skill/tools/scope-link.py "撕裂共识" --type effect --top-k 5
```

- 命中 ≥ ~0.90 → 直接复用返回的 `name`（payload 的 scope value 写这个原名）。
- 0.75–0.90 → 看 top-K 里有没有真同义的，有就复用，没有就用自己的候选值（新值）。
- < 0.75 → 保留候选值为新值。

底层：`scripts/scope_link.py`（ScopeLinker）+ `core/embedding.py`（火山 Doubao-embedding-vision，2048 维）+ `scope_trees/`（1855 个 live 节点的本地向量缓存）。树更新后重跑 `scripts/dump_trees.py` + `scripts/embed_trees.py` 刷新缓存。

> `--type` 用英文 key（substance/form/feeling/effect/intent）或中文（实质/形式/感受/作用/意图）都行；底层按 source_type 中文名过滤。
