# auto_put_ad — 项目结构文档

> **定位**: 腾讯广告自动化投放多 Agent 协作系统
> **最后更新**: 2026-07-16

---

## 一、项目概述

`auto_put_ad` 是一个基于 Reson Agent 框架的多 Agent 广告投放系统，面向腾讯广告 Marketing API v3.0。系统由 **8 个专业 sub-agent** 组成，通过主 Agent 统一调度，覆盖预算/出价优化、受众定向、创意策略、监控告警、系统运维、数据分析等投放全链路。

### 当前成熟度

| Agent | 状态 | 说明 |
|-------|------|------|
| **main** | ✅ 就绪 | 任务分发中枢 |
| **budget** | ✅ 就绪 | 预算约束下的出价调整 |
| **execute** | ✅ 就绪 | 审批后执行 API 操作 |
| **audience** | 🟡 部分就绪 | 定向推荐可用，A/B 测试待实现 |
| **data_analyst** | 🟡 部分就绪 | 基础查询可用，深度分析待实现 |
| **creative** | 🔴 未就绪 | 创意策略框架已搭建 |
| **monitor** | 🔴 未就绪 | 监控规则已定义，实时检测待实现 |
| **system_ops** | 🔴 未就绪 | API 运维操作框架已搭建 |

> **与 auto_put_ad_mini 的关系**: `auto_put_ad_mini` 是本项目中「监控调控 Agent」角色的独立落地版本，实际已演进出更完整的决策 + 创建双业务线。本项目当前的核心可用链路是 **budget → execute** 出价调整。

---

## 二、目录结构

```
examples/auto_put_ad/
│
├── run.py                          # 🔵 分析入口：交互式 Agent CLI
├── run_execute.py                  # 🟢 执行入口：审批后执行 API 操作
├── config.py                       # 运行配置（3 套 RunConfig + 工具白名单）
├── task.prompt                     # 主 Agent 任务描述
├── presets.json                    # 8 个 sub-agent 预设定义
├── odps_module.py                  # ODPS（MaxCompute）数据仓库客户端
├── test_budget.py                  # 出价调整独立测试脚本
│
├── README.md                       # 项目概览
├── TODO.md                         # 任务追踪（P0/P1/P2）
├── BID_ADJUSTMENT_README.md        # 出价调整系统深度文档
├── EXECUTION_GUIDE.md              # 生产部署与执行指南
├── IMPLEMENTATION_SUMMARY.md       # 实现总结
│
├── configs/
│   └── budget_strategy_v1.json     # 策略配置（阈值/决策矩阵/出价边界/保护规则）
│
├── docs/
│   ├── budget_decision_framework.md    # 预算决策框架（scale_ratio、2×2 矩阵、保护机制）
│   ├── budget_strategy_detail.md       # 预算策略详解
│   └── 腾讯广告智能投放策略研究-参考.md    # 行业策略参考
│
├── prompts/                        # 各 Agent 系统提示词
│   ├── main.prompt                 # 主调度 Agent
│   ├── budget.prompt               # 预算/出价优化专家
│   ├── execute.prompt              # 执行 Agent
│   ├── audience.prompt             # 受众定向专家
│   ├── creative.prompt             # 创意/素材专家
│   ├── monitor.prompt              # 监控告警
│   └── system_ops.prompt           # API 运维操作
│
├── skills/                         # 领域知识（注入 Agent 上下文）
│   ├── ad_domain.md                # 腾讯广告 3.0 平台知识
│   ├── budget_strategy.md          # 预算/出价决策知识
│   ├── audience_strategy.md        # 受众定向策略
│   ├── creative_strategy.md        # 创意生命周期管理
│   └── monitor_rules.md            # 异常检测规则
│
└── tools/                          # 自定义工具（@tool 装饰器）
    ├── __init__.py
    ├── ad_api.py                   # 腾讯广告 API v3.0 封装（13 个工具）
    ├── data_query.py               # ODPS 数据查询（3 个工具）
    ├── budget_calc.py              # 出价计算引擎（6 个工具）
    ├── audience_tools.py           # 受众定向工具（2 个工具）
    ├── monitor_tools.py            # 监控工具（2 个工具）
    ├── execute_agent.py            # 执行编排（1 个工具）
    └── strategy_config.py          # 策略配置管理（3 个工具）
```

---

## 三、入口点与执行流程

### 3.1 两个入口

| 入口 | 文件 | 用途 | 模型 | 工具范围 |
|------|------|------|------|---------|
| **分析入口** | `run.py` | 交互式分析，制定出价调整方案 | `qwen/qwen3.5-plus-02-15` | ANALYSIS_TOOLS（只读+计算） |
| **执行入口** | `run_execute.py` | 读取已审批的方案，执行 API 操作 | `qwen/qwen3.5-plus-02-15` (temp=0.1) | EXECUTION_TOOLS（含写操作） |

