AI自动化营销与增长黑客完全教程

教程简介

本教程全面讲解AI驱动的营销自动化与增长黑客核心技术,涵盖用户画像与精准分群、AI内容营销自动化、个性化推荐、邮件营销优化、社交媒体自动化运营、A/B测试与转化率优化、客户生命周期价值预测、流失预警与召回策略等核心内容,提供完整的AI营销自动化平台实战案例。

AI自动化营销与增长黑客完全教程

1. AI营销自动化概述与技术栈

营销的本质是在正确的时间,通过正确的渠道,向正确的人传递正确的信息。AI让这件事从"拍脑袋"变成了"算概率"。

AI营销自动化的核心能力:

  • 用户理解:画像构建、行为预测、分群聚类
  • 内容生成:文案、图片、视频的自动化生产
  • 触达优化:个性化推荐、发送时间优化、渠道选择
  • 效果度量:A/B测试、归因分析、ROI计算

技术栈全景:

┌──────────────────────────────────────────────────┐
│                 数据采集层                         │
│  埋点SDK / CDP / CRM / 广告平台API / 社交媒体API  │
├──────────────────────────────────────────────────┤
│                 数据处理层                         │
│  用户行为流 / 实时计算(Flink) / 批处理(Spark)      │
├──────────────────────────────────────────────────┤
│                 AI模型层                          │
│  用户分群 / 推荐系统 / LTV预测 / 流失预警          │
├──────────────────────────────────────────────────┤
│                 内容生成层                         │
│  LLM文案 / 图片生成(Stable Diffusion) / 视频合成   │
├──────────────────────────────────────────────────┤
│                 触达执行层                         │
│  邮件 / 短信 / Push / 社交媒体 / 广告投放          │
└──────────────────────────────────────────────────┘

核心框架与工具:

类别 工具
CDP Segment / RudderStack / 自建
用户分群 scikit-learn / PySpark MLlib
推荐系统 LightFM / RecBole / 自建双塔
内容生成 GPT-4o / Claude / Stable Diffusion
邮件营销 SendGrid / Mailgun / Brevo
A/B测试 Statsig / GrowthBook / 自建
数据仓库 ClickHouse / BigQuery / Snowflake

2. 用户画像与精准分群

2.1 用户画像构建

用户画像是所有营销策略的基础。将散落在各系统的用户数据统一到一个视图中。

import pandas as pd
from datetime import datetime, timedelta

class UserProfileBuilder:
    def __init__(self, events_df: pd.DataFrame):
        self.events = events_df

    def build_profile(self, user_id: str) -> dict:
        user_events = self.events[self.events["user_id"] == user_id]

        # 基础属性
        profile = {
            "user_id": user_id,
            "first_seen": user_events["timestamp"].min(),
            "last_seen": user_events["timestamp"].max(),
            "total_events": len(user_events),
        }

        # 行为特征
        profile.update(self._behavior_features(user_events))
        profile.update(self._purchase_features(user_events))
        profile.update(self._engagement_features(user_events))

        return profile

    def _behavior_features(self, events):
        return {
            "session_count": events["session_id"].nunique(),
            "avg_session_duration": events.groupby("session_id")["timestamp"]
                .apply(lambda x: (x.max() - x.min()).total_seconds()).mean(),
            "page_view_count": len(events[events["event_type"] == "page_view"]),
            "search_count": len(events[events["event_type"] == "search"]),
            "top_categories": events[events["event_type"] == "page_view"]
                ["category"].value_counts().head(5).to_dict(),
        }

    def _purchase_features(self, events):
        purchases = events[events["event_type"] == "purchase"]
        return {
            "purchase_count": len(purchases),
            "total_spend": purchases["amount"].sum() if len(purchases) else 0,
            "avg_order_value": purchases["amount"].mean() if len(purchases) else 0,
            "days_since_last_purchase": (
                (datetime.now() - purchases["timestamp"].max()).days
                if len(purchases) else None
            ),
            "preferred_payment": purchases["payment_method"]
                .mode().iloc[0] if len(purchases) else None,
        }

    def _engagement_features(self, events):
        last_30d = events[events["timestamp"] >= datetime.now() - timedelta(days=30)]
        return {
            "recency_30d": len(last_30d),
            "email_opened_30d": len(last_30d[last_30d["event_type"] == "email_open"]),
            "email_clicked_30d": len(last_30d[last_30d["event_type"] == "email_click"]),
            "is_active": len(last_30d) > 0,
        }

2.2 RFM分群模型

RFM(Recency, Frequency, Monetary)是经典的用户价值分群方法。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

