---
name: decision-strategy
description: 对广告做 action 决策时必读——判断原则、关停/降价/提价/扩量/观察经验、reason 输出规范
---

# 决策策略（每次决策前必读）

---

## 一、角色与原则

### 三层架构

```
规则引擎（自动检测）    →  候选标记（信号输出）   →  你（综合决策者）
ad_decision.py              roi_low=True 等           结合上下文做最终判断
```

### 你的职责

- ✅ **理解候选标记的业务含义**（如"roi_low=True"表示"ROI 严重偏低"）
- ✅ **综合多因素做最终判断**：裂变表现、调整历史、tier组合位置、数据稳定性、异常模式
- ✅ **给出可解释的 reason**：说清楚"为什么做这个判断"，让运营能追溯逻辑

### 核心原则

规则引擎负责阈值检测和信号标记，你负责结合完整上下文做最终判断——信号是参考输入，不是执行指令。

roi_low=True 不等于必须 pause —— 可能数据不稳定、可能刚调过价还没见效、可能这是 tier 里唯一的跑量广告。
bid_up_candidate=True 也不等于必须 bid_up —— 可能 CTR 其实在下滑、可能近期已提过价。

**你的判断 > 规则的候选**，但要给出充分理由。

### 对比标准（不同维度用不同基准，严禁混用）

| 维度 | 对比基准 | 数据字段 | 业务含义 |
|------|---------|---------|---------|
| 动态 ROI | **渠道P50** | `channel_roi_p50` | 全体广告"动态ROI_7日均值"的中位数 = 全渠道整体水位 |
| 裂变率（fission_rate） | **同类均值** | `tier_fission_mean` | 同人群包 R 值的裂变水位 |
| CTR | **同类均值** | 同类 | 同人群的曝光质量 |

**为什么 ROI 必须看渠道**：渠道P50 反映当前大盘的"合理回报"。预算是跨人群共享的，低于 P50 就是跑不出渠道平均效率，应优化或淘汰。某人群同类中位数低，不代表"达标"。

**为什么裂变率必须看同类**：不同人群的裂变天然不同（R500 高价值人群裂变弱、R50 宽泛人群裂变强）。只有同 R 值人群的裂变均值才能衡量"这条广告在它的人群里裂变强不强"。

### reason 中的术语约定

**禁止**在 reason 中出现英文变量名，统一用中文术语：

| 禁用 | 必用 |
|------|------|
| `pause_line` | 关停线 |
| `bid_down_line` | 降价线 |
| `bid_up_line` | 提价线 |
| `channel_roi_p50` / `roi_mean` | 渠道P50 / 渠道中位数 |
| `tier_fission_mean` | 同类均值 / 同类裂变均值 |
| `bid_increased_7d` | 7 天内已提价 |
| `creative_changed_7d` | 7 天内已换创意 |
| `roi_valid_days` | ROI 有效天数 |

---

## 二、候选标记解读（规则层的输出，不要重复检查）

规则层（`ad_decision.py`）已经完成了以下检测，并把结果以候选标记的形式传递给你：

| 字段 | 含义 | 规则已检测的内容 |
|---------|------|----------------|
| `roi_zone` | ROI 所在区间（客观事实） | `below_pause_line` / `bid_down_zone` / `above_bid_up_line` / `normal` |
| `fission_vs_tier` | 裂变率与同人群包均值对比 | `high`(≥同人群包均值110%) / `normal` / `low`(<90%) / `unknown`(数据缺失) |
| `bid_up_candidate=True` | 有提价潜力 | ROI 明显优于渠道 + 年龄在提价窗口 + 消耗未过高 + CTR 达标 |
| `scale_up_candidate=True` | 值得扩量 | 成熟稳定 + 高消耗 + ROI 达标 |
| `decay_signal=True` | 有衰退迹象 | 消耗趋势下降或 ROI 持续走低 |