### 3.2 分析流程（run.py）

```
用户输入："今天小程序预算 10 万"
        │
        ▼
┌──────────────────────────────────────┐
│  Main Agent (投放决策中枢)             │
│  System Prompt: prompts/main.prompt  │
│  Skills: ad_domain.md                │
│  Tools: ANALYSIS_TOOLS + agent tool  │
└──────────────────────────────────────┘
        │ 理解意图 → 分派 sub-agent
        ▼
┌──────────────────────────────────────┐
│  Budget Agent (预算出价Agent)          │
│  System Prompt: prompts/budget.prompt│
│  Skills: ad_domain, budget_strategy  │
│                                      │
│  7 步工作流：                          │
│  ① load_strategy_config()  加载策略配置│
│  ② get_account_summary()   拉 ODPS 数据│
│  ③ 战略判断（周末？促销？是否调阈值）     │
│  ④ compute_budget_thresholds() 分位数  │
│  ⑤ classify_ads()          2×2 分类   │
│  ⑥ compute_bid_adjustment() 出价方案   │
│  ⑦ 展示方案 → 等待用户确认              │
└──────────────────────────────────────┘
        │ 用户确认后
        ▼
  bid_adjustment_execute() → 批量 API 调用
        │
        ▼
  输出: outputs/adjustment_plan_YYYYMMDD_HHMMSS.xlsx
```

### 3.3 执行流程（run_execute.py）

```
用户输入："执行最新方案"
        │
        ▼
  自动发现 outputs/ 下最新的 Excel 方案文件
        │
        ▼
┌──────────────────────────────────────┐
│  Execute Agent (投放执行系统)           │
│  System Prompt: prompts/execute.prompt│
│  Skills: ad_domain, budget_strategy,  │
│          monitor_rules                │
│  Tools: EXECUTION_TOOLS               │
└──────────────────────────────────────┘
        │
        ▼
  execute_adjustment_plan():
    ① 加载方案（Excel → 决策列表）
    ② 验证：冷启动跳过 / 赔付保护 / 出价边界 / 15% 振幅上限
    ③ dry_run=True → 仅输出模拟报告
    ④ dry_run=False → 执行：
       a. 出价调整（increase/decrease）→ ad_update()
       b. 广告关停（close）→ ad_batch_update_status()
       c. 执行后监控 → monitor_check_metrics()
    ⑤ 输出执行报告
```

### 3.4 数据流架构

```
ODPS (MaxCompute)                    腾讯广告 API (api.e.qq.com/v3.0)
├── creative_detail                   ├── /adgroups/update
├── ad_put_tencent_ad                 ├── /adgroups/add
├── ad_put_tencent_creative_day       └── /dynamic_creatives/add
├── ad_put_tencent_creative_data_day
└── ad_put_tencent_account
        │                                      ▲
        ▼                                      │
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ data_query.py│ →  │ budget_calc  │ →  │  ad_api.py   │
│ (ODPS SQL)   │    │ (计算引擎)    │    │ (API 调用)    │
└──────────────┘    └──────────────┘    └──────────────┘
        │                   │
        ▼                   ▼
   pandas DataFrame    决策矩阵查找 → [action, ratio]
        效率分 = fission0_count / cost
        百分位阈值 (P70/P30 ROI, P50 消耗)
        2×2 分类 (ROI × 消耗)
```

---

## 四、核心架构设计

### 4.1 策略驱动架构

所有决策参数外置在 `configs/budget_strategy_v1.json`，LLM 可在运行时通过 `update_strategy_config()` 调整策略（如周末放宽 ROI 阈值），变更自动版本化管理：

```json
{
  "thresholds": {
    "roi_high_percentile": 0.70,
    "roi_low_percentile": 0.30,
    "cost_mid_percentile": 0.50,
    "valid_ad_min_open_count": 100
  },
  "decision_matrix": {
    "aggressive_scale_down": {
      "high_high": ["keep", 0.0],
      "mid_high": ["decrease", -0.10],
      "low_low":  ["close", 0.0]
    }
    // ... 5 种策略 × 6 个象限
  },
  "protection": {
    "cold_start": { "enabled": true, "hours": 48, "min_conversions": 6 },
    "compensation": { "enabled": true, "min_conversions": 6, "cpa_deviation": 0.20 }
  }
}
```

### 4.2 决策框架（5 步）