def rfm_segmentation(df: pd.DataFrame, n_clusters: int = 5) -> pd.DataFrame:
    """基于RFM的用户分群"""
    now = datetime.now()

    rfm = df.groupby("user_id").agg({
        "timestamp": lambda x: (now - x.max()).days,  # Recency
        "order_id": "nunique",                         # Frequency
        "amount": "sum"                                # Monetary
    }).rename(columns={
        "timestamp": "recency",
        "order_id": "frequency",
        "amount": "monetary"
    })

    # 对数变换处理偏态分布
    rfm_log = np.log1p(rfm)

    # 标准化
    scaler = StandardScaler()
    rfm_scaled = scaler.fit_transform(rfm_log)

    # K-Means聚类
    kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
    rfm["segment"] = kmeans.fit_predict(rfm_scaled)

    # 标注分群含义
    segment_names = {
        0: "高价值活跃用户",
        1: "潜力用户",
        2: "沉睡用户",
        3: "流失风险用户",
        4: "新用户"
    }

    # 根据RFM均值自动映射分群名称
    segment_means = rfm.groupby("segment")[["recency", "frequency", "monetary"]].mean()
    sorted_segments = segment_means.sort_values(
        by=["frequency", "monetary", "recency"],
        ascending=[False, False, True]
    )

    mapping = {}
    for i, seg_id in enumerate(sorted_segments.index):
        if i == 0:
            mapping[seg_id] = "高价值活跃用户"
        elif i == len(sorted_segments) - 1:
            mapping[seg_id] = "流失风险用户"
        elif segment_means.loc[seg_id, "recency"] < rfm["recency"].median():
            mapping[seg_id] = "潜力用户"
        else:
            mapping[seg_id] = "沉睡用户"

    rfm["segment_name"] = rfm["segment"].map(mapping)
    return rfm

2.3 行为序列分群(深度学习方案)

import torch
import torch.nn as nn

class UserBehaviorEncoder(nn.Module):
    """基于Transformer的用户行为序列编码"""
    def __init__(self, vocab_size=10000, d_model=128, nhead=4, num_layers=2):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.pos_encoding = nn.Embedding(512, d_model)
        encoder_layer = nn.TransformerEncoderLayer(d_model, nhead, batch_first=True)
        self.transformer = nn.TransformerEncoder(encoder_layer, num_layers)
        self.fc = nn.Linear(d_model, 64)  # 输出64维用户向量

    def forward(self, action_ids, mask=None):
        seq_len = action_ids.size(1)
        pos = torch.arange(seq_len, device=action_ids.device).unsqueeze(0)
        x = self.embedding(action_ids) + self.pos_encoding(pos)
        x = self.transformer(x, src_key_padding_mask=mask)
        # 取最后一个有效token的输出
        x = x[:, -1, :]
        return self.fc(x)

# 使用行为向量做聚类分群
def embed_users(model, user_sequences):
    model.eval()
    with torch.no_grad():
        vectors = model(user_sequences)
    return vectors.numpy()

3. AI内容营销自动化(文案/图片/视频)

3.1 批量文案生成

from openai import OpenAI
import json

client = OpenAI()

def generate_marketing_copy(
    product: dict,
    audience: str,
    channel: str,
    tone: str = "专业且亲切",
    variants: int = 3
) -> list[dict]:
    """为指定产品、受众、渠道生成多个文案变体"""

    prompt = f"""你是一个资深营销文案专家。根据以下信息生成{variants}个不同版本的营销文案。

产品信息:
- 名称:{product['name']}
- 卖点:{', '.join(product['features'])}
- 价格:{product['price']}
- 目标受众:{audience}
- 发布渠道:{channel}
- 语气风格:{tone}

要求:
1. 每个版本侧重不同卖点
2. 根据渠道调整文案长度和格式
3. 包含明确的CTA(行动号召)

输出JSON数组,每个元素包含:
- title: 标题
- body: 正文
- cta: 行动号召
- hook: 开头吸引语"""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.8,
        response_format={"type": "json_object"}
    )

    result = json.loads(response.choices[0].message.content)
    return result.get("copies", result)

# 使用示例
product = {
    "name": "智能降噪耳机 Pro X",
    "features": ["主动降噪-45dB", "60小时续航", "空间音频", "多设备无缝切换"],
    "price": "¥1299"
}

copies = generate_marketing_copy(
    product=product,
    audience="25-35岁科技爱好者",
    channel="小红书",
    tone="活泼有趣"
)

3.2 图片素材生成

import requests
import base64

def generate_product_image(
    product_name: str,
    style: str,
    scene: str,
    aspect_ratio: str = "1:1"
) -> str:
    """调用Stable Diffusion API生成产品图"""

    prompt = f"""product photography of {product_name}, 
    {style} style, {scene} background, 
    professional lighting, high quality, 4k"""

    negative_prompt = "blurry, low quality, text, watermark, logo"

    # 调用本地Stable Diffusion WebUI API
    payload = {
        "prompt": prompt,
        "negative_prompt": negative_prompt,
        "steps": 30,
        "cfg_scale": 7.5,
        "width": 1024,
        "height": 1024,
        "sampler_name": "DPM++ 2M Karras",
        "batch_size": 1,
    }

    response = requests.post(
        "http://localhost:7860/sdapi/v1/txt2img",
        json=payload
    )

    images = response.json()["images"]
    return base64.b64decode(images[0])  # 返回图片二进制