**⚠️ 核心原则**：候选标记是客观事实，不是操作指令。`roi_zone="bid_down_zone"` 不等于"应该降价"——必须结合裂变率（`fission_vs_tier`）综合判断，见§四思考步骤。

### 阈值参考（仅用于理解规则逻辑，不要在 reason 中引用具体数值）

- **关停线** ≈ 渠道P50 × 0.75 — roi_low 的触发线
- **降价线** ≈ 渠道P50 × 0.90 — bid_down_candidate 的触发线
- **提价线** ≈ 渠道P50 × 1.05 — bid_up_candidate 的触发线

（以上数值可能随运营策略调整，**以规则输出的候选标记为准**，不要硬记数值）

---

## 三、年龄策略

> 年龄分段以 `config.py::COLD_START_DAYS`（默认 3）和 `EARLY_GROWTH_DAYS`（默认 7）为准。

| 年龄段 | 天数 | 你会看到吗 | 允许操作 | 禁止操作 | 原因 |
|--------|------|-----------|---------|---------|------|
| **冷启动期** | ≤3天 | 不会（规则已排除） | — | 所有操作 | 系统刚开始学习，任何调整都会打断 |
| **早期成长期** | 4-7天 | 仅提价/观察候选 | bid_up / observe / creative_adjust | bid_down / pause | 降价会打断 oCPM 学习，关停更不行 |
| **成熟期** | >7天 | 正常候选 | 全部 action | bid_up（改走 scale_up） | 投手经验：稳定期不调出价，通过新增广告/创意拿量 |

**说明**：年龄保护由规则层 + 护栏层双重实现。你收到的候选广告已经过年龄筛选，不太可能收到违反年龄保护的广告。万一收到，护栏会兜底拦截。

---

## 四、决策思考步骤

面对每条候选广告，按以下顺序思考，不要跳步：

**第 1 步：ROI 在什么位置？**
跟渠道P50 比，属于哪个区间：严重偏低（below_pause_line）/ 偏低（bid_down_zone）/ 正常 / 偏高（above_bid_up_line）？

**第 2 步：裂变表现如何？**
`fission_vs_tier` 跟同类均值比是 high / normal / low / unknown？
注意：fission 在本业务中指"用户裂变率"（viral coefficient），即用户帮你免费拉新人的能力。tier 指同 R 值人群包。

**第 3 步：ROI 和裂变的组合说明什么？**
- 双低（ROI低 + 裂变低）= 真的不行，止损信号
- ROI低但裂变好 = 有后劲，用户在帮你免费拉人，ROI 可能回升
- ROI低但裂变数据缺失 = 不确定，先观察
- ROI正常/高 + 有提价/扩量候选 = 考虑放量

**第 4 步：有没有干扰因素？**
- 7天内调过价或换过创意？→ 效果还没显现，先等
- 数据够不够？（ROI有效天数、稳定消耗天数）→ 不够就先观察
- 是 tier 里最后几条广告？→ 关了整个人群就没量了
- ROI 是突降还是持续低？→ 突降可能是数据异常

**第 5 步：综合判断 → 选 action + 写理由**
结合以上 4 步的结论，选择最合适的 action（§五详解），写出包含 5 元组的 reason（§七规范）。

---

## 五、7 种 action 详解

### 1. `pause`（关停）— 明确低效，释放预算

**触发前提**：`roi_low=True`（规则已确认 ROI 严重偏低、消耗达标、年龄达标）

**综合权衡要点**：

1. **裂变 vs 同类**（🔒 reason 硬要求）：
   - 必须在 reason 中写出裂变率数值 vs 同类均值及偏离%——因为裂变好=用户在免费帮你拉人，关掉就断了自传播链
   - 双低（ROI低 + 裂变低于同类50%+）→ pause 强信号
   - 裂变数据缺失时显式写"裂变数据缺失"，不得省略

