营销推荐系统的大模型化——从协同过滤到生成式推荐的架构转型
营销推荐系统的大模型化——从协同过滤到生成式推荐的架构转型一、协同过滤在电商推荐中的天花板效应某中型电商平台的推荐系统基于 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 告诉你风格上是搭配的。二者组合才能在准确性和可解释性之间找到适合电商场景的平衡点。

相关新闻

支付系统的分布式事务:两阶段提交与 TCC 的落地对比

支付系统的分布式事务:两阶段提交与 TCC 的落地对比

支付系统的分布式事务:两阶段提交与 TCC 的落地对比 一、一笔支付,背后可能涉及三个服务、两个数据库和一个第三方 在电商支付链路中,一笔典型的支付操作涉及以下步骤:扣减用户账户余额、创建支付订单、调用第三方支付渠道、增加商…

2026/10/13 5:38:46 阅读更多 →
职场文职增效方案|OpenClaw 本地自动化,5 分钟完成 Windows 11搭建

职场文职增效方案|OpenClaw 本地自动化,5 分钟完成 Windows 11搭建

🦞OpenClaw(小龙虾) Windows 11 一键部署实操教程|零代码・内置依赖・解压即用 📋适配系统说明 兼容 Windows 11 家庭版、专业版、正式版全系列版本 📌项目基础介绍 OpenClaw 是一款在开源社区中备受关注…

2026/10/9 14:29:08 阅读更多 →
AI 服务流量回放:用历史请求构建推理服务回归测试集

AI 服务流量回放:用历史请求构建推理服务回归测试集

AI 服务流量回放:用历史请求构建推理服务回归测试集 一、你的推理服务升级了新模型,测试集准确率涨了,线上用户投诉翻了倍 推理服务的回归测试有一个独特的难题:测试集的分布和真实流量的分布经常不一致。你的测试集覆盖了 100 类…

2026/10/9 14:28:25 阅读更多 →

最新新闻

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

进销存管理系统数据库设计:从建表SQL到存储过程触发器实战

简介:这是一份数据库课程设计完整参考项目——某商店进销存管理系统,面向计算机类专业学生、数据库初学者及需要完成课设的开发者,用于解决数据库原理课程设计中从系统分析到数据库实现的全流程问题。资源为RAR压缩包,共3个文件&a…

2026/10/13 5:38:34 阅读更多 →
轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

轻量级任务流引擎 rea:把重复操作变成一条命令行流水线

周五下午,我盯着屏幕上那个快要跑完的批处理任务,心里很清楚:今天这已经是第七次重复同样的操作了。从压缩日志、生成报表、按规则归档,到清理临时目录、把结果文件挪到共享目录,每一步单独看都不复杂,合在…

2026/10/13 5:38:34 阅读更多 →
Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

Spring Boot集成AI对话接口:从零搭建HR政策问答机器人

1. 项目定位:为什么是 Spring Boot AI 对话接口1.1 HR 政策问答机器人的核心需求拆解这个项目叫“AI全栈12-02”,名字里已经透露出完整的信息:它属于一条 AI 全栈学习路线的中期实践,前一步多半是把模型 API 跑通,从这…

2026/10/13 5:38:34 阅读更多 →
CS2启动器Overflow闪退根源与显存调度修复指南

CS2启动器Overflow闪退根源与显存调度修复指南

1. 问题本质:这不是“闪退”,而是内存管理机制被触发的保护性中断 “CS2更新后Valve界面闪退、Overflow溢出错误”——这个标题里藏着一个被广泛误读的关键点。很多用户一看到“闪退”就下意识归因于显卡驱动或系统兼容性,甚至反复重装客户端…

2026/10/13 5:38:34 阅读更多 →
x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

x64dbg动态调试实战:环境配置、脚本自动化与避坑指南

简介:x64dbg 2025版逆向调试工具,面向软件安全分析人员、恶意代码逆向工程师以及CTF竞赛爱好者,用于在缺少源码、难以静态阅读的场景下开展动态调试,覆盖断点控制、单步跟踪、内存与寄存器监控、异常处理等核心操作,并…

2026/10/13 5:38:34 阅读更多 →
大厂Python编码规范的核心要点与工程实践

大厂Python编码规范的核心要点与工程实践

1. 为什么大厂如此重视Python编码规范?第一次接触Google的Python代码时,我盯着那些整齐划一的import分组和严格的命名规则发了半天呆。当时很不理解为什么要把时间花在这些"表面功夫"上,直到后来自己维护了三个月前的代码才恍然大悟…

2026/10/13 5:37:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →