فهرست منبع

feat(auto_put_ad_mini): 调整7日无消耗阈值从1元至10元

主要改进:

1. **7日无消耗阈值调整**
   - 零消耗判定阈值:1元 → 10元
   - 影响范围:
     - ad_decision.py: 零消耗分类逻辑 (min_spend_for_class_a)
     - im_approval.py: 审批表格排序逻辑
     - report_generator.py: 报告排序逻辑

2. **业务影响**
   - 更严格的零消耗定义(< 10元)
   - 减少低消耗无效广告进入分析
   - 7日日均消耗 1-10元 的广告从"自动保持"变为"自动关停"

3. **代码更新位置**
   - get_ads_for_review: 分类判断逻辑
   - apply_decisions: 零消耗广告合并逻辑
   - _generate_approval_xlsx: 排序逻辑(>= 10元算有消耗)
   - generate_report: 排序逻辑(>= 10元算有消耗)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
刘立冬 3 هفته پیش
والد
کامیت
95b014c202

+ 6 - 6
examples/auto_put_ad_mini/tools/ad_decision.py

@@ -827,12 +827,12 @@ async def get_ads_for_review(
     metrics_csv: str = "",
     metrics_csv: str = "",
     end_date: str = "yesterday",
     end_date: str = "yesterday",
     roi_review_factor: float = 0.8,
     roi_review_factor: float = 0.8,
-    min_spend_for_class_a: float = 1.0,
+    min_spend_for_class_a: float = 10.0,
 ) -> ToolResult:
 ) -> ToolResult:
     """
     """
     不做决策,将广告分为三类,返回结构化摘要供 LLM 推理。
     不做决策,将广告分为三类,返回结构化摘要供 LLM 推理。
 
 
-    类别 A【已确认异常,建议直接关停】:7日均消耗 < 1元(几乎零活动)
+    类别 A【已确认异常,建议直接关停】:7日均消耗 < 10元(几乎零活动)
     类别 B【待LLM评估】:消耗有意义但指标异常(ROI偏低或衰退信号)
     类别 B【待LLM评估】:消耗有意义但指标异常(ROI偏低或衰退信号)
     类别 C【正常运行】:仅返回摘要统计
     类别 C【正常运行】:仅返回摘要统计
 
 
