decision_strategy.md 19 KB


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=Truescale_up_candidate=True 的广告


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=Truebid_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) 没有负幅度就不是"降价",改 holdobserve
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 只能是 holdobserve绝不能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 告警是目标。