# 批量生成不同风格的素材
styles = [
    ("极简主义", "纯白桌面"),
    ("赛博朋克", "霓虹都市夜景"),
    ("自然户外", "山顶日出"),
]

for style, scene in styles:
    img_data = generate_product_image("智能降噪耳机", style, scene)
    with open(f"assets/earphone_{style}.png", "wb") as f:
        f.write(img_data)

3.3 短视频脚本自动生成

def generate_video_script(
    product: dict,
    duration_seconds: int = 30,
    platform: str = "抖音"
) -> dict:
    """生成短视频脚本"""

    prompt = f"""为以下产品生成一个{duration_seconds}秒的{platform}短视频脚本。

产品:{product['name']}
核心卖点:{', '.join(product['features'])}

输出JSON格式:
{{
  "title": "视频标题",
  "scenes": [
    {{
      "duration": "0-3s",
      "visual": "画面描述",
      "voiceover": "旁白文字",
      "text_overlay": "字幕文字",
      "music_mood": "背景音乐风格"
    }}
  ],
  "hashtags": ["标签1", "标签2"]
}}"""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.8,
        response_format={"type": "json_object"}
    )

    return json.loads(response.choices[0].message.content)

4. 个性化推荐与千人千面

4.1 双塔推荐模型

import torch
import torch.nn as nn

class Tower(nn.Module):
    def __init__(self, input_dim, hidden_dims=[256, 128, 64]):
        super().__init__()
        layers = []
        prev_dim = input_dim
        for dim in hidden_dims:
            layers.extend([
                nn.Linear(prev_dim, dim),
                nn.BatchNorm1d(dim),
                nn.ReLU(),
                nn.Dropout(0.1)
            ])
            prev_dim = dim
        self.net = nn.Sequential(*layers)

    def forward(self, x):
        return self.net(x)

class TwoTowerModel(nn.Module):
    def __init__(self, user_input_dim, item_input_dim, embed_dim=64):
        super().__init__()
        self.user_tower = Tower(user_input_dim, [256, 128, embed_dim])
        self.item_tower = Tower(item_input_dim, [256, 128, embed_dim])

    def forward(self, user_features, item_features):
        user_emb = self.user_tower(user_features)
        item_emb = self.item_tower(item_features)

        # L2归一化后计算余弦相似度
        user_emb = nn.functional.normalize(user_emb, dim=-1)
        item_emb = nn.functional.normalize(item_emb, dim=-1)

        similarity = (user_emb * item_emb).sum(dim=-1)
        return similarity

# 训练:使用InfoNCE对比损失
def info_nce_loss(pos_scores, neg_scores, temperature=0.05):
    logits = torch.cat([pos_scores.unsqueeze(1), neg_scores], dim=1) / temperature
    labels = torch.zeros(logits.size(0), dtype=torch.long, device=logits.device)
    return nn.CrossEntropyLoss()(logits, labels)

4.2 实时个性化排序

class PersonalizedRanker:
    def __init__(self, model, item_index, feature_store):
        self.model = model
        self.item_index = item_index  # FAISS/向量数据库
        self.feature_store = feature_store

    def recommend(self, user_id: str, n_items: int = 20) -> list[dict]:
        # 1. 获取用户特征
        user_features = self.feature_store.get_user_features(user_id)
        user_tensor = torch.tensor(user_features).unsqueeze(0)

        # 2. 召回候选集(向量检索)
        with torch.no_grad():
            user_emb = self.model.user_tower(user_tensor).numpy()
        candidate_ids = self.item_index.search(user_emb, k=200)

        # 3. 精排
        item_features = self.feature_store.get_item_features(candidate_ids)
        item_tensor = torch.tensor(item_features)

        with torch.no_grad():
            scores = self.model(user_tensor.expand(len(candidate_ids), -1), item_tensor)

        # 4. 过滤已购买 + 多样性重排
        purchased = self.feature_store.get_purchased(user_id)
        results = []
        seen_categories = set()

        for idx in scores.argsort(descending=True):
            item_id = candidate_ids[idx]
            if item_id in purchased:
                continue

            item_info = self.feature_store.get_item_info(item_id)
            category = item_info["category"]

            # 确保类别多样性
            if category in seen_categories and len(results) < n_items // 2:
                continue

            results.append({
                "item_id": item_id,
                "score": scores[idx].item(),
                "reason": self._explain(user_features, item_info)
            })
            seen_categories.add(category)

            if len(results) >= n_items:
                break

        return results

    def _explain(self, user_features, item_info):
        """生成推荐理由"""
        if item_info["category"] in user_features.get("top_categories", {}):
            return f"根据您对{item_info['category']}的兴趣推荐"
        return "为您精选"

5. 邮件营销智能优化

5.1 发送时间优化

import numpy as np
from scipy import stats