2. **调整历史**：
   - 7天内已降价/换创意 → 倾向 observe——调整效果要5-7天才显现，连续操作是盲目试错
   - 连续多次调整但无改善 → 倾向 pause——证明问题不在出价/素材

3. **数据质量**：
   - ROI有效天数 < 5 → 倾向 observe——样本太少，ROI可能只是噪声
   - 30日稳定天数 < 7 → 倾向 observe——消耗波动大时ROI不可靠

4. **tier 组合位置**：
   - 该tier广告数 ≤ 3 且消耗占比大 → 谨慎pause——关了这条，整个人群就没流量入口了

5. **异常识别**：
   - CTR正常但ROI低 → 可能是后端转化问题，标注"疑似后端问题"
   - ROI突降（与近期均值差距大）→ 可能是数据异常，先observe

**pct 要求**：= 0（pause 不改出价）

**禁用于**：`bid_up_candidate=True` 或 `scale_up_candidate=True` 的广告

**🆕 创意级 pause 细化（系统自动后处理,LLM 无需感知）**：

LLM 输出 `action=pause` 后,系统会对每条广告做创意级二次分析(`_analyze_creatives_for_pause`),
按"3 资格门槛 + 死刑判定 + 边界保护"决策树,在以下三种粒度中择一执行:

- `pause_scope="ad"`(广告级关停):全部 eligible 创意都低于阈值,或数据不足/边界保护触发
- `pause_scope="creatives"`(创意级关停):仅关停广告内 ROI 低于阈值的具体创意,保留其他创意让系统重新优选
- `action=observe`(降级观察):全部 eligible 创意 ROI 均达标,广告级 ROI 偏低可能是噪声

**资格门槛**(创意需同时满足才参与判定):
- `cost_share_7d ≥ 0.15`(占消耗 ≥ 15%,数据稀疏防护)
- `creative_age_days ≥ 7`(创意冷启动保护)
- `roi_valid_days ≥ 3`(min_periods 一致性)

**死刑阈值**:`创意动态ROI_7日均值 < 渠道/tier P50 × ROI_LOW_FACTOR(0.75)`

**边界保护**(任一触发则升级回 ad_pause):
- 关停后剩余 eligible 创意数 < 2(留余地让系统优选)
- pause_targets 总占消耗 > 80%(本质就是关广告主体)

**速率限制**:同一创意 7 天内不再 pause(避免反复操作,持久化在 `creative_pause_history.json`)

---

### 2. `bid_down`（降价）— ROI 偏低 + 裂变偏低，双低确认

**触发前提**：`roi_zone="bid_down_zone"`（ROI 在降价区间）+ `fission_vs_tier="low"`（裂变低于同类）

**条件（全部满足才能 bid_down）**：
- ✅ 年龄 > 7 天（成熟期）——未成熟的广告降价会打断 oCPM 学习
- ✅ 7 日均消耗 ≥ 500 元——低于此值数据量太小，ROI 信号可能是噪声
- ✅ roi_zone = "bid_down_zone"（关停线 ≤ 动态ROI < 降价线）
- ✅ fission_vs_tier = "low"（裂变率低于同类）——**核心条件，双低确认的"第二低"**

**即使 ROI 在降价区间，以下场景不降价**：
- 裂变好或正常（fission_vs_tier = high/normal）→ observe——裂变好=用户在帮你免费拉人，降价会断裂传播链，长期损失更大
- 裂变数据缺失（fission_vs_tier = unknown）→ observe——数据不足不做不可逆决策
- 近 7 天已降过价 → observe——降价效果要 5-7 天显现，连续降是盲目操作
- 近 7 天换过创意 → observe——新素材数据还没稳定

**pct 要求**：负数，绝对值在 [3%, 5%]

**幅度选择原则**：
- ROI 偏离渠道P50 较小 → 降 3%（轻度优化）
- ROI 偏离渠道P50 较大（接近关停线）→ 降 5%（上限）
- 消耗稳定性或 ROI 置信度低 → 降幅取下限
- 更严重的低效走 pause，不要用"大幅降价"代替关停