| 步骤 | 操作 | 产出 |
|------|------|------|
| ① **全局策略** | `scale_ratio = 今日预算 ÷ 昨日消耗` | aggressive_scale_down / moderate_scale_down / maintain / moderate_scale_up / aggressive_scale_up |
| ② **样本过滤** | 排除 `open_count < 100` 的广告 | 有效广告池 |
| ③ **分位数计算** | ROI P70/P30 + 消耗 P50 | 动态阈值（非固定值） |
| ④ **2×2 分类** | ROI 高/中/低 × 消耗 高/低 | 6 个象限 |
| ⑤ **矩阵查找** | 策略 × 象限 → [action, ratio] | keep / increase / decrease / close / observe |

### 4.3 保护机制（按优先级）

| 优先级 | 机制 | 规则 |
|--------|------|------|
| 🔴 最高 | 冷启动保护 | 创建 < 48h 或转化 < 6 → 强制 observe |
| 🟠 高 | 赔付保护 | 转化 3-5 次 → 改为 observe，等积累到 6 次申请赔付 |
| 🟡 中 | 出价边界 | 截断到 [10, 10000] 分 |
| 🟢 低 | 振幅上限 | 单次调整 ≤ 15%；超过需拆阶梯执行（间隔 ≥ 2h） |

### 4.4 Multi-Agent 协作

```
presets.json 定义了 8 个 sub-agent：

main ──分派──▶ budget     ← 当前可用
         ├──▶ audience    ← 部分可用
         ├──▶ creative    ← 未就绪
         ├──▶ system_ops  ← 未就绪
         ├──▶ monitor     ← 未就绪
         └──▶ data_analyst← 部分可用

execute ←── 独立入口，不通过 main 调度
```

---

## 五、工具清单

### ad_api.py — 腾讯广告 API 封装（13 个工具）

| 工具 | API 端点 | 说明 |
|------|---------|------|
| `ad_create` | POST /adgroups/add | 创建广告 |
| `ad_update` | POST /adgroups/update | 更新广告（出价/状态） |
| `ad_batch_update_status` | POST /adgroups/update (batch) | 批量更新广告状态 |
| `ad_get_list` | GET /adgroups/get | 查询广告列表 |
| `ad_get_report` | GET /daily_reports/get | 广告报表 |
| `creative_create` | POST /dynamic_creatives/add | 创建动态创意 |
| `creative_get_list` | GET /dynamic_creatives/get | 查询创意列表 |
| `creative_update` | POST /dynamic_creatives/update | 更新创意 |
| `creative_get_report` | GET /daily_reports/get | 创意报表 |
| `asset_get_list` | GET /assets/get | 查询资产列表 |
| `audience_get_list` | GET /custom_audiences/get | 查询人群包 |
| `account_get_info` | GET /advertiser/get | 查询账户信息 |

### data_query.py — ODPS 数据查询（3 个工具）

| 工具 | 说明 |
|------|------|
| `data_query` | 通用 ODPS SQL 查询（含模板：creative_detail, account_summary, ad_detail 等） |
| `data_aggregate` | 数据聚合查询 |
| `get_ad_current_status` | 查询广告当前状态（出价/预算/定向） |

### budget_calc.py — 出价计算引擎（6 个工具）

| 工具 | 说明 |
|------|------|
| `get_ad_performance` | 拉取广告昨日效率数据 |
| `get_account_summary` | 拉取账户汇总数据 |
| `compute_budget_thresholds` | 计算分位数阈值（P70/P30/P50） |
| `classify_ads` | 2×2 象限分类（ROI × 消耗） |
| `compute_bid_adjustment` | 计算出价调整方案 |
| `bid_adjustment_execute` | 批量执行出价调整 |

---

## 六、配置说明

`config.py` 定义了三套 `RunConfig`：

| 配置 | 用途 | Temperature | Max Iterations |
|------|------|-------------|----------------|
| `MAIN_CONFIG` | 主分析 Agent | 0.3 | 50 |
| `BUDGET_CONFIG` | 预算/出价 sub-agent | 0.3 | 30 |
| `EXECUTE_CONFIG` | 执行 Agent | 0.1 | 50 |

工具白名单：

- `ANALYSIS_TOOLS`: 只读查询 + 计算工具（不含 ad_create/ad_update 等写操作）
- `EXECUTION_TOOLS`: 全量工具（含所有写操作）

---

## 七、关键设计原则

1. **策略外置**: 决策参数在 JSON 配置文件中，LLM 可运行时调整并版本化管理
2. **两段式执行**: 分析（run.py）与执行（run_execute.py）分离，中间有人工审批环节
3. **保护优先**: 冷启动 → 赔付 → 边界 → 振幅，四层保护从高到低依次生效
4. **用出价控制消耗**: oCPM 模式下通过 bid 调整影响 eCPM → 竞价胜率 → 消耗量，而非直接设 day_amount
5. **非线性认知**: 降价效果放大（-10% 出价 ≈ -15~25% 消耗），需警惕"掉量悬崖"