class SendTimeOptimizer:
    """基于历史数据预测每个用户的最佳发送时间"""

    def __init__(self, open_events: pd.DataFrame):
        self.open_events = open_events
        self.user_profiles = {}

    def fit(self):
        for user_id, group in self.open_events.groupby("user_id"):
            hours = group["open_hour"].values
            days = group["open_dayofweek"].values

            # 用核密度估计建模打开时间分布
            hour_kde = stats.gaussian_kde(hours, bw_method=0.3)
            day_kde = stats.gaussian_kde(days, bw_method=0.5)

            self.user_profiles[user_id] = {
                "hour_kde": hour_kde,
                "day_kde": day_kde,
                "total_opens": len(group)
            }

    def predict_best_time(self, user_id: str) -> dict:
        if user_id not in self.user_profiles:
            # 冷启动:返回全局最优
            return {"hour": 10, "day": 2, "confidence": "low"}

        profile = self.user_profiles[user_id]

        # 在24小时中找峰值
        hours = np.arange(0, 24)
        hour_scores = profile["hour_kde"](hours)
        best_hour = hours[np.argmax(hour_scores)]

        # 在一周7天中找峰值
        days = np.arange(0, 7)
        day_scores = profile["day_kde"](days)
        best_day = days[np.argmax(day_scores)]

        return {
            "hour": int(best_hour),
            "day": int(best_day),
            "confidence": "high" if profile["total_opens"] >= 10 else "medium"
        }

5.2 邮件主题行优化

def generate_subject_lines(
    product: str,
    audience_segment: str,
    num_variants: int = 5
) -> list[str]:
    """生成多个主题行变体用于A/B测试"""

    prompt = f"""生成{num_variants}个邮件主题行。

产品:{product}
目标人群:{audience_segment}

要求:
1. 长度控制在15-25个中文字符
2. 避免垃圾邮件触发词(免费、赚钱、点击等)
3. 制造紧迫感或好奇心
4. 每个用不同的策略(提问/数字/故事/优惠/限量)

只输出主题行列表,每行一个。"""

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.9
    )

    lines = response.choices[0].message.content.strip().split("\n")
    return [line.strip("0123456789.、- ") for line in lines if line.strip()]

5.3 邮件内容个性化

def personalize_email(
    template: str,
    user_profile: dict,
    product_recommendations: list[dict]
) -> str:
    """根据用户画像个性化邮件内容"""

    prompt = f"""将以下邮件模板个性化。

用户画像:
- 姓名:{user_profile['name']}
- 最近浏览:{', '.join(user_profile.get('recent_views', []))}
- 购买历史:{user_profile.get('purchase_count', 0)}次
- 偏好类别:{user_profile.get('preferred_category', '未知')}
- 会员等级:{user_profile.get('tier', '普通')}

推荐商品:
{json.dumps(product_recommendations[:3], ensure_ascii=False)}

邮件模板:
{template}

规则:
1. 保持模板结构,只替换个性化部分
2. 推荐商品自然融入正文
3. 根据会员等级调整语气"""

    response = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.3
    )

    return response.choices[0].message.content

6. 社交媒体自动化运营

6.1 内容日历自动生成

def generate_content_calendar(
    brand: dict,
    days: int = 30,
    posts_per_day: int = 2
) -> list[dict]:
    """生成一个月的社交媒体内容日历"""

    prompt = f"""为品牌"{brand['name']}"生成{days}天的社交媒体内容计划。

品牌信息:
- 行业:{brand['industry']}
- 调性:{brand['tone']}
- 目标受众:{brand['audience']}
- 主推产品:{brand['products']}

每天{posts_per_day}条,覆盖以下类型(均衡分配):
1. 产品推广
2. 行业知识/干货
3. 用户互动(投票/提问)
4. 热点借势
5. 品牌故事/幕后

输出JSON数组,每条包含:
- day: 第几天
- time: 建议发布时间
- type: 内容类型
- topic: 主题
- draft: 文案草稿(100字以内)
- hashtags: 相关标签
- platform: 建议平台"""

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": prompt}],
        temperature=0.7,
        response_format={"type": "json_object"}
    )

    return json.loads(response.choices[0].message.content)

6.2 舆情监控与自动回复