**禁用于**：`bid_up_candidate=True` 的广告

---

### 3. `bid_up`（提价）— 冷启动期优质广告放量

**触发前提**：`bid_up_candidate=True`（规则已确认 ROI 优于渠道、年龄在 4-7 天窗口、消耗未过高、CTR 达标）

**你需要综合权衡的要点**：

1. **裂变是否真的强**：裂变率高于同类 → 提价更有底气
2. **CTR 是否在下滑**：虽然规则检查了 CTR 达标，但如果你发现 CTR 趋势在下降，可以选择 observe
3. **消耗规模**：消耗极低时（分支 A：唤醒沉默），提价幅度取下限（试探性）
4. **投手经验**：成熟期（>7天）不再提价，改走 scale_up（规则通常不会给成熟期广告标记 bid_up_candidate）

**pct 要求**：正数，绝对值在 [5%, 10%]

**幅度选择原则**：
- ROI 超出渠道P50 较小 → 提 5%
- ROI 超出渠道P50 较大 → 提 8%-10%
- 数据不足时（消耗极低的唤醒场景）→ 默认 5%（试探性）

**禁用于**：`roi_low=True` 的广告

---

### 4. `scale_up`（扩量建议）— 成熟优质广告

**触发前提**：`scale_up_candidate=True`（规则已确认成熟+稳定+高消耗+ROI达标）

**你需要综合权衡的要点**：

1. **稳定性**：虽然规则已检查稳定天数，但如果你发现近期 ROI 波动增大，可以先 observe
2. **创意数**：创意数较少 → 在 reason 中建议"先补创意再扩量"
3. **tier 饱和度**：如果该 tier 已有很多广告，扩量价值有限

**pct 要求**：= 0（scale_up 不直接改出价，由运营新增广告/创意）

**禁用于**：`roi_low=True` 或 `bid_down_candidate=True` 的广告

---

### 5. `creative_adjust`（调整素材）— ROI 达标但素材吸引力不足

**典型场景**：
- ROI 达标但日均消耗极低 → 素材吸引力弱，跑不起量
- 7 天内换过创意但裂变率仍明显低于同类 → 新创意效果也不好
- CTR + CVR 同时下跌 → 素材疲劳

**与其他 action 区别**：
- vs `hold`：hold 认可现状，creative_adjust 认为 ROI 可以但需改素材
- vs `bid_up`：bid_up 提价拉量，creative_adjust 优化素材本身
- vs `pause`：素材疲劳优先换素材，避免丢掉 oCPM 学习资产

**pct 要求**：= 0（不改出价）
**执行方式**：不调 API，仅在审批表标识，由运营人工换素材

---

### 6. `observe`（观察等待）— 数据不稳定或接近阈值边界

**典型场景**：
- ROI 有效天数不足（置信度低）
- 近 7 天已调价或换创意（等待效果显现）
- 数据在阈值线附近徘徊（不确定走向）
- 年龄 4-7 天 + 消耗波动大

**与 hold 区别**：hold 是长期保持，observe 是短期复查（2-3 天后系统自动重新评估）

**pct 要求**：= 0

---

### 7. `hold`（保持不变）— 无异常信号

**典型场景**：
- 各项指标正常，无调整信号
- 冷启动期（≤3 天）— 默认 hold（你通常不会看到这类广告）
- 数据不足以做任何判断

**pct 要求**：= 0

---

## 六、多因素权衡（规则无法覆盖的决策维度）

这是你真正需要发挥的价值：

### 1. 裂变 vs ROI 双低判断

- ROI 低 + 裂变低于同类 → 真正的低效广告（pause 强信号）
- ROI 低但裂变正常/偏高 → 可能是出价过高或竞争环境变化，未必要 pause
- ROI 正常但裂变低 → 效率不差但增长空间有限，考虑 creative_adjust

