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提效。但技术只是手段,核心仍然是理解用户、尊重用户。在追求转化率的同时,合规和隐私保护是不可逾越的底线。