解耦架构 · 调控 + 新建 双子系统

# 新建广告 · 新建创意 · 架构设计

项目代号 auto_put_ad_mini
plan v2 · 2026-06-05

现有"调控子系统"做减法 — 关停 / 调价 / 扩量;新增"新建子系统"做加法 — 建广告 / 挂创意。两者共享数据 + 平台 API + 基础知识,但各自的脑子 (skill + prompt)独立,避免互相污染。

本文档展示 6 张图:① 三层架构(共享 infra · 双子系统 · 关联点) · ② 数据契约流向 · ③ 关联点放大图 · ④ 模块 A/B 内部流水线 · ⑤ 决策框架 L1/L2/L3 · ⑥ 实施甘特图。配色:`cream` 为共享 infra,`navy` 既有调控,`terracotta` 新建子系统,`gold` 跨系统关联点。

关键约束 · 一账一人群包(2026-06-05 锁定)
一个账户固定一个 `custom_audience`(人群包),即使有多个广告也不变。这意味着 audience 不参与广告差异化,跨 tier 测试通过跨账户实现。单账户内唯一性差异化维度退化为 `site_set × age × geo` 三维,可建 `4×4×4 = 64` 种 unique 组合,起步 5-15 条远未饱和。账户与人群包映射由 `ACCOUNT_AUDIENCE_PACK_MAPPING[account_id]` 在配置中预设,LLM 不参与选择。

## 图一 · 三层架构总览

共享 infra(数据 / API / 基础 skill)
调控子系统(现有 · 不动)
新建子系统(全新)
跨系统关联点(单向 · 最小)
数据流(共享 → 子系统)
关联流(单向只读)

## 图二 · 数据契约 — 文件级数据流

两个子系统通过文件系统通信,**互不调用对方 API**。所有产物文件都在 `outputs/` 下,可单独审计。共享只读输入由调控子系统在 02:00 写出 → 新建子系统在 02:30 读入。

## 图三 · 模块 A 广告新建 · 内部流水线

## 图四 · 模块 B 创意新建 · 内部流水线

## 图五 · 决策框架:代码 vs 知识 三层分工

两个子系统都遵循同一套三层分工 — L1 候选标记代码(确定性 · 可单测)/ L2 LLM skill(启发式 · 灰色地带)/ L3 兜底护栏代码(确定性 · 边界)。这是分离架构的核心:**skill 不是简单等于一段话,是 LLM 的推理框架,各子系统必须独立**。

## 图六 · 关联点放大 — 时序图

## 图七 · 实施甘特图(10 阶段)

阶 | 名称 | 内容 | 关键产出 | 类别
--- | --- | --- | --- | ---
a | 共享 infra 抽取 | im_approval.py 抽 FeishuApprovalBase · execution_engine 抽公共部分 · config.py 拆 [SHARED]/[ADJUSTMENT]/[CREATION] 三段 | FeishuApprovalBase · config 重排 | 共享
b | 适配层 stub | 5 个适配模块接口签名:audience_demand · material_recall · dedup_check · uniqueness_check · creation_history | 5 个新文件 + 单测 | 新建
c | 模块 A 内核 | ad_creation.py 真实化:唯一性预校验 + 出价基准三层 + 命名 + ad_api.ad_create() 调用 | tools/ad_creation.py | 新建
d | 模块 B 内核 | creative_creation.py 真实化:三路召回(history 路先做)+ AI 改写(light)+ 渐进式控制 + ad_api.creative_create() | tools/creative_creation.py | 新建
e | 新建 Agent 框架 | prompts/system_creation.prompt + skills/creation_strategy.md + creation_decision.py 候选标记 + 工具白名单 | prompt + skill + L1 标记代码 | 新建
f | 新建子系统入口 | execute_creation_once.py 完整流水线:关联点过滤 → Agent → 决策落地 → 审批发送 | execute_creation_once.py | 新建
g | 飞书审批扩展 | FeishuCreationApproval 子类 · 新 chat_id 配置 · 新 APPROVAL_COLUMNS | tools/im_approval.py 重构 | 共享
h | 执行 dispatch | execution_engine 加 _execute_create_ad() · _execute_add_creative()(新建独占) | execution_engine 新分支 | 新建
i | 端到端 + 关联点验证 | execution_enabled=true · 单一测试账户跑 · 验证唯一性 / 创意数 / 关联点过滤 / 调控不受影响 | 回归测试 + 手工 checklist | 验证
j | K8s + 文档 | k8s/cronjob_creation.yaml · 更新 CLAUDE.md · 监控告警 | cronjob 上线 · 稳定跑 1 周 | 交付

### 阶段甘特(相对工作量,水平比例示意)

阶 a
a · 抽 infra
阶 b
b · stub
阶 c
c · 模块 A
阶 d
d · 模块 B
阶 e
e · Agent 框架
阶 f
f · 子系统入口
阶 g
g · 飞书
阶 h
h · execute
阶 i
i · e2e 验证
阶 j
j · K8s + 文档
共享 infra 改动(影响调控,需回归)
新建子系统独占改动
验证 / 交付

## 设计原则速查

代码 vs 知识 分离 | 工具 / 数据(代码)是确定性的,复用零风险;Skill(LLM 推理框架)是启发式的,共用会污染。Q5/Q6 改方向的核心理由。
分离但不盲 | 两个子系统通过文件系统通信,**最小耦合**:新建启动只读调控当日 latest_decisions 黑名单,避免给即将 pause 的广告补创意。
L1 / L2 / L3 三层分工 | L1 候选标记(代码,可单测)/ L2 LLM skill(启发式)/ L3 兜底护栏(代码,边界)。两子系统共用这套分工模式。
YAGNI 严格执行 | 本期不做 reshuffle / 重度 AI 改写 / 跨账户素材 / 调控读新建 / 联合审批 / 学习期细粒度保护。接口预留,实现等下期。
深度思考补全(全启用) | tier 级护栏 · 渐进式挂创意(≤5/次)· 7 日累计上限 · 出价基准三层降级 · 关联点过滤 · confidence 量纲校准。
回滚边界清晰 | 新建子系统失败 → 删 execute_creation_once.py 即可;CREATION_ENABLED=False 总开关;调控完全不受影响。