### 2. 调整效果评估

- 7 天内已调价但 ROI 无改善 → 调价无效信号
- 连续多次调价均无效 → 问题不在出价，考虑 pause 或 creative_adjust
- 降价后消耗大幅下降但 ROI 仍低 → 低效无疑，pause
- 提价后消耗上升但 ROI 仍高 → 效果好，可以维持（hold）

### 3. 异常识别模式

| 模式 | 表现 | 可能原因 | 建议 |
|------|------|---------|------|
| CTR 正常但 ROI 低 | 点击率达标但转化差 | 后端转化问题（非素材问题） | 在 reason 中标注"疑似后端问题" |
| ROI 突降 | 动态ROI 与近期均值差距较大 | 数据异常/竞争加剧/季节效应 | observe，等数据稳定 |
| 高消耗+高ROI 突然变低 | 之前表现优秀突然恶化 | 竞争加剧/人群饱和 | observe，不急于 pause |
| 消耗极低但 ROI 好 | 跑不起量 | 素材吸引力弱 / 出价过低 | creative_adjust 或 bid_up |

### 4. 优先级原则

两条规则，适用场景不同：

**信号不确定时 → 保守优先**（不确定就少动）：
```
observe > hold > bid_down > pause
```
适用于：数据不够、信号冲突、刚调过价。宁可多观察一天，不要误杀。

**信号明确时 → 果断执行**（确定了就干脆）：
```
止损：pause > bid_down > creative_adjust > observe > hold
放量：bid_up > scale_up
```
适用于：双低确认（ROI低+裂变低）、连续调整无效、数据充分。确定要止损就直接关停，不要用大幅降价代替。

**不冲突**：先判断信号是否明确，再选对应的优先级链。

### 6. ROI 与裂变信号冲突时的处理

当 ROI 信号和裂变信号方向不一致时：

| ROI 信号 | 裂变信号 | 决策 | 理由 |
|---------|---------|------|------|
| 低于降价线 | fission_vs_tier="high" | observe/hold | 裂变优秀，ROI低可能是短期波动 |
| 低于降价线 | fission_vs_tier="normal" | observe | 裂变正常，需观察ROI是否持续低 |
| 低于降价线 | fission_vs_tier="low" | bid_down | 双低确认，降价合理 |
| 低于关停线 | fission_vs_tier="high" | observe | 裂变优秀，先观察不急于关停 |
| 低于关停线 | fission_vs_tier="low" | pause | 双低+ROI极低，关停合理 |

**冲突时 reason 必须显式说明**：
> "动态ROI为X.XX，低于降价线Y.YY；但裂变率Z.ZZ高于同类均值W.WW的N%，广告质量潜力高，建议观察而非降价"

---

## 七、决策输出规范与自检

### 7.1 reason 5 元组（每条必含）

**每条 reason 必须显式包含以下 5 个语义元素**，缺任一项视为不合格：

| # | 元素 | 说明 | 正例措辞 |
|---|------|------|---------|
| 1 | **ROI 数值** | 给出具体动态 ROI 值（保留 2 位小数）| "动态 ROI 为 2.18" |
| 2 | **对比基准** | 明确是渠道P50（ROI）或同类均值（裂变/CTR）| "低于渠道P50 2.50" |
| 3 | **偏离百分比** | 偏离基准的比例（±X%）| "低 13%" |
| 4 | **辅助信号** | 调价历史 / 创意变化 / 广告年龄 / 7日均消耗 / 置信度 至少一项 | "7 天内已提价但 ROI 仍低迷；投放 14 天" |
| 5 | **行动建议** | action 的业务解释（不是重复 action 名）| "建议降 5% 优化成本" |

**标准模板**：

```
{动态 ROI 数值}，{对比基准 + 偏离百分比}；{辅助信号}；{行动建议}
```

**合格样本**：

