|
|
@@ -41,10 +41,9 @@ from config import (
|
|
|
BID_CHANGE_MAX_PCT,
|
|
|
BID_FLOOR_YUAN,
|
|
|
BID_CEILING_YUAN,
|
|
|
- AD_AGE_NEWBORN,
|
|
|
- COLD_START_DAYS,
|
|
|
- CAUTIOUS_DAYS,
|
|
|
- AD_AGE_MATURE,
|
|
|
+ COLD_START_DAYS, # ≤3天:冷启动期(极度保护)
|
|
|
+ EARLY_GROWTH_DAYS, # 4-7天:早期成长期(可提价)
|
|
|
+ AD_AGE_MATURE, # >7天:成熟期(全面调控)
|
|
|
HIGH_BURN_AGE_THRESHOLD,
|
|
|
HIGH_BURN_COST_THRESHOLD,
|
|
|
ROI_LOW_FACTOR,
|
|
|
@@ -300,7 +299,7 @@ class BidDownDimension(DecisionDimension):
|
|
|
触发条件:
|
|
|
- ROI 在 均值×0.5 ~ 均值×0.8 之间(偏低但非极低)
|
|
|
- 日消耗 ≥ 100 元(数据有统计意义)
|
|
|
- - 非冷启动期(> COLD_START_DAYS 天)
|
|
|
+ - 非冷启动期(> {COLD_START_DAYS} 天,即≥4天)
|
|
|
- 有出价数据(bid_amount > 0)
|
|
|
|
|
|
降幅计算:
|
|
|
@@ -1021,22 +1020,22 @@ async def get_ads_for_review(
|
|
|
ad_dict["bid_up_line_min"] = round(tier_roi_p50 * 1.05, 4) if tier_roi_p50 else None
|
|
|
ad_dict["bid_up_line_max"] = round(tier_roi_p50 * 1.10, 4) if tier_roi_p50 else None
|
|
|
|
|
|
- # ===== 新增:年龄分段标签 =====
|
|
|
+ # ===== 新增:年龄分段标签(基于决策树图片)=====
|
|
|
if ad_age is not None:
|
|
|
- if ad_age <= AD_AGE_NEWBORN: # ≤3天
|
|
|
- ad_dict["age_segment"] = "newborn"
|
|
|
- ad_dict["age_protection_level"] = "极度保护"
|
|
|
- ad_dict["allow_bid_down"] = False
|
|
|
- ad_dict["allow_bid_up"] = False
|
|
|
- elif ad_age <= COLD_START_DAYS: # 4-7天
|
|
|
+ if ad_age <= COLD_START_DAYS: # ≤3天:冷启动期
|
|
|
ad_dict["age_segment"] = "cold_start"
|
|
|
- ad_dict["age_protection_level"] = "仅允许提价"
|
|
|
+ ad_dict["age_protection_level"] = "极度保护(冷启动期)"
|
|
|
+ ad_dict["allow_bid_down"] = False # 不允许降价
|
|
|
+ ad_dict["allow_bid_up"] = False # 不允许提价
|
|
|
+ elif ad_age <= EARLY_GROWTH_DAYS: # 4-7天:早期成长期
|
|
|
+ ad_dict["age_segment"] = "early_growth"
|
|
|
+ ad_dict["age_protection_level"] = "仅允许提价(早期成长期)"
|
|
|
ad_dict["allow_bid_down"] = False # 不允许降价
|
|
|
- ad_dict["allow_bid_up"] = True # 允许提价
|
|
|
- ad_dict["max_bid_down_pct"] = 0.05 # 最大降价5%(虽然不允许,但保留字段)
|
|
|
- else: # >7天
|
|
|
+ ad_dict["allow_bid_up"] = True # 允许提价(满足ROI+消耗条件时)
|
|
|
+ ad_dict["max_bid_down_pct"] = 0 # 不允许降价
|
|
|
+ else: # >7天:成熟期
|
|
|
ad_dict["age_segment"] = "mature"
|
|
|
- ad_dict["age_protection_level"] = "正常调控"
|
|
|
+ ad_dict["age_protection_level"] = "正常调控(成熟期)"
|
|
|
ad_dict["allow_bid_down"] = True
|
|
|
ad_dict["allow_bid_up"] = True
|
|
|
ad_dict["max_bid_down_pct"] = 0.05 # 最大降价5%(决策树上限)
|
|
|
@@ -1193,21 +1192,35 @@ async def apply_decisions(
|
|
|
row_data = cost_row.iloc[0]
|
|
|
item["cost_7d_avg"] = float(row_data.get("cost_7d_avg", 0) or 0)
|
|
|
|
|
|
- # ===== 新增:冷启动期决策限制 =====
|
|
|
+ # ===== 新增:年龄分段决策限制(基于决策树)=====
|
|
|
ad_age_days = row_data.get("ad_age_days")
|
|
|
- if ad_age_days is not None and ad_age_days <= COLD_START_DAYS:
|
|
|
- # 冷启动期(4-7天)不允许降价/关停
|
|
|
- if action in ["bid_down", "pause"]:
|
|
|
- original_action = action
|
|
|
- original_reason = item.get("reason", "")
|
|
|
- item["action"] = "observe"
|
|
|
- item["reason"] = f"{original_reason}(原建议{original_action},但广告处于冷启动期{ad_age_days}天,不允许降价/关停,改为观察)"
|
|
|
- item["confidence"] = "low"
|
|
|
- item["recommended_change_pct"] = None # 清除调整幅度
|
|
|
- logger.warning(
|
|
|
- f"广告 {ad_id} 处于冷启动期({ad_age_days}天),"
|
|
|
- f"LLM建议 {original_action},已自动转换为 observe"
|
|
|
- )
|
|
|
+ if ad_age_days is not None:
|
|
|
+ if ad_age_days <= COLD_START_DAYS: # ≤3天:冷启动期(极度保护)
|
|
|
+ # 所有操作都改为observe
|
|
|
+ if action in ["bid_down", "pause", "bid_up"]:
|
|
|
+ original_action = action
|
|
|
+ original_reason = item.get("reason", "")
|
|
|
+ item["action"] = "observe"
|
|
|
+ item["reason"] = f"{original_reason}(原建议{original_action},但广告处于冷启动期{ad_age_days}天,极度保护,改为观察)"
|
|
|
+ item["confidence"] = "low"
|
|
|
+ item["recommended_change_pct"] = None
|
|
|
+ logger.warning(
|
|
|
+ f"广告 {ad_id} 处于冷启动期({ad_age_days}天≤{COLD_START_DAYS}天),"
|
|
|
+ f"LLM建议 {original_action},已自动转换为 observe"
|
|
|
+ )
|
|
|
+ elif ad_age_days <= EARLY_GROWTH_DAYS: # 4-7天:早期成长期(仅允许提价)
|
|
|
+ # 不允许降价/关停
|
|
|
+ if action in ["bid_down", "pause"]:
|
|
|
+ original_action = action
|
|
|
+ original_reason = item.get("reason", "")
|
|
|
+ item["action"] = "observe"
|
|
|
+ item["reason"] = f"{original_reason}(原建议{original_action},但广告处于早期成长期{ad_age_days}天,仅允许提价,改为观察)"
|
|
|
+ item["confidence"] = "low"
|
|
|
+ item["recommended_change_pct"] = None
|
|
|
+ logger.warning(
|
|
|
+ f"广告 {ad_id} 处于早期成长期({ad_age_days}天,4-{EARLY_GROWTH_DAYS}天),"
|
|
|
+ f"LLM建议 {original_action},已自动转换为 observe"
|
|
|
+ )
|
|
|
else:
|
|
|
item["cost_7d_avg"] = 0.0
|
|
|
except Exception as e:
|
|
|
@@ -1229,14 +1242,14 @@ async def apply_decisions(
|
|
|
f_roi = row.get("动态ROI_7日均值")
|
|
|
ad_age_days = row.get("ad_age_days")
|
|
|
|
|
|
- # 冷启动保护:广告年龄 ≤ 4天
|
|
|
+ # 冷启动保护:广告年龄 ≤ 3天(基于决策树)
|
|
|
if ad_age_days is not None and ad_age_days <= COLD_START_DAYS:
|
|
|
roi_str = f"{f_roi:.2f}" if not pd.isna(f_roi) else "数据不足"
|
|
|
normal_running_rows.append({
|
|
|
"ad_id": ad_id,
|
|
|
"action": "hold",
|
|
|
"dimension": "冷启动保护",
|
|
|
- "reason": f"广告年龄{ad_age_days}天 ≤ {COLD_START_DAYS}天(冷启动期),ROI={roi_str},消耗{cost_7d_avg:.2f}元/天,保持观察",
|
|
|
+ "reason": f"广告年龄{ad_age_days}天 ≤ {COLD_START_DAYS}天(冷启动期),ROI={roi_str},消耗{cost_7d_avg:.2f}元/天,极度保护",
|
|
|
"confidence": "high",
|
|
|
"source": "规则判断",
|
|
|
"cost_7d_avg": cost_7d_avg, # 用于排序
|