营销推荐系统的大模型化——从协同过滤到生成式推荐的架构转型一、协同过滤在电商推荐中的天花板效应某中型电商平台的推荐系统基于 Item-CF基于物品的协同过滤已经运行了 3 年。算法逻辑是找到与用户最近购买/浏览商品相似的其他商品按相似度排序推荐。这套算法在平台发展初期效果显著推荐点击率一度达到 8.5%。但到 2025 年 Q1推荐点击率逐渐下降到 5.2%。团队做了深入分析后发现三个结构性原因交互稀疏性问题加剧平台 SKU 数量从 12 万增长到 50 万但用户行为仍然集中在 Top 5% 的热门商品上。长尾商品几乎没有行为数据导致 Item-CF 无法为这些商品计算有效的相似度冷启动商品的推荐完全随机。无法感知场景和意图用户搜索年会礼服和日常通勤装协同过滤推荐的是相似的女性服装但它无法区分正式场合和日常场景的差异。推荐列表中出现了一件晚礼服又出现了一件运动T恤用户感觉推荐不搭。推荐理由的黑盒化系统只能告诉用户买了 A 的人也买了 B但无法给出更符合人性的推荐理由如这款风衣和你上周购买的那条围巾很搭配秋季通勤最佳组合。协同过滤的底层假设是相似用户有相似偏好但这个假设在行为稀疏和场景复杂时效果衰减严重。引入大语言模型的目标不是替代协同过滤而是用生成式能力弥补协同过滤的短板。二、生成式推荐的架构设计召回 排序 生成大模型在推荐系统中的角色不是计算相似度这个任务协同过滤做得更好而是理解用户意图、生成推荐理由和做跨品类的组合推荐。这套架构的工作流程分为四个阶段阶段一用户意图提取。将用户最近 30 天的行为数据浏览、搜索、加购、购买、收藏输入 LLM提取用户的购物意图标签。例如用户当前处于换季购置阶段偏好日系简约风格预算在 300~800 元/件对棉麻面料有明确偏好。阶段二多路召回。Item-CF行为相似度 向量检索语义相似度 实时行为最近浏览的同品类三路召回合并去重形成 200 个候选集。阶段三意图加权精排。在特征排序时将 LLM 提取的意图标签作为排序特征之一如风格匹配度、价格带匹配度让排序结果更符合用户的当前意图。阶段四推荐理由生成。将 Top 10 推荐商品和用户画像一起送入 LLM为每件商品生成个性化的推荐理由。三、Prompt 工程让 LLM 成为懂你的导购生成式推荐的核心竞争力在于推荐理由的自然语言描述。一句好的推荐理由能让点击率提升 30% 以上。/** * 推荐理由生成器基于用户画像 商品特征生成个性化推荐文案 */ Service public class RecommendationReasonGenerator { private static final String SYSTEM_PROMPT 你是一位资深电商导购。根据用户的购物偏好、浏览历史和当前场景 为每个推荐商品生成个性化推荐理由。 规则 1. 推荐理由必须具体、有信息量不能是猜你喜欢这类通用口径 2. 如果用户有相关购买/浏览历史在理由中提及如配你上周买的...) 3. 对于搭配推荐说明搭配逻辑如同色系、风格呼应 4. 每个理由 15~30 字简洁有力不浮夸 5. 对于用户已购买的同类商品标注您已拥有类似商品是否考虑升级 ; /** * 批量生成推荐理由 */ public ListRecommendationItem generateReasons( UserProfile userProfile, ListProductCandidate candidates) { try { String prompt buildReasoningPrompt(userProfile, candidates); String llmResponse llmClient.chat(prompt); return parseReasons(llmResponse, candidates); } catch (Exception e) { log.error(推荐理由生成失败, 使用默认理由降级, e); // 降级使用基于商品属性的模板化理由 return generateDefaultReasons(candidates); } } /** * 构建包含用户画像和商品信息的 Prompt */ private String buildReasoningPrompt(UserProfile userProfile, ListProductCandidate candidates) { StringBuilder prompt new StringBuilder(); prompt.append(SYSTEM_PROMPT).append(\n\n); // 用户画像 prompt.append(【用户画像】\n); prompt.append(String.format(- 性别: %s, 年龄段: %s\n, userProfile.getGender(), userProfile.getAgeGroup())); prompt.append(String.format(- 偏好的风格: %s\n, String.join(、, userProfile.getPreferredStyles()))); prompt.append(String.format(- 平均客单价: %.0f 元\n, userProfile.getAvgOrderAmount())); // 最近行为 prompt.append(- 最近浏览: ); prompt.append(userProfile.getRecentBrowses().stream() .limit(5) .map(p - p.getProductName()) .collect(Collectors.joining(、))); prompt.append(\n); prompt.append(- 最近购买: ); prompt.append(userProfile.getRecentPurchases().stream() .limit(3) .map(p - p.getProductName()) .collect(Collectors.joining(、))); prompt.append(\n\n); // 推荐商品列表 prompt.append(【推荐商品】为每件生成推荐理由\n); for (int i 0; i candidates.size(); i) { ProductCandidate p candidates.get(i); prompt.append(String.format( %d. %s | 品类: %s | 风格: %s | 价格: %.0f元 | 卖点: %s\n, i 1, p.getProductName(), p.getCategory(), String.join(/, p.getStyles()), p.getPrice(), String.join(、, p.getHighlights()) )); } prompt.append(\n输出 JSON 数组不要其他文字\n); prompt.append( [ {index: 1, reason: 推荐理由}, {index: 2, reason: 推荐理由} ] ); return prompt.toString(); } /** * 降级方案基于规则生成模板化推荐理由 */ private ListRecommendationItem generateDefaultReasons( ListProductCandidate candidates) { return candidates.stream().map(c - { String reason; if (c.getCategory() ! null c.getPrice() ! null) { reason String.format(%s品类热销 | %s风格 | ¥%.0f, c.getCategory(), String.join(/, c.getStyles()), c.getPrice()); } else { reason 根据您的浏览偏好推荐; } return new RecommendationItem(c, reason); }).collect(Collectors.toList()); } }/** * 用户意图提取器从行为数据中提取购物意图标签 * 离线批量执行结果存入用户画像缓存 */ Service public class UserIntentExtractor { private static final String INTENT_PROMPT 分析以下用户的近期购物行为数据提取其购物意图标签。 输出格式JSON { scenario: 场景描述如换季购置、节日送礼、家居装修, stylePreferences: [风格1, 风格2], priceRange: {min: 100, max: 500}, categoryFocus: [当前关注品类], purchaseUrgency: LOW / MEDIUM / HIGH, brandPreferences: [偏好品牌], materialPreferences: [偏好材质] } ; /** * 批量提取用户意图定时任务每 4 小时执行一次 */ Scheduled(cron 0 0 */4 * * ?) public void batchExtractIntents() { try { // 获取最近有行为的活跃用户 ListLong activeUsers userActivityRepo .findActiveUsers(LocalDateTime.now().minusDays(1)); // 分批处理每批 50 个用户 ListListLong batches partition(activeUsers, 50); for (ListLong batch : batches) { for (Long userId : batch) { try { UserBehaviorData behaviorData collectBehaviorData(userId); String prompt buildIntentPrompt(behaviorData); String llmResponse llmClient.chat(prompt); UserIntent intent parseIntent(llmResponse); userIntentCache.save(userId, intent); } catch (Exception e) { log.error(用户意图提取失败, userId: {}, userId, e); // 单个用户失败不中断批量处理 } } } } catch (Exception e) { log.error(批量意图提取异常, e); } } }四、生成式推荐的 A/B 实验与数据分析在灰度环境做了为期 3 周的 A/B 实验。对照组为纯 Item-CF 推荐实验组为Item-CF 召回 LLM 意图加权 LLM 推荐理由。核心指标变化推荐点击率从 5.2% 提升到 7.1%提升 36%。提升的主要驱动力是推荐理由——用户更倾向于点击那些给出了明确理由的推荐。配你上周买的黑色通勤包秋日通勤满分搭配比猜你喜欢的点击率高出 2.3 倍。推荐转化率从 1.8% 提升到 2.6%提升 44%。意图加权使推荐结果更贴近用户真实需求减少了看过不买的无效曝光。长尾商品曝光占比从 12% 提升到 28%。LLM 的语义理解能力让它可以为数据稀疏的长尾商品生成有意义的推荐理由而不依赖行为数据。用户停留时长推荐模块的浏览时长从平均 38 秒增加到 52 秒。推荐理由的讲故事能力让用户更愿意花时间浏览推荐列表。成本方面单次推荐的 LLM 调用成本约 0.01 元含意图查询 推荐理由生成。日均 120 万次推荐请求其中 30% 触发推荐理由生成36 万次日成本约 3600 元。相对于推荐带来的 GMV 增量ROI 约为 15:1。五、生成式推荐的局限与下一步方向从协同过滤到生成式推荐不是替代而是补充。当前方案仍有两个明显的局限实时性瓶颈LLM 推理延迟300~600ms无法满足推荐系统的 100ms 要求。当前方案将 LLM 调用拆分为离线意图提取和在线理由生成两部分但推荐理由的生成仍然在关键路径上。下一步计划引入边缘推理小型模型部署到 Kubernetes 集群内网将延迟压缩到 100ms 以内。多样性 vs 准确性的博弈LLM 倾向于推荐安全的选择——它从用户画像中提取到偏好日系简约后倾向于推荐大量类似风格的商品导致推荐结果多样性下降。需要在 Prompt 中显式要求避免过度集中建议包含 1~2 个风格拓展推荐。交互式推荐的演进当前推荐是一次性的——用户看到列表后要么点击要么忽略。下一步计划尝试交互式推荐用户可以对推荐结果做出反馈不太喜欢这个风格LLM 实时调整后续推荐。这需要更低的推理延迟和更复杂的多轮对话管理。推荐系统的大模型化本质上是将推荐从数字匹配升级为语义理解。协同过滤告诉你数据上是相似的LLM 告诉你风格上是搭配的。二者组合才能在准确性和可解释性之间找到适合电商场景的平衡点。