@@ -840,7 +840,7 @@ async def get_ads_for_review(
         metrics_csv: ROI 指标 CSV 路径(calculate_roi_metrics 输出)
         metrics_csv: ROI 指标 CSV 路径(calculate_roi_metrics 输出)
         end_date: 结束日期
         end_date: 结束日期
         roi_review_factor: 动态ROI < 全体均值 × 此值 → 进入 B 类(默认 0.8)
         roi_review_factor: 动态ROI < 全体均值 × 此值 → 进入 B 类(默认 0.8)
-        min_spend_for_class_a: 7日均消耗低于此值(元)→ A 类(默认 1.0)
+        min_spend_for_class_a: 7日均消耗低于此值(元)→ A 类(默认 10.0)
     """
     """
     try:
     try:
         # 加载策略参数(动态阈值,不写死在代码中)
         # 加载策略参数(动态阈值,不写死在代码中)
@@ -899,7 +899,7 @@ async def get_ads_for_review(
             stable_days = float(row.get("stable_spend_days_30d", 0) or 0)
             stable_days = float(row.get("stable_spend_days_30d", 0) or 0)
             bid_amount = float(row.get("bid_amount", 0) or 0)
             bid_amount = float(row.get("bid_amount", 0) or 0)
 
 
-            # 零消耗待关停:7日均消耗 < 1元,几乎无活动
+            # 零消耗待关停:7日均消耗 < 10元,几乎无活动
             if cost_7d_avg < min_spend_for_class_a:
             if cost_7d_avg < min_spend_for_class_a:
                 zero_spend_ads.append({
                 zero_spend_ads.append({
                     "ad_id": int(row["ad_id"]),
                     "ad_id": int(row["ad_id"]),
@@ -1027,7 +1027,7 @@ async def apply_decisions(
     接收 LLM 的决策,合并 A 类广告(自动关停)和 C 类广告(自动保持),保存到 llm_decisions_{date}.csv。
     接收 LLM 的决策,合并 A 类广告(自动关停)和 C 类广告(自动保持),保存到 llm_decisions_{date}.csv。
 
 
     决策分类:
     决策分类:
-      - 零消耗待关停:7日均消耗 < 1元,几乎无活动 → 规则判断自动关停
+      - 零消耗待关停:7日均消耗 < 10元,几乎无活动 → 规则判断自动关停
       - 待优化评估:ROI 偏低、衰退信号、出价调整候选 → 智能判断
       - 待优化评估:ROI 偏低、衰退信号、出价调整候选 → 智能判断
       - 正常运行:ROI 正常且无异常信号 → 规则判断自动保持
       - 正常运行:ROI 正常且无异常信号 → 规则判断自动保持
 
 
@@ -1062,7 +1062,7 @@ async def apply_decisions(
             df_metrics = pd.read_csv(metrics_csv)
             df_metrics = pd.read_csv(metrics_csv)
             for _, row in df_metrics.iterrows():
             for _, row in df_metrics.iterrows():
                 cost_7d_avg = float(row.get("cost_7d_avg", 0) or 0)
                 cost_7d_avg = float(row.get("cost_7d_avg", 0) or 0)
-                if cost_7d_avg < 1.0:
+                if cost_7d_avg < 10.0:
                     # 优化reason表达:避免"0.00元"显示,改用"几乎无消耗"
                     # 优化reason表达:避免"0.00元"显示,改用"几乎无消耗"
                     if cost_7d_avg == 0:
                     if cost_7d_avg == 0:
                         reason_text = "7日几乎无消耗,长期无活动"
                         reason_text = "7日几乎无消耗,长期无活动"

+ 2 - 2
examples/auto_put_ad_mini/tools/im_approval.py

@@ -93,9 +93,9 @@ def _generate_approval_xlsx(df_tier2_3: pd.DataFrame, request_id: str) -> Path:
     cols = [c for c in APPROVAL_COLUMNS if c in df_tier2_3.columns]
     cols = [c for c in APPROVAL_COLUMNS if c in df_tier2_3.columns]
     df_out = df_tier2_3[cols].copy()
     df_out = df_tier2_3[cols].copy()
 
 
-    # 排序:7日消耗0元的放最后,有消耗的在前,同组内按消耗降序
+    # 排序:7日消耗<10元的放最后,有消耗的在前,同组内按消耗降序
     if "cost_7d_avg" in df_out.columns:
     if "cost_7d_avg" in df_out.columns:
-        df_out["_has_spend"] = (df_out["cost_7d_avg"] > 0.01).astype(int)  # >0.01元算有消耗
+        df_out["_has_spend"] = (df_out["cost_7d_avg"] >= 10.0).astype(int)  # >=10元算有消耗
         df_out = df_out.sort_values(
         df_out = df_out.sort_values(
             ["_has_spend", "cost_7d_avg"],
             ["_has_spend", "cost_7d_avg"],
             ascending=[False, False]  # 有消耗在前(1在前),消耗高的在前
             ascending=[False, False]  # 有消耗在前(1在前),消耗高的在前

+ 2 - 2
examples/auto_put_ad_mini/tools/report_generator.py

@@ -221,8 +221,8 @@ async def generate_report(
         sort_cols = []
         sort_cols = []
         ascending_flags = []
         ascending_flags = []
         if "cost_7d_avg" in df_out.columns:
         if "cost_7d_avg" in df_out.columns:
-            # 无消耗(cost_7d_avg=0)放最后
-            df_out["_has_spend"] = (df_out["cost_7d_avg"] > 0).astype(int)
+            # 无消耗(cost_7d_avg<10元)放最后
+            df_out["_has_spend"] = (df_out["cost_7d_avg"] >= 10.0).astype(int)
             sort_cols.append("_has_spend")
             sort_cols.append("_has_spend")
             ascending_flags.append(False)  # 1在前,0在后
             ascending_flags.append(False)  # 1在前,0在后
         if "cost_7d_total" in df_out.columns:
         if "cost_7d_total" in df_out.columns: