config.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. """
  2. 广告智能决策引擎配置 — auto_put_ad_mini
  3. 运营可直接修改此文件调整决策参数。
  4. 当前模式:规则判断 + 智能判断
  5. - 基于 f_7日动态ROI 的精细化决策
  6. - AI 推理结合领域知识
  7. - 三级分类:零消耗待关停(规则)+ 待优化评估(智能)+ 正常运行(规则)
  8. """
  9. import os
  10. from pathlib import Path
  11. from agent.core.runner import RunConfig, KnowledgeConfig
  12. # 加载 .env 文件(如果存在)
  13. try:
  14. from dotenv import load_dotenv
  15. load_dotenv(Path(__file__).parent / ".env")
  16. except ImportError:
  17. pass
  18. # ═══════════════════════════════════════════
  19. # Agent 运行配置
  20. # ═══════════════════════════════════════════
  21. # 引擎开关
  22. USE_RULE_ENGINE = False # True=使用规则引擎, False=只用智能引擎
  23. USE_AI_ENGINE = True # True=使用智能引擎, False=只用规则引擎
  24. MAIN_CONFIG = RunConfig(
  25. model="qwen/qwen3.5-plus-02-15",
  26. temperature=0.3,
  27. max_iterations=50,
  28. name="广告智能调控助手",
  29. tools=[
  30. "fetch_creative_data",
  31. "merge_creative_data",
  32. "calculate_roi_metrics",
  33. "get_ads_for_review",
  34. "apply_decisions",
  35. "query_ad_detail", # Mode 2: 查询广告详情
  36. "modify_decisions", # Mode 3: 修改已有决策
  37. "validate_decisions",
  38. "generate_report",
  39. # 执行引擎 + IM 审批(已集成阻塞式审批流):
  40. "execute_decisions",
  41. "check_execution_feedback",
  42. "send_approval_request",
  43. "check_approval_status",
  44. # 飞书文档(报告导入 & 分享):
  45. "import_to_feishu",
  46. # 规则引擎工具(暂时禁用):
  47. # "analyze_ads",
  48. # "compare_decisions",
  49. ],
  50. skills=["roi-strategy", "guardrail-rules"],
  51. # extra_llm_params={"extra_body": {"enable_thinking": True}}, # 禁用:千问不支持 thinking
  52. knowledge=KnowledgeConfig(
  53. enable_extraction=False,
  54. enable_completion_extraction=False,
  55. enable_injection=False,
  56. owner="ad_mini_team",
  57. ),
  58. )
  59. SKILLS_DIR = str(Path(__file__).parent / "skills")
  60. TRACE_STORE_PATH = ".trace"
  61. LOG_LEVEL = "INFO"
  62. LOG_FILE = None
  63. # ═══════════════════════════════════════════
  64. # V3 数据窗口配置
  65. # ═══════════════════════════════════════════
  66. DATA_WINDOW_DAYS = 7 # 测试阶段:采集 7 天历史数据
  67. ROI_CALCULATION_DAYS = 7 # f_7日动态ROI 计算窗口
  68. # ═══════════════════════════════════════════
  69. # V3 决策阈值(默认值,可被 SKILL 覆盖)
  70. # ═══════════════════════════════════════════
  71. MIN_DAILY_COST = 100 # 日消耗 >= 100元才参与 ROI 计算
  72. MIN_AD_AGE_DAYS = 3 # 广告创建 >= 3天才参与决策(与 min_periods 对齐)
  73. ROI_LOW_FACTOR = 0.5 # f_7日动态ROI < 全体均值 × 0.5 → 关停
  74. NO_SPEND_THRESHOLD = 10 # 7日消耗均值 < 10元 → 关停
  75. STABLE_SPEND_THRESHOLD = 100 # 稳定消耗定义:>100元/天
  76. # ═══════════════════════════════════════════
  77. # 出价调整配置
  78. # ═══════════════════════════════════════════
  79. BID_ADJUSTMENT_ENABLED = True
  80. BID_DOWN_ROI_FACTOR = 0.8 # ROI < 均值×0.8 → 考虑降价
  81. BID_UP_ROI_FACTOR = 1.2 # ROI > 均值×1.2 → 考虑提价
  82. BID_UP_LOW_SPEND_FACTOR = 0.5 # 消耗 < 中位数×0.5 → 消耗不足
  83. BID_CHANGE_MIN_PCT = 0.03 # 最小调幅 3%
  84. BID_CHANGE_MAX_PCT = 0.10 # 最大单次调幅 10%
  85. BID_FLOOR_YUAN = 0.50 # 出价下限(元)
  86. BID_CEILING_YUAN = 200.00 # 出价上限(元)
  87. # 广告年龄分段(基于决策树图片)
  88. COLD_START_DAYS = 3 # 冷启动期(≤3天):极度保护,几乎不干预
  89. EARLY_GROWTH_DAYS = 7 # 早期成长期(4-7天):可提价放量(满足ROI+消耗条件)
  90. AD_AGE_MATURE = 7 # 成熟期(>7天):全面调控
  91. # 兼容性(已废弃)
  92. AD_AGE_NEWBORN = COLD_START_DAYS # 兼容旧代码
  93. CAUTIOUS_DAYS = EARLY_GROWTH_DAYS # 兼容旧代码
  94. # 高燃烧预警配置
  95. HIGH_BURN_AGE_THRESHOLD = 3 # 广告年龄>3天才检查
  96. HIGH_BURN_COST_THRESHOLD = 300 # 昨日消耗>300元触发预警
  97. # ═══════════════════════════════════════════
  98. # 安全护栏配置
  99. # ═══════════════════════════════════════════
  100. GUARDRAILS_ENABLED = True
  101. DRY_RUN_MODE = False # 关闭干运行,让护栏正常放行(实际执行由 EXECUTION_ENABLED 控制)
  102. MAX_ADJUSTMENTS_PER_AD_PER_DAY = 2
  103. MIN_ADJUSTMENT_INTERVAL_HOURS = 6
  104. MAX_DAILY_CUMULATIVE_CHANGE_PCT = 0.20 # 日累计调幅上限 20%
  105. MAX_DAILY_OPS = 10000 # 单日最多操作广告数(实际不限制)
  106. DATA_FRESHNESS_MAX_HOURS = 96 # 数据超过 96 小时视为过期(已从48小时放宽至96小时)
  107. # ═══════════════════════════════════════════
  108. # 执行引擎配置
  109. # ═══════════════════════════════════════════
  110. EXECUTION_ENABLED = False # 主开关!False = 只验证不执行
  111. API_QPS_LIMIT = 8 # 保守QPS(平台上限10)
  112. API_MAX_RETRIES = 3
  113. TIER1_MAX_CHANGE_PCT = 0.00 # Tier1自动执行已禁用(改为0%,所有操作都需审批)
  114. TIER3_MIN_DAILY_SPEND = 1500 # 高价值广告门槛(元/天)
  115. FEEDBACK_CHECK_HOURS = 6
  116. # ═══════════════════════════════════════════
  117. # IM 审批配置(飞书直连)
  118. # ═══════════════════════════════════════════
  119. IM_ENABLED = True # IM 主开关(True 时审批消息发飞书)
  120. IM_APPROVAL_TIMEOUT_MINUTES = 30 # 审批超时(分钟)
  121. IM_APPROVAL_POLL_INTERVAL_SECONDS = 30 # 审批轮询间隔(秒)
  122. # 飞书应用凭据("增长投放"机器人)— 优先从环境变量读取
  123. FEISHU_APP_ID = os.getenv("FEISHU_APP_ID", "cli_a955e97067f85cb3")
  124. FEISHU_APP_SECRET = os.getenv("FEISHU_APP_SECRET", "NQaG4ci1plXRDTgwCqrLJgMLLoA2tdF8")
  125. # 运营审批人飞书信息
  126. FEISHU_OPERATOR_OPEN_ID = os.getenv("FEISHU_OPERATOR_OPEN_ID", "ou_498988d823b61ab89c9afe4310f85bb4")
  127. FEISHU_OPERATOR_CHAT_ID = os.getenv("FEISHU_OPERATOR_CHAT_ID", "oc_88e0a1970a7de02eb5ac225a8b0cedea")
  128. # 投放项目群聊(新增)— 用于接收决策结果通知
  129. FEISHU_AD_PROJECT_CHAT_ID = os.getenv("FEISHU_AD_PROJECT_CHAT_ID", "") # 设置为空表示不发送
  130. # 腾讯广告默认账户(测试账户)
  131. TENCENT_AD_ACCOUNT_ID = int(os.getenv("TENCENT_AD_ACCOUNT_ID", "80769799"))
  132. # ═══════════════════════════════════════════
  133. # 输出路径配置
  134. # ═══════════════════════════════════════════
  135. OUTPUTS_DIR = Path(__file__).parent / "outputs"
  136. RAW_DATA_DIR = OUTPUTS_DIR / "raw" # 创意级原始 CSV
  137. AD_STATUS_DIR = OUTPUTS_DIR / "ad_status" # 广告状态 CSV
  138. REPORTS_DIR = OUTPUTS_DIR / "reports" # 决策报告
  139. EXECUTION_LOG_DIR = OUTPUTS_DIR / "execution_log" # 执行审计日志
  140. DATA_DIR = OUTPUTS_DIR / "data" # 运行时数据(如调整历史)
  141. ADJUSTMENT_HISTORY_PATH = DATA_DIR / "adjustment_history.json"
  142. # ═══════════════════════════════════════════
  143. # 人群包系数(保留,用于展示)
  144. # ═══════════════════════════════════════════
  145. AUDIENCE_COEFFICIENTS = {
  146. "R500": 3.0,
  147. "R330+": 2.5,
  148. "R330": 2.0,
  149. "R180": 1.5,
  150. "R100": 1.2,
  151. "R50": 1.0,
  152. "R10": 1.0,
  153. "R2": 1.0,
  154. "default": 1.0,
  155. }
  156. # 从广告名称提取 R 值的匹配顺序
  157. AUDIENCE_TIER_PATTERNS = [
  158. ("R500", ["R500", "R_500", "r500"]),
  159. ("R330+", ["回流330+", "回流330+-", "回流q330", "330+全品类", "R330+", "R_330+"]),
  160. ("R330", ["回流330", "R330", "R_330", "定向330", "r330", "r300"]),
  161. ("R180", ["回流180", "R180", "R_180", "定向180", "r180",
  162. "r180-330", "r180-300", "R100-180", "R_100-180", "r100-180"]),
  163. ("R100", ["回流100", "R100", "R_100", "定向100", "r100", "R50-100"]),
  164. ("R50", ["回流50", "R50", "R_50", "r50"]),
  165. ("R10", ["R_10", "R10", "r10"]),
  166. ("R2", ["R_2", "R2", "r2"]),
  167. ]