# 🚀 新人上手指南 — auto_put_ad_mini > **阅读时间**: 15 分钟 > **前提**: 已经有 GIT_CHANGELOG.md(项目根目录),建议先快速浏览它的目录了解演进历史 > **最后更新**: 2026-07-06 --- ## 1. 这个项目是干什么的? 一句话:**基于 ROI 数据,自动判断腾讯广告该提价、降价还是关停,然后把决策发给运营审批,审批通过后自动执行。** ``` 数据拉取 → ROI 计算 → 决策引擎 → 飞书审批 → API 执行 (ODPS) (Python) (LLM+规则) (飞书IM) (腾讯广告API) ``` 两个独立的业务线共享同一套代码库: | 业务线 | 做什么 | 入口文件 | |--------|--------|---------| | **广告调控**(主) | 分析已投放广告的 ROI,决定是否提价/降价/关停 | `execute_once.py` | | **广告创建**(副) | 给新账户自动创建广告 + 挂创意 | `execute_creation_once.py` | --- ## 2. 先跑起来 ### 2.1 环境准备 ```bash cd /path/to/Agent # 创建虚拟环境(只需要一次) python3 -m venv .venv source .venv/bin/activate pip3 install -r requirements.txt pip3 install -r examples/auto_put_ad_mini/requirements.txt # 复制环境变量模板 cp .env.template .env # 编辑 .env,填入必填的 API key(至少需要 TENCENT_AD_* 和 OPENROUTER_API_KEY) ``` ### 2.2 执行调控流程(最主要的功能) ```bash cd examples/auto_put_ad_mini # 完整 10 步 pipeline(数据拉取 → 决策 → 审批 → 执行) .venv/bin/python3 execute_once.py --date 20260705 # 常用参数: # --date YYYYMMDD 指定分析日期(默认昨天) # --dry-run 只分析不执行 # --skip-approval 跳过飞书审批,直接执行 ``` ### 2.3 执行创建流程 ```bash # 单次创建(找缺创意的广告 → 召回素材 → 创建 → 审批 → 执行) .venv/bin/python3 execute_creation_once.py --date 20260705 # 批量创建(给多个账户创建广告) .venv/bin/python3 execute_creation_apply.py --date 20260705 ``` ### 2.4 交互式模式(Agent 对话) ```bash .venv/bin/python3 run.py # 进入对话,可以自然语言问"今天哪些广告需要调整?" ``` --- ## 3. 核心文件速查 ### 3.1 改了就能生效的文件(运营/产品可改) | 文件 | 改什么 | 何时改 | |------|--------|--------| | `config.py` | ROI 阈值、出价边界、审批超时等参数 | 调策略参数 | | `skills/*.md` | 决策规则、平台约束、后验经验 | 改业务规则 | | `prompts/system.prompt` | LLM 行为、输出格式、执行顺序 | 调 Agent 行为 | | `db/schema.sql` | 数据库表结构 | 加新表/新字段 | ### 3.2 代码文件(改了会改变行为) | 文件 | 职责 | 代码量 | |------|------|--------| | `tools/ad_decision.py` | **决策引擎** — 候选标记 + LLM 评估 | 84KB(最大) | | `tools/roi_calculator.py` | **ROI 计算** — 动态 ROI (7日均值)、人群包基线 | 25KB | | `tools/im_approval.py` | **飞书审批** — 发消息 + 轮询回复 + Excel 附件 | 53KB | | `tools/execution_engine.py` | **执行引擎** — 调腾讯 API + 审计日志 | 40KB | | `tools/guardrails.py` | **安全护栏** — 频率/边界/方向检查 | 37KB | | `tools/ad_api.py` | **腾讯 API 封装** — GET/POST 统一入口 | 31KB | | `tools/data_query.py` | **数据拉取** — ODPS 查询 + 合并 | 23KB | | `tools/creative_creation.py` | **创意创建** — POST /dynamic_creatives/add | 37KB | | `tools/material_recall.py` | **素材召回** — batchByText + 评分排序 | 24KB | | `tools/creative_review.py` | **创意审核** — 扫描审核结果 | 21KB | ### 3.3 业务知识(Skills,LLM 自动加载) | 文件 | 内容 | |------|------| | `skills/ad_domain.md` | 裂变模型、R 值、ROI 公式、数据字段定义 | | `skills/platform_rules.md` | 腾讯平台硬约束(oCPM 学习期、调价上限 30% 等) | | `skills/decision_strategy.md` | 决策框架:5 种候选标记、三级年龄保护、7 种 action | | `skills/posterior_wisdom.md` | 后验经验入口(生产后动态补充) | --- ## 4. 决策流程详解(最重要的一节) ### 4.1 10 步 Pipeline ``` Step 0: 同步广告状态 — sync_ad_status.py(从腾讯 API 拉最新状态) Step 1: 拉取创意数据 — fetch_creative_data(ODPS) Step 2: 合并创意数据 — merge_creative_data Step 3: 计算 ROI 指标 — calculate_roi_metrics(动态 ROI (7日均值)) Step 4: 计算人群包基线 — calculate_portfolio_summary(各人群包的 P50 等) Step 5: 获取待评估广告 — get_ads_for_review(年龄保护 + 候选标记) Step 6: LLM 决策 — 主 Agent 调用(规则标记 + LLM 判断) Step 7: 应用决策 — apply_decisions(合并 metrics 字段 + 护栏检查) Step 8: 生成报告 — generate_report(Excel + CSV) Step 9: 飞书审批 + 执行 — send_approval_request → 等回复 → execute_decisions ``` ### 4.2 决策的三层架构 ``` ┌─────────────────────────────┐ │ 第1层:规则引擎(硬约束) │ ← Python 代码,不做 LLM 调用 │ - 年龄保护(≤3天不评估) │ │ - 零消耗识别(自动关停候选) │ │ - 候选信号计算 │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 第2层:LLM 智能评估 │ ← Claude Sonnet 4.5 │ - 多维度推理(ROI+裂变+CTR) │ │ - 输出 action + reason │ └──────────────┬──────────────┘ ↓ ┌─────────────────────────────┐ │ 第3层:护栏兜底检查 │ ← Python 代码,LLM 输出后执行 │ - 方向一致性(bid_down必须<0)│ │ - 频率限制(同广告6h内不重复)│ │ - 边界检查(出价下限0.05元) │ └─────────────────────────────┘ ``` ### 4.3 7 种决策类型 | Action | 含义 | 是否调用 API | 审批要求 | |--------|------|:----------:|:------:| | `pause` | 暂停广告 | ✅ | 必须审批 | | `bid_down` | 降价 3%-5% | ✅ | 必须审批 | | `bid_up` | 提价 5%-10% | ✅ | 自动执行 | | `scale_up` | 建议扩量 | ❌ | 参考信息 | | `creative_adjust` | 建议换素材 | ❌ | 参考信息 | | `observe` | 观察等待 | ❌ | 参考信息 | | `hold` | 保持不变 | ❌ | 不展示 | ### 4.4 核心概念:动态 ROI (7日均值) ``` 对每一天(日消耗 ≥ 100 元才参与计算): 裂变收益率 = T0裂变数 × arpu / 当日消耗 回流倍数 = 总回流人数 / 首层打开数 7 日滚动均值(至少 3 天合格数据): 裂变效率稳定因子 = 回流倍数_7日均值 / T0裂变系数_7日均值 动态 ROI (7日均值) = 当日裂变收益率 × 裂变效率稳定因子 ``` **决策时用"动态 ROI (7日均值) 均值"(多天的均值),而非单日值。** --- ## 5. 数据流 ### 5.1 数据来源 ``` ODPS(阿里 MaxCompute) ↓ fetch_creative_data CSV 文件 → outputs/raw/creative_raw_{date}.csv ↓ merge_creative_data 合并后 CSV → outputs/raw/creative_merged_{date}.csv ↓ calculate_roi_metrics Metrics CSV → outputs/metrics_{date}.csv ↓ get_ads_for_review + LLM Decisions CSV → outputs/reports/decisions_{date}.csv ↓ generate_report 审批 Excel → outputs/reports/approval_table_{date}.xlsx ``` ### 5.2 数据库 MySQL(`db/schema.sql`)存储: - `account_whitelist` — 账户白名单 + feedback_id + 用户 token - `ad_creation_account_config` — 广告创建配置(人群包、出价区间等) - `ad_delivery_template` — 投放模板(版位、地域、时段等) - `creative_creation_task` — 创意创建任务记录 - `creative_review_result` — 创意审核结果 - `creative_rejection_fact` — 审核拒绝原因 - `creative_material_usage` — 素材使用记录(7 天去重) - `adjustment_history` — 调价历史(护栏用) --- ## 6. 关键配置项 ### 6.1 决策阈值(config.py) ```python ROI_LOW_FACTOR = 0.75 # 动态ROI < 渠道P50×0.75 → 关停 BID_DOWN_ROI_FACTOR = 0.90 # 动态ROI < 渠道P50×0.90 → 降价 BID_UP_ROI_FACTOR = 1.05 # 动态ROI > 渠道P50×1.05 → 提价 COLD_START_DAYS = 3 # ≤3天冷启动(完全不干预) EARLY_GROWTH_DAYS = 7 # 4-7天早期成长(只能提价) ``` ### 6.2 出价边界 ```python BID_FLOOR_YUAN = 0.05 # 出价下限(分) BID_CEILING_YUAN = 1.00 # 出价上限(元) BID_UP_MIN_PCT = 0.05 # 提价最小 5% BID_UP_MAX_PCT = 0.10 # 提价最大 10% BID_DOWN_MIN_PCT = 0.03 # 降价最小 3% BID_DOWN_MAX_PCT = 0.05 # 降价最大 5% ``` ### 6.3 环境变量(.env) 必需的环境变量(至少本地开发):`OPENROUTER_API_KEY`、数据库连接信息(`DB_HOST` 等)、腾讯广告 API 的 `TENCENT_AD_*` 系列。 完整列表见 `.env.example`。 --- ## 7. 常见调试场景 ### 7.1 "我想看看今天 LLM 做了什么决策" ```bash # 查看 decisions CSV cat outputs/reports/decisions_20260706.csv | head -20 # 查看日志 grep "LLM" outputs/decision_log_20260706.log ``` ### 7.2 "决策不对,我想改规则" 1. 如果是**参数值不对** → 改 `config.py` 中的阈值 2. 如果是**判断逻辑不对** → 改 `skills/decision_strategy.md`(改 LLM 的推理指导) 3. 如果是**硬约束不对** → 改 `tools/guardrails.py` 或 `tools/ad_decision.py` ### 7.3 "飞书审批没反应" ```bash # 检查飞书 token 是否有效 .venv/bin/python3 -c " from examples.auto_put_ad_mini.tools.im_approval import _get_tenant_access_token print(_get_tenant_access_token()[:20]) " # 手动发一条测试消息 .venv/bin/python3 test_chat_send.py ``` ### 7.4 "想看某个广告为什么被标记为关停候选" ```bash # 找到对应日期的 metrics CSV grep "广告ID" outputs/metrics_20260706.csv # 检查年龄保护逻辑是否生效 grep "年龄保护" outputs/decision_log_20260706.log ``` --- ## 8. 工程约定(重要!) ### 8.1 不要猜测 项目 CLAUDE.md 中明确规定:**禁止凭"常识 / 文档框架 / 命名规律"推断腾讯 API 的字段名、枚举值、参数结构。** 正确做法: 1. 拉真实数据反推(`/adgroups/get` 查已跑通的广告 JSON) 2. 读现有代码(`tools/ad_api.py` 中已封装参数) 3. 反问用户 ### 8.2 Git 规范 - **不自动 commit / push** — 等用户明确说 - Commit message: `feat(xxx): ...` / `fix(xxx): ...` 一行标题,不加 `Co-Authored-By` / `Generated with` - 不修改 `agent/` 目录(框架源码) ### 8.3 Python 环境 - 始终用 `.venv/bin/python3` 执行脚本 - 用 `pip3` 安装依赖 - 数据库配置优先从环境变量读取 --- ## 9. 相关文档索引 | 文档 | 位置 | 内容 | |------|------|------| | 完整变更日志 | `../../GIT_CHANGELOG.md` | 77 个 commit 的详细变更记录 | | 架构文档 | `ARCHITECTURE.html` | 可视化架构图 | | 新模块架构 | `ARCHITECTURE_NEW_MODULES.html` | 创建模块架构 | | 生产自动化 | `PRODUCTION_AUTOMATION.md` | 生产环境部署说明 | | 部署指南 | `DEPLOYMENT.md` | Docker + K8s 部署 | | 调度指南 | `SCHEDULER_GUIDE.md` | CronJob 配置 | | K8s 配置 | `k8s/` | deployment、cronjob、secret 等 | | 审批流更新 | `APPROVAL_FLOW_UPDATE.md` | 审批协议变更记录 | --- ## 10. 快速问答 **Q: 改了个 config.py 参数,要重启什么?** A: 如果是 cronjob 模式,等下次 cron 触发自动生效。如果是手动执行,直接重新 `python3 execute_once.py`。 **Q: 如何在本地测试而不调真实 API?** A: 设置 `DRY_RUN_MODE=True` 在 config.py 中,或者用 `--dry-run` 参数。 **Q: auto_put_ad 和 auto_put_ad_mini 的关系?** A: `auto_put_ad` 是多 Agent 架构的 Budget Domain(预算分配),是独立系统。`auto_put_ad_mini` 是单 Agent 的广告调控系统,当前分支的主力项目。两者共享 `auto_put_ad/tools/ad_api.py` 的腾讯 API 封装。 **Q: 创建模块的代码在哪?** A: 在 `auto_put_ad_mini/tools/` 下,以 `ad_creation.py`、`creative_creation.py`、`material_recall.py` 等命名。入口是 `execute_creation_once.py` 和 `execute_creation_apply.py`。