class SocialMediaMonitor:
    def __init__(self, client, brand_keywords: list[str]):
        self.client = client
        self.keywords = brand_keywords

    def analyze_sentiment(self, mentions: list[dict]) -> list[dict]:
        """批量分析舆情情感"""
        results = []
        for mention in mentions:
            response = self.client.chat.completions.create(
                model="gpt-4o-mini",
                messages=[
                    {"role": "system", "content": """分析社交媒体提及的情感和意图。
输出JSON: {"sentiment": "positive/neutral/negative", "urgency": "low/medium/high", 
"topic": "主题", "needs_response": true/false, "suggested_response": "建议回复或null"}"""},
                    {"role": "user", "content": f"内容:{mention['text']}"}
                ],
                temperature=0,
                response_format={"type": "json_object"}
            )
            analysis = json.loads(response.choices[0].message.content)
            analysis["mention_id"] = mention["id"]
            results.append(analysis)

        return results

    def auto_reply(self, mention: dict, sentiment: dict) -> str:
        """生成自动回复(仅对正面/中性内容)"""
        if sentiment["sentiment"] == "negative" or sentiment["urgency"] == "high":
            return None  # 负面/紧急内容转人工

        if not sentiment["needs_response"]:
            return None

        response = self.client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[
                {"role": "system", "content": f"""你代表{self.keywords[0]}品牌回复社交媒体评论。
语气:友好、真诚、不过度营销。控制在50字以内。"""},
                {"role": "user", "content": f"用户说:{mention['text']}\n情感:{sentiment['sentiment']}"}
            ],
            temperature=0.7,
            max_tokens=100
        )
        return response.choices[0].message.content

7. A/B测试与转化率优化

7.1 样本量计算

from scipy import stats
import numpy as np

def calculate_sample_size(
    baseline_rate: float,
    min_detectable_effect: float,
    alpha: float = 0.05,
    power: float = 0.8
) -> int:
    """计算A/B测试所需最小样本量"""
    p1 = baseline_rate
    p2 = baseline_rate * (1 + min_detectable_effect)

    z_alpha = stats.norm.ppf(1 - alpha / 2)
    z_beta = stats.norm.ppf(power)

    p_bar = (p1 + p2) / 2

    n = ((z_alpha * np.sqrt(2 * p_bar * (1 - p_bar)) +
          z_beta * np.sqrt(p1 * (1 - p1) + p2 * (1 - p2))) ** 2) / (p2 - p1) ** 2

    return int(np.ceil(n))

# 示例:基线转化率5%,期望检测10%的提升
sample_size = calculate_sample_size(
    baseline_rate=0.05,
    min_detectable_effect=0.10
)
print(f"每组需要样本量: {sample_size}")  # 约 31,000

7.2 自动化A/B测试分析

from scipy.stats import chi2_contingency, ttest_ind

class ABTestAnalyzer:
    def analyze_proportions(self, control_conversions, control_total,
                            treatment_conversions, treatment_total):
        """比例型指标分析(转化率、点击率等)"""
        contingency_table = [
            [control_conversions, control_total - control_conversions],
            [treatment_conversions, treatment_total - treatment_conversions]
        ]

        chi2, p_value, _, _ = chi2_contingency(contingency_table)

        control_rate = control_conversions / control_total
        treatment_rate = treatment_conversions / treatment_total
        lift = (treatment_rate - control_rate) / control_rate

        return {
            "control_rate": control_rate,
            "treatment_rate": treatment_rate,
            "lift": lift,
            "p_value": p_value,
            "significant": p_value < 0.05,
            "confidence": (1 - p_value) * 100
        }

    def analyze_continuous(self, control_values, treatment_values):
        """连续型指标分析(客单价、停留时长等)"""
        t_stat, p_value = ttest_ind(treatment_values, control_values)

        return {
            "control_mean": np.mean(control_values),
            "treatment_mean": np.mean(treatment_values),
            "lift": (np.mean(treatment_values) - np.mean(control_values)) / np.mean(control_values),
            "p_value": p_value,
            "significant": p_value < 0.05
        }

    def multi_variant_test(self, variants: dict[str, list[float]]):
        """多变体测试(Bonferroni校正)"""
        from scipy.stats import f_oneway

        groups = list(variants.values())
        f_stat, p_value = f_oneway(*groups)

        n_comparisons = len(variants) * (len(variants) - 1) / 2
        adjusted_alpha = 0.05 / n_comparisons  # Bonferroni校正

        # 两两比较
        pairwise = {}
        variant_names = list(variants.keys())
        for i in range(len(variant_names)):
            for j in range(i + 1, len(variant_names)):
                t_stat, p_val = ttest_ind(variants[variant_names[i]], variants[variant_names[j]])
                pairwise[f"{variant_names[i]} vs {variant_names[j]}"] = {
                    "p_value": p_val,
                    "significant": p_val < adjusted_alpha
                }

        return {"overall_p_value": p_value, "pairwise": pairwise}

7.3 多臂老虎机(Thompson Sampling)

A/B测试需要固定流量分配,而多臂老虎机可以动态调整,减少劣质方案的流量浪费。

import numpy as np
from scipy.stats import beta

class ThompsonSamplingBandit:
    """Thompson Sampling实现,用于动态流量分配"""

    def __init__(self, variant_names: list[str]):
        self.variants = variant_names
        # 每个变体维护Beta分布的参数
        self.alpha = {v: 1 for v in variant_names}  # 成功次数
        self.beta_param = {v: 1 for v in variant_names}  # 失败次数

    def select_variant(self) -> str:
        """选择一个变体展示"""
        samples = {
            v: np.random.beta(self.alpha[v], self.beta_param[v])
            for v in self.variants
        }
        return max(samples, key=samples.get)

    def update(self, variant: str, converted: bool):
        """根据转化结果更新"""
        if converted:
            self.alpha[variant] += 1
        else:
            self.beta_param[variant] += 1

    def get_allocation(self) -> dict:
        """获取当前流量分配比例"""
        samples = {v: np.random.beta(self.alpha[v], self.beta_param[v])
                   for v in self.variants}
        total = sum(samples.values())
        return {v: s / total for v, s in samples.items()}

