
AI 用户画像自动打标行为序列的归类与标签体系设计手动给用户打标签10 万用户要标到什么时候让 AI 从行为序列里自动发现模式、归类人群效率提升百倍。一、用户画像的痛点标签靠人拍脑袋传统的用户画像标签是怎么来的产品经理和运营坐一起头脑风暴列出几十个标签然后数据分析师写 SQL 把用户套进去。高消费用户怎么定义过去 30 天消费 500 元为什么是 500 不是 600为什么是 30 天不是 60 天这种基于经验的阈值划分看起来合理实际上很玄学。更麻烦的是业务变化了标签要跟着改。加了新功能、上了新活动用户行为变了原来的标签体系可能就失效了。找人再脑暴一轮、再改 SQL、再上线……这套流程太慢了。AI 打标签的核心思路变了不是人先定义标签再归类用户而是从用户行为里自动发现自然形成的分群。什么样的用户行为相似就自动归到一组然后 AI 再给这个群体生成可读的标签名。二、从行为序列到特征矩阵用户行为不是孤立的单次操作而是一串有时间顺序的序列。比如搜索 → 浏览商品A → 浏览商品B → 加购物车 → 浏览商品C → 下单。AI 打标签的第一步就是把这个序列转成数值特征。我常用的特征维度有四类import pandas as pd import numpy as np from datetime import datetime, timedelta def build_behavior_features(user_behavior_df, reference_date): 从用户行为序列构造特征矩阵 核心设计思路 - 不只统计做了什么更要统计什么时候做间隔多久 - 行为序列的节奏感比绝对数量更能区分用户类型 features pd.DataFrame() # # 1. 频率特征 —— 行为发生的密集程度 # # 只算最近 30 天太久远的行为对当前画像参考价值低 recent_30d user_behavior_df[ user_behavior_df[event_time] reference_date - timedelta(days30) ] # 每种行为的次数unstack 把长表转成宽表 freq recent_30d.groupby([user_id, event_type]).size().unstack(fill_value0) freq.columns [ffreq_{col} for col in freq.columns] features freq.reset_index() # # 2. 时序特征 —— 行为的时间规律 # # 用户活跃的天数不是行为次数反映粘性 active_days recent_30d.groupby(user_id)[event_date].nunique() features[active_days] features[user_id].map(active_days) # 平均每次行为间隔小时间隔越短说明使用越频繁 # diff 计算相邻事件的时间差单位从秒转成小时 time_gap recent_30d.sort_values([user_id, event_time]).groupby(user_id)[ event_time ].diff().dt.total_seconds() / 3600 features[avg_gap_hours] time_gap.groupby( recent_30d[user_id] ).mean().reindex(features[user_id]).values # # 3. 多样性特征 —— 行为类型的丰富程度 # # 使用过的功能/行为种类数 diversity recent_30d.groupby(user_id)[event_type].nunique() features[behavior_diversity] features[user_id].map(diversity) # # 4. 转化特征 —— 关键行为是否有 # # 是否有点击广告/加购/下单等转化行为 for event in [add_to_cart, place_order, click_ad]: converted recent_30d[ recent_30d[event_type] event ][user_id].unique() features[fhas_{event}] features[user_id].isin(converted).astype(int) return features.set_index(user_id) # 调用示例 # feature_matrix build_behavior_features( # user_behavior_df, # reference_datedatetime(2024, 7, 15) # )特征设计的原则是多维度 可解释。如果聚类结果出来一个群体被命名的标签是高频高转化用户那你必须能回溯到因为他们的 freq_place_order 10 且 avg_gap_hours 2而不是一个不可解释的黑盒。三、聚类打标从数字到画像有了特征矩阵就可以聚类了。K-Means 是最常用的但需要提前指定 K 值。我更推荐用轮廓系数Silhouette Score自动选最优 Kfrom sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler from sklearn.metrics import silhouette_score # # 1. 标准化 —— 消除量纲影响 # 比如 freq_click 可能是 0~1000active_days 是 0~30 # 不标准化的话数量大的特征会主导聚类结果 # scaler StandardScaler() scaled_features scaler.fit_transform(feature_matrix) # # 2. 自动选 K —— 遍历不同 K 值选轮廓系数最高的 # best_k, best_score 0, -1 scores [] for k in range(3, 11): # K 从 3 到 10 尝试 kmeans KMeans(n_clustersk, random_state42, n_init10) labels kmeans.fit_predict(scaled_features) score silhouette_score(scaled_features, labels) scores.append((k, score)) if score best_score: best_k, best_score k, score print(f最优聚类数: {best_k}, 轮廓系数: {best_score:.3f}) # # 3. 执行最终聚类 # kmeans KMeans(n_clustersbest_k, random_state42, n_init10) feature_matrix[cluster] kmeans.fit_predict(scaled_features) # # 4. 解读每个聚类的特征 —— 看看这群用户有什么特点 # # 每个聚类的特征均值跟全量均值对比找出突出的特征 cluster_profile feature_matrix.groupby(cluster).mean() global_mean feature_matrix.mean() # 偏离度聚类均值除以全局均值 1.5 表示这个特征在这个群体中特别突出 profile_deviation cluster_profile.div(global_mean, axis1) print(各群体特征偏离度1.5 为显著特征:) print(profile_deviation)四、AI 语义化让标签可读、可用聚类出来的结果只是一堆数字要变成人能看懂、运营能用的标签还得靠 LLM 来翻译。实际使用中建议给LLM提供每个群体与全量均值的偏离表而非原始特征值这样生成的标签描述更聚焦在区分点上不容易泛泛而谈。def generate_cluster_label(cluster_id, cluster_data, feature_names): 用 LLM 为聚类结果生成人类可读的标签 关键设计传入的不是原始数据而是特征摘要 —— 这个群体的显著特征是什么比全量高多少 # 构造特征描述 top_features cluster_data.abs().sort_values(ascendingFalse).head(5) feature_desc \n.join([ f- {feature_names[i]}: {高于 if v 0 else 低于}全量均值{abs(v):.0%} for i, v in top_features.items() ]) # Prompt 模板要求 LLM 生成带运营建议的标签 prompt f你是用户画像专家。以下是一个用户群体的特征请生成标签。 特征偏离信息相对于全量用户均值: {feature_desc} 请输出 1. 群体名称6字以内如高频冲动型 2. 一句话描述30字以内 3. 运营策略建议50字以内 # 实际使用时调用 LLM API # response call_llm_api(prompt) return prompt # 示例中返回 prompt实际返回 LLM 结果 # 为每个聚类生成标签 for cluster_id in range(best_k): cluster_data profile_deviation.loc[cluster_id] label_prompt generate_cluster_label( cluster_id, cluster_data, feature_matrix.columns.tolist() ) print(fCluster {cluster_id} prompt:\n{label_prompt}\n)这样生成的标签体系有几个好处标签有数据依据每个标签都能追溯到这个群体在哪些特征上突出自动更新数据变了重新跑一遍标签自动跟着变运营可落地每个标签附带运营建议不只是贴个名字五、总结AI 用户画像自动打标的核心思路是先发现、再解释用聚类算法从行为数据中自动发现自然形成的用户分群再用 LLM 把数学结果翻译成人话标签。跟传统人工打标签相比最大的区别是标签的依据从我觉得变成了数据显示。不会被业务方的预设偏见影响也不会因为业务变化而失效——因为标签是从数据里长出来的。当然这个方案也有边界。聚类效果强依赖于特征工程的质量如果特征设计得不好比如只用消费金额一个维度聚类结果也没什么区分度。另外对于用户量特别小几千人以下的场景聚类可能不稳定这时还是要结合人工经验。下一步可以做的事把标签体系跟推荐系统、精准推送打通让标签直接产生业务价值。本文由朱大喜原创下一篇聊聊 BI 看板查询优化别忘了关注~最后提醒一点这个方案在上生产之前建议先用灰度流量验证一周确认资源消耗在预期范围内再全量推送。我们在实际项目中因为跳过了这步有一次把缓存集群打挂了教训深刻。