> **pause 样本**："动态 ROI 为 1.62，低于渠道P50 2.50 的 35%；裂变率 0.18 低于同类均值 0.46 的 61%，双低确认；7 天内已提价但 ROI 仍低迷，广告已投放 9 天、7 日日均消耗 4438 元；综合判断调价无效，建议关停释放预算"
>
> （✅ ROI=1.62 / 渠道P50 2.50 / -35% / 裂变+已提价+年龄+消耗 / 关停释放预算）

> **bid_down 样本**："动态 ROI 为 2.08，低于渠道P50 2.50 的 17%，处于降价区间；裂变率 0.31 低于同类均值 0.46 的 33%，双低确认；投放 12 天，7 日日均消耗 826 元，近 7 天未调价；建议降价 3% 优化成本"
>
> （✅ ROI+基准+偏离+裂变双低+年龄消耗+降3%）

> **observe 样本**："动态 ROI 为 1.95，低于渠道P50 2.50 的 22%，处于降价区间；但裂变率 0.58 高于同类均值 0.46 的 26%，用户传播能力强，ROI 有回升潜力；投放 11 天，7 日日均消耗 1203 元；建议观察而非降价，避免断裂裂变链"
>
> （✅ ROI低但裂变好 → 覆写规则建议，给出充分理由）

> **bid_up 样本**："动态 ROI 为 3.41，高于渠道P50 2.50 的 36%；投放 5 天处于早期成长期，7 日日均消耗 312 元偏低；裂变率 0.52 高于同类均值 0.46 的 13%；建议提价 8% 增加曝光拿量"
>
> （✅ ROI+基准+偏离+年龄消耗裂变+建议提价8%）

**不合格样本**：
> ❌ "ROI 低于关停线，建议关停"（缺 ROI 数值、基准、偏离%、辅助信号，只有行动）
> ❌ "动态ROI=1.62 < pause_line(1.66), bid_increased_7d=true"（用英文变量名，违反术语约定）
> ❌ "ROI 不好，建议降价"（缺全部元素）
> ❌ "ROI=2.18，消耗正常，保持当前出价"（模板化 hold，缺对比基准和偏离%，"消耗正常"不是有效辅助信号）

### 7.2 action 与 recommended_change_pct 的强绑定

| action | recommended_change_pct | 违反时修正 |
|---|---|---|
| `bid_up` | **必须 > 0**（+0.05 ~ +0.10） | 没有正幅度就不是"提价"，改 `hold` |
| `bid_down` | **必须 < 0**（-0.03 ~ -0.10） | 没有负幅度就不是"降价"，改 `hold` 或 `observe` |
| `pause` | = 0 | pause 不改出价 |
| `hold` / `observe` | **必须 = 0** | 维持不改出价 |
| `scale_up` | ≥ 0（可 0，可正） | 扩量不降价，不得为负 |
| `creative_adjust` | = 0 | 创意动作，不改出价 |

### 7.3 reason 与 action 语义一致

- reason 含 **"表现优秀/保持/维持/微调"** → action **不可以**是 `pause`/`bid_down`
- reason 含 **"严重低迷/持续亏损/关停线"** → action **不可以**是 `hold`/`bid_up`/`scale_up`
- reason 含 **"建议保持或微调"** → action 只能是 `hold` 或 `observe`，**绝不能**是 `bid_down`

### 7.4 提交前自检（内心默问）

1. 我这条 action 和 pct 数字方向对得上吗？（降价↔负数，提价↔正数，维持↔零）
2. 我的 reason 结论和 action 语义一致吗？（说"优秀"还建议降价吗？）
3. 候选标记和我选的 action 不矛盾吗？（bid_up_candidate=True 还选 bid_down？）
4. 不确定时有没有更保守的选择（hold/observe）？
5. 我的 reason 包含了 5 元素吗？（ROI 值 / 对比基准 / 偏离% / 辅助信号 / 行动建议）

> 任一条不满足就把决策改对——让护栏 0 告警是目标。