# 使用示例
bandit = ThompsonSamplingBandit(["方案A", "方案B", "方案C"])

for _ in range(10000):
    variant = bandit.select_variant()
    # 展示给用户,观察转化...
    converted = np.random.random() < {"方案A": 0.05, "方案B": 0.06, "方案C": 0.04}[variant]
    bandit.update(variant, converted)

print("最终分配:", bandit.get_allocation())

8. 客户生命周期价值预测

8.1 BG/NBD模型(概率模型)

# 使用lifetimes库实现BG/NBD + Gamma-Gamma模型
from lifetimes import BetaGeoFitter, GammaGammaFitter
from lifetimes.utils import summary_data_from_transaction_data

# 准备数据:需要user_id, date, amount
summary = summary_data_from_transaction_data(
    transactions_df,
    customer_id_col="user_id",
    datetime_col="transaction_date",
    monetary_value_col="amount",
    observation_period_end="2025-01-01"
)

# BG/NBD模型:预测未来购买次数
bgf = BetaGeoFitter(penalizer_coef=0.01)
bgf.fit(summary["frequency"], summary["recency"], summary["T"])

# 预测未来30天的购买概率
summary["predicted_purchases_30d"] = bgf.conditional_expected_number_of_purchases_up_to_time(
    30,
    summary["frequency"],
    summary["recency"],
    summary["T"]
)

# Gamma-Gamma模型:预测平均客单价
ggf = GammaGammaFitter(penalizer_coef=0.01)
ggf.fit(summary["frequency"], summary["monetary_value"])

# 计算CLV(未来12个月)
summary["predicted_clv"] = ggf.customer_lifetime_value(
    bgf,
    summary["frequency"],
    summary["recency"],
    summary["T"],
    summary["monetary_value"],
    time=12,  # 12个月
    discount_rate=0.01  # 月折现率
)

8.2 深度学习CLV预测

import torch
import torch.nn as nn

