一、阶段定位
前面我们把数据处理、智能分析的功能都搭建好了,这一阶段主要做用户画像挖掘。系统有了原始数据,也能做分析,但没法归纳出用户群体的特征,这也是我们需要补齐的地方。
这个模块原本是组长负责的,对方只搭了一个简单框架,没有写能运行的业务代码。后面就由我接手,从零开始写代码、重构功能,同时适配项目现有的数据规则,把框架里隐藏的问题逐一修复。
二、项目核心痛点
接手框架测试后,发现里面大大小小问题挺多,算法运行和接口稳定性都不太理想。 原始代码没有做数据预处理,直接拿原始数据跑聚类。数据量一大,运行速度就特别慢。而且不同数据的数值差距很大,数值偏高的字段会主导分类结果,最后聚类出来的效果并不理想。
调用大模型生成用户人设时,返回的格式乱七八糟,也没有对应的容错处理。一旦解析出错,整个接口就会直接报错。
桑基图的数据组装逻辑有漏洞,图表里的节点顺序经常错乱,部分场景还会缺失节点,可视化展示效果很差。
代码也没考虑极端情况,数据集数据很少、或者内容单一的时候,聚类算法直接就运行失败了。
三、技术落地实现
3.1 8 维特征工程
我从评论数据里提取了八个维度的用户特征,涵盖评分喜好、评论习惯、内容倾向等内容,用来区分不同的用户群体。
class FeatureEngineer: def extract_features(self, df): if "user_id" not in df.columns: return self._extract_review_level_features(df) return self._extract_user_level_features(df)3.2 KMeans 聚类 + 自动选 K
我选用 KMeans 算法做用户分群,结合轮廓系数算出最合适的聚类数量。同时针对数据量少的情况,单独写了备用逻辑,避免算法运行报错。
def cluster(self, feature_df, min_k=2, max_k=8): available_cols = [c for c in FEATURE_COLS if c in feature_df.columns] X = feature_df[available_cols].fillna(0).values if len(X) < 10: return self._fallback_cluster(feature_df) # 小样本降级 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) best_k = min_k best_score = -1 best_model = None max_k = min(max_k, len(X) // 2) # 防止K大于样本数/2 for k in range(min_k, max_k + 1): model = KMeans(n_clusters=k, random_state=42, n_init=10, max_iter=300) labels = model.fit_predict(X_scaled) score = silhouette_score(X_scaled, labels) if score > best_score: best_score = score best_k = k best_model = model3.3 情感旅程桑基图
我按照用户消费的不同阶段划分关键词,统计每个阶段对应的情感分布,再计算不同阶段之间的情感流转关系,最后整理成桑基图可用的数据格式。
STAGE_KEYWORDS = { "下单阶段": ["下单", "购买", "发货", "付款", "下了", "拍了"], "收货阶段": ["收到", "收货", "包装", "快递", "物流", "到了", "签收"], "使用初期": ["刚用", "刚开始", "初次", "第一次", "试用", "开箱", "刚收到"], "长期使用": ["用了", "一周", "一个月", "耐用", "效果", "稳定", "持续", "长期"], } def compute_sankey_data(self, df, feature_df): stages = list(STAGE_KEYWORDS.keys()) # 先给每条评论分配阶段 # 再计算每个阶段的情感分布 # 最后计算阶段间的情感流转 # 生成nodes和links四、AI 辅助开发记录
用户画像模块是我接手后从零完善的,原来只有个空架子。开发时我会用AI帮我想思路,但特征提取、聚类算法、桑基图数据结构这些具体代码都是我自己写的。
最开始做用户分群,我只想到用评分、评论长度两个特征。AI建议我可以从用户行为、评论习惯、情感倾向等方向扩展。我结合我们项目的评论数据,最后定了8个特征:
- avg_rating:评分倾向,归一化到0-1
- avg_word_count:评论长度,归一化
- image_rate:带图率
- followup_rate:追评率
- neg_word_density:负面词密度,我列了"不好"、"差"、"烂"这些负面词来统计
- preferred_dimension:关注维度,用关键词匹配物流/质量/外观/服务/价格
- time_preference:时间偏好,20点到6点算夜间
- language_style:语言风格,统计理性词(测试、参数、对比)和感性词(太好了、超喜欢、棒棒)
这些都在 feature_engineer.py#L26-L66 里。
聚类直接用原始数据跑效果很差,AI说要做特征标准化,不然数值大的特征会主导结果。我就加上了 StandardScaler ( cluster_service.py#L47-L48 )。还加了个小样本的判断:如果样本少于10条,就直接用降级逻辑,按评分高/中/低分群,不然KMeans会报错 ( cluster_service.py#L110-L123 )。
桑基图的数据结构我之前没接触过,不知道怎么组织。AI给我看了个示例:要有nodes数组存节点,links数组存关联。我就照着这个思路,先按关键词把评论分到4个阶段(下单→收货→使用初期→长期使用),然后每个阶段算3种情感的数量,最后按顺序生成节点,这样图表就不会乱了 ( cluster_service.py#L338-L431 )。
大模型生成用户人设时,最开始名称很敷衍,就是"用户群1"这种。我改了好多版提示词,要求生成2-4字的昵称、50字以内的描述、3条运营建议。还用正则 re.search(r'$$.*$$', response, re.DOTALL) 提取,就算格式不对也有兜底 ( cluster_service.py#L125-L181 )。
五、优化细节
优化 1:小样本降级逻辑
数据集里只有几条数据时,KMeans 算法会因为样本不足运行失败。我加了备用逻辑,数据量过少就直接按照评分划分人群,接口可以正常返回结果。
优化 2:LLM 输出格式三重校验
大模型输出格式没法固定,我依次尝试原生解析、正则提取、备用模板三种方式层层兜底,现在基本不会出现解析失败的情况。
优化 3:桑基图节点强制排序
之前节点顺序混乱,图表逻辑看着很别扭。我固定了节点的生成顺序,按照消费阶段搭配情感类型排列,流转逻辑清晰了很多。
优化 4:特征标准化
不同特征的数值范围差别很大,会干扰聚类结果。加入标准化处理后,所有特征的权重变得均衡,聚类的精准度也提升了。
六、阶段总结
做完这个模块,我明显感觉到本地测试和线上项目运行完全是两回事。代码在自己电脑上跑测试案例一切正常,部署到项目里,各种各样的边界问题都会冒出来。
算法能算出结果只是基础,想要在线上稳定运行,异常处理、参数调试这些工作都不能少。接手的时候这个模块只有空架子,经过一步步开发和优化,最后实现了全部功能,也算是超额完成了分配的任务。
AI 能帮我们快速搭基础代码、拓宽思路,但算法落地过程里的细节调试、问题排查,还是得靠自己慢慢摸索积累经验。