class CLVPredictor(nn.Module):
    """基于用户行为序列预测CLV"""
    def __init__(self, feature_dim, hidden_dim=128):
        super().__init__()
        self.encoder = nn.Sequential(
            nn.Linear(feature_dim, hidden_dim),
            nn.ReLU(),
            nn.Dropout(0.2),
            nn.Linear(hidden_dim, hidden_dim // 2),
            nn.ReLU()
        )
        # 多任务输出
        self.purchase_prob_head = nn.Linear(hidden_dim // 2, 1)
        self.monetary_head = nn.Linear(hidden_dim // 2, 1)
        self.churn_head = nn.Linear(hidden_dim // 2, 1)

    def forward(self, features):
        encoded = self.encoder(features)
        purchase_prob = torch.sigmoid(self.purchase_prob_head(encoded))
        monetary = torch.relu(self.monetary_head(encoded))
        churn_prob = torch.sigmoid(self.churn_head(encoded))
        return purchase_prob, monetary, churn_prob

# 多任务损失函数
def multi_task_loss(pred, target, weights=(1.0, 1.0, 0.5)):
    purchase_loss = nn.BCELoss()(pred[0], target["purchase"])
    monetary_loss = nn.MSELoss()(pred[1], target["monetary"])
    churn_loss = nn.BCELoss()(pred[2], target["churn"])
    return weights[0]*purchase_loss + weights[1]*monetary_loss + weights[2]*churn_loss

9. 流失预警与召回策略

9.1 流失预测模型

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_auc_score, precision_recall_curve

class ChurnPredictor:
    def __init__(self):
        self.model = xgb.XGBClassifier(
            n_estimators=500,
            max_depth=6,
            learning_rate=0.05,
            subsample=0.8,
            colsample_bytree=0.8,
            scale_pos_weight=5,  # 处理类别不平衡
            eval_metric="auc",
            early_stopping_rounds=50
        )

    def train(self, features_df: pd.DataFrame, labels: pd.Series):
        X_train, X_val, y_train, y_val = train_test_split(
            features_df, labels, test_size=0.2, stratify=labels, random_state=42
        )

        self.model.fit(
            X_train, y_train,
            eval_set=[(X_val, y_val)],
            verbose=False
        )

        val_pred = self.model.predict_proba(X_val)[:, 1]
        auc = roc_auc_score(y_val, val_pred)
        print(f"验证集AUC: {auc:.4f}")

        # 找最优阈值(最大化F1)
        precision, recall, thresholds = precision_recall_curve(y_val, val_pred)
        f1_scores = 2 * precision * recall / (precision + recall + 1e-8)
        optimal_idx = np.argmax(f1_scores)
        self.threshold = thresholds[optimal_idx]
        print(f"最优阈值: {self.threshold:.4f}, F1: {f1_scores[optimal_idx]:.4f}")

    def predict(self, features_df: pd.DataFrame) -> pd.DataFrame:
        proba = self.model.predict_proba(features_df)[:, 1]
        result = features_df.copy()
        result["churn_probability"] = proba
        result["churn_risk"] = pd.cut(
            proba,
            bins=[0, 0.3, 0.6, 1.0],
            labels=["低风险", "中风险", "高风险"]
        )
        return result

    def feature_importance(self) -> pd.DataFrame:
        importance = self.model.feature_importances_
        return pd.DataFrame({
            "feature": self.model.feature_names_in_,
            "importance": importance
        }).sort_values("importance", ascending=False)

9.2 智能召回策略

class ChurnRecallOrchestrator:
    """根据流失风险等级匹配不同的召回策略"""

    def __init__(self, llm_client):
        self.client = llm_client
        self.strategies = {
            "高风险": [
                {"action": "专属客服电话", "discount": 0.3, "channel": "phone"},
                {"action": "大额优惠券", "discount": 0.25, "channel": "sms+email"},
                {"action": "VIP权益升级", "discount": 0, "channel": "app_push"},
            ],
            "中风险": [
                {"action": "个性化推荐", "discount": 0.1, "channel": "email"},
                {"action": "积分翻倍活动", "discount": 0, "channel": "app_push"},
            ],
            "低风险": [
                {"action": "定期关怀邮件", "discount": 0, "channel": "email"},
            ]
        }

    def execute_recall(self, user_profile: dict, churn_risk: str) -> dict:
        strategy = self.strategies[churn_risk][0]  # 选择第一个策略

        # 用LLM生成个性化召回内容
        if strategy["channel"] in ["email", "sms", "app_push"]:
            content = self._generate_recall_content(user_profile, strategy)
        else:
            content = None

        return {
            "user_id": user_profile["user_id"],
            "risk": churn_risk,
            "strategy": strategy,
            "content": content
        }

    def _generate_recall_content(self, user_profile: dict, strategy: dict) -> str:
        prompt = f"""为流失风险用户生成召回内容。

用户信息:
- 姓名:{user_profile['name']}
- 最后购买:{user_profile.get('days_since_last_purchase', '未知')}天前
- 偏好品类:{user_profile.get('preferred_category', '未知')}
- 历史消费:{user_profile.get('total_spend', 0)}元

召回策略:{strategy['action']}
优惠力度:{strategy['discount']*100}%折扣

生成一段温暖、个性化的召回文案,100字以内。"""

        response = self.client.chat.completions.create(
            model="gpt-4o-mini",
            messages=[{"role": "user", "content": prompt}],
            temperature=0.7,
            max_tokens=200
        )
        return response.choices[0].message.content

10. 实战案例:AI营销自动化平台

将以上所有模块整合为一个完整的营销自动化平台。

10.1 平台架构

from fastapi import FastAPI, BackgroundTasks
from apscheduler.schedulers.asyncio import AsyncIOScheduler

app = FastAPI(title="AI营销自动化平台")
scheduler = AsyncIOScheduler()

# 核心服务
churn_predictor = ChurnPredictor()
recall_orchestrator = ChurnRecallOrchestrator(client)
send_time_optimizer = SendTimeOptimizer(open_events_df)
ranker = PersonalizedRanker(model, item_index, feature_store)

@app.post("/campaign/create")
async def create_campaign(config: dict, background_tasks: BackgroundTasks):
    """创建营销活动"""
    campaign = {
        "id": generate_id(),
        "name": config["name"],
        "type": config["type"],  # recall / promotion / nurture
        "audience_filter": config["audience"],
        "content_variants": config["variants"],
        "schedule": config["schedule"],
        "status": "pending"
    }

    # 异步执行受众筛选和内容准备
    background_tasks.add_task(prepare_campaign, campaign)
    return campaign

async def prepare_campaign(campaign: dict):
    """准备营销活动:筛选受众、生成内容、调度发送"""
    # 1. 筛选目标用户
    users = filter_audience(campaign["audience_filter"])

    # 2. 为每个用户个性化内容
    for user in users:
        profile = get_user_profile(user["user_id"])

        # 选择最佳变体
        variant = select_variant(campaign["content_variants"], profile)

        # 个性化内容
        content = personalize_content(variant, profile)

        # 计算最佳发送时间
        best_time = send_time_optimizer.predict_best_time(user["user_id"])

        # 调度发送
        scheduler.add_job(
            send_message,
            "date",
            run_date=compute_next_time(best_time),
            args=[user, content, campaign["id"]]
        )

@app.get("/analytics/dashboard")
async def get_analytics():
    """营销数据看板"""
    return {
        "active_campaigns": get_active_campaigns(),
        "today_metrics": {
            "emails_sent": get_sent_count("today"),
            "open_rate": get_open_rate("today"),
            "click_rate": get_click_rate("today"),
            "conversion_rate": get_conversion_rate("today"),
        },
        "churn_alerts": {
            "high_risk_count": get_churn_count("high"),
            "recall_success_rate": get_recall_success_rate()
        },
        "clv_distribution": get_clv_distribution()
    }

# 定时任务:每日流失预警
@scheduler.scheduled_job("cron", hour=8, minute=0)
async def daily_churn_check():
    """每日8点执行流失预警"""
    features = build_churn_features()
    predictions = churn_predictor.predict(features)

    high_risk = predictions[predictions["churn_risk"] == "高风险"]
    for _, user in high_risk.iterrows():
        recall_orchestrator.execute_recall(
            get_user_profile(user["user_id"]),
            "高风险"
        )

if __name__ == "__main__":
    scheduler.start()
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8080)

11. 合规要求与隐私保护

11.1 数据合规框架

营销自动化涉及大量用户数据,必须严格遵守相关法规。

核心法规要求

法规 地域 核心要求
《个人信息保护法》 中国 收集目的明确、用户同意、最小必要
GDPR 欧盟 数据最小化、用户知情权、删除权
CAN-SPAM 美国 邮件必须含退订链接、真实发件人
CCPA 美国加州 消费者知情权、拒绝出售权

11.2 技术实现

class PrivacyCompliance:
    """隐私合规模块"""

    @staticmethod
    def anonymize_user_data(user_data: dict) -> dict:
        """数据匿名化"""
        import hashlib
        anonymized = user_data.copy()
        # 姓名脱敏
        if "name" in anonymized:
            anonymized["name"] = anonymized["name"][0] + "***"
        # 手机号脱敏
        if "phone" in anonymized:
            anonymized["phone"] = anonymized["phone"][:3] + "****" + anonymized["phone"][-4:]
        # 邮箱脱敏
        if "email" in anonymized:
            local, domain = anonymized["email"].split("@")
            anonymized["email"] = local[:2] + "***@" + domain
        # 用户ID哈希化
        anonymized["user_id"] = hashlib.sha256(
            anonymized["user_id"].encode()
        ).hexdigest()[:16]
        return anonymized

    @staticmethod
    def check_consent(user_id: str, purpose: str) -> bool:
        """检查用户是否已授权"""
        consent = get_user_consent(user_id)
        return consent.get(purpose, False)

    @staticmethod
    def add_unsubscribe_link(content: str, user_id: str) -> str:
        """为邮件添加退订链接"""
        unsubscribe_url = f"https://example.com/unsubscribe?uid={user_id}"
        return content + f"\n\n如不想收到此类邮件,请点击退订:{unsubscribe_url}"

    @staticmethod
    def handle_deletion_request(user_id: str):
        """处理用户数据删除请求"""
        # 1. 删除用户个人数据
        delete_user_pii(user_id)
        # 2. 保留匿名化的行为数据(用于统计)
        anonymize_user_events(user_id)
        # 3. 从营销列表中移除
        remove_from_marketing_lists(user_id)
        # 4. 记录删除日志
        log_deletion_request(user_id)

11.3 合规检查清单

在上线任何营销自动化功能前,逐一检查:

COMPLIANCE_CHECKLIST = {
    "data_collection": [
        "是否有明确的隐私政策说明数据用途",
        "是否获得用户明确同意(opt-in)",
        "是否遵循最小必要原则",
        "敏感数据是否加密存储"
    ],
    "marketing_messages": [
        "邮件是否包含退订链接",
        "退订是否在48小时内生效",
        "短信是否包含退订方式",
        "发送频率是否在合理范围内"
    ],
    "user_rights": [
        "是否支持数据导出(用户查看权)",
        "是否支持数据删除(被遗忘权)",
        "是否支持撤回同意",
        "是否在30天内响应用户请求"
    ],
    "data_security": [
        "数据传输是否使用TLS加密",
        "是否有访问控制和审计日志",
        "敏感数据是否脱敏处理",
        "是否有数据泄露应急预案"
    ]
}

def run_compliance_audit() -> dict:
    """执行合规审计"""
    results = {}
    for category, checks in COMPLIANCE_CHECKLIST.items():
        results[category] = []
        for check in checks:
            # 实际项目中应对接具体的检查逻辑
            results[category].append({
                "check": check,
                "status": "pass" if verify_check(check) else "fail",
                "evidence": get_evidence(check)
            })
    return results

以上就是AI自动化营销的完整技术方案。从用户画像构建到智能召回,从内容生成到效果优化,每个环节都可以用AI提效。但技术只是手段,核心仍然是理解用户、尊重用户。在追求转化率的同时,合规和隐私保护是不可逾越的底线。

内容声明

本文内容为AI技术学习教程,仅供学习参考。如涉及技术问题,欢迎通过 xurj005@163.com 与我们交流。

目录