尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

混合推荐算法在垂直电商场景的工程实践:以鲜花销售为例

混合推荐算法在垂直电商场景的工程实践:以鲜花销售为例 如果你正在开发一个电商项目尤其是像鲜花销售这样品类相对垂直、用户需求波动大的领域你很可能面临一个经典难题如何让推荐系统既“懂”商品又“懂”人单纯基于用户历史行为的协同过滤容易陷入“信息茧房”新用户或新品上架时束手无策。而只依赖商品属性的内容推荐又显得过于机械缺乏个性化。结果往往是推荐列表要么一成不变要么杂乱无章转化率始终上不去。本文要讨论的“基于混合推荐算法的鲜花销售推荐系统”其核心价值就在于解决这个“懂商品”与“懂人”的割裂问题。它不是一个简单的算法拼凑而是一套旨在平衡个性化与多样性、兼顾冷启动与实时性的工程化解决方案。对于中小型垂直电商的开发者而言这种混合思路往往比追求某个单一算法的极致精度更具实战意义。读完本文你将能清晰地理解混合推荐系统的核心架构并掌握一个可落地的、从数据准备、算法融合到系统实现的完整流程。我们会用具体的代码和配置示例带你一步步构建一个针对鲜花销售场景的推荐系统原型。1. 混合推荐系统为什么是鲜花销售的“解药”在深入技术细节之前我们必须先回答为什么混合推荐算法特别适合鲜花销售这个场景鲜花电商有其独特的业务属性强季节性/节日性情人节、母亲节、七夕的推荐逻辑与平日截然不同。高情感附加值用户购买的不只是花材更是“表达”、“祝福”、“氛围”。商品标签如“浪漫”、“慰问”、“开业”比物理属性更重要。严重的冷启动问题新品新花束上架频繁且用户复购周期相对较长纯行为数据稀疏。需求多样性用户可能为自己购买日常装饰也可能为他人购买礼物意图差异巨大。单一的推荐算法在这里会“跛脚”基于内容的推荐 (Content-Based)能很好地对鲜花商品打标签颜色、花语、场合、价格区间解决新品冷启动。但如果只推荐相似花束用户永远看不到可能感兴趣的其他风格缺乏惊喜。协同过滤 (Collaborative Filtering)包括用户协同喜欢这束花的人也喜欢...和物品协同看了这束花的人还看了...。它能发现跨类目的潜在兴趣但严重依赖用户-物品交互数据。一个新用户或一束新花束由于没有交互记录会被系统忽略这就是“冷启动”难题。混合推荐的核心思想是“扬长避短”。它通过策略性地组合多种推荐算法让系统在不同场景下调用不同的“子模块”从而输出一个更优的综合结果。对于鲜花销售系统一个典型的混合策略可能是对新用户或行为数据少的用户优先使用基于内容的推荐根据其注册信息如性别、选择“送恋人”或当前浏览的商品属性进行推荐。对有丰富浏览/购买记录的老用户主要使用协同过滤挖掘其深层兴趣偏好。在最终生成推荐列表时对以上多种算法产生的候选集进行加权融合、去重、排序确保列表既有相关性又有多样性。接下来我们将从零开始构建这样一个系统的核心模块。2. 系统核心架构与模块拆解我们的混合推荐系统将采用经典的“召回-排序”两层架构并融入混合策略。整体架构如下图所示概念描述用户请求 │ ▼ [召回层 (Recall)] — 并行触发多个召回策略 ├── 策略A基于用户行为的协同过滤召回 ├── 策略B基于商品标签的内容召回 └── 策略C基于热门/季节的规则召回 │ ▼ [融合与粗排层] — 对多路召回结果进行合并、去重、初步打分 │ ▼ [排序层 (Ranking)] — 使用更精细的模型如逻辑回归、深度学习进行精排 │ ▼ [业务规则过滤] — 应用库存、价格、强制策略等业务规则 │ ▼ 最终推荐列表核心模块说明召回层负责从海量商品库中快速筛选出几百到几千个可能相关的候选商品。速度是关键允许一定的精度损失。我们在这里实现混合。排序层负责对召回后的少量候选商品进行精准打分排序。模型更复杂特征更丰富。业务规则层保证推荐结果符合商业逻辑例如过滤掉无库存商品、在特定节日置顶相关商品等。本文我们将重点实现召回层的混合策略并搭建一个完整的系统原型。排序层可以简化为基于规则或简单模型的排序以便快速跑通流程。3. 环境准备与数据建模3.1 技术栈选择后端框架Spring Boot (Java)。成熟、生态完善适合快速构建微服务。数据存储业务数据库MySQL。存储用户、商品、订单等核心业务数据。推荐数据/缓存Redis。存储用户画像、实时行为、热门商品列表、召回结果缓存利用其高性能。算法与计算协同过滤使用 Apache Mahout 或 Spark MLlib 的离线计算结果存入Redis。内容推荐基于商品标签的向量化计算使用内存计算或轻量级引擎。消息队列RabbitMQ。用于异步处理用户行为日志更新实时特征。3.2 数据库表设计核心简化版1. 商品表flower_itemCREATE TABLE flower_item ( id int(11) NOT NULL AUTO_INCREMENT COMMENT 商品ID, name varchar(255) NOT NULL COMMENT 商品名称, category varchar(50) DEFAULT NULL COMMENT 品类如玫瑰、百合、礼盒, price decimal(10,2) NOT NULL COMMENT 价格, tags varchar(500) DEFAULT NULL COMMENT 标签JSON数组如[浪漫, 红色, 情人节, 高端], season_tag varchar(50) DEFAULT NULL COMMENT 季节/节日标签, is_active tinyint(1) DEFAULT 1 COMMENT 是否上架, PRIMARY KEY (id), KEY idx_category (category), KEY idx_season (season_tag) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT鲜花商品表;2. 用户行为表user_behaviorCREATE TABLE user_behavior ( id bigint(20) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL COMMENT 用户ID, item_id int(11) NOT NULL COMMENT 商品ID, behavior_type varchar(20) NOT NULL COMMENT 行为类型view, collect, cart, buy, behavior_weight float DEFAULT 1.0 COMMENT 行为权重如buy5, cart3, collect2, view1, timestamp datetime NOT NULL COMMENT 行为时间, PRIMARY KEY (id), KEY idx_user_item (user_id,item_id), KEY idx_timestamp (timestamp) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户行为日志表;注此表数据量会很大实际生产中会同步到Hive或ClickHouse进行分析并实时流入消息队列。3. 用户画像表user_profileCREATE TABLE user_profile ( user_id int(11) NOT NULL COMMENT 用户ID, preferred_price_range varchar(50) DEFAULT NULL COMMENT 偏好价格区间如100-300, preferred_tags varchar(500) DEFAULT NULL COMMENT 偏好标签JSON数组从行为中计算得出, last_active_time datetime DEFAULT NULL, PRIMARY KEY (user_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户画像表可定期更新;4. 核心算法模块实现我们将实现三个核心召回器并通过一个混合管理器来协调它们。4.1 召回器一基于物品的协同过滤 (ItemCF)ItemCF的核心思想是如果很多用户同时喜欢物品A和物品B那么A和B是相似的。当用户喜欢A时就可以将B推荐给他。步骤1计算物品相似度离线任务我们使用Python借助pandas来演示离线计算过程计算结果会存入Redis。# 文件offline/item_cf_calculator.py import pandas as pd from sklearn.metrics.pairwise import cosine_similarity import redis import json # 模拟从数据仓库读取用户-物品行为矩阵 # 假设数据格式user_id, item_id, weight (行为加权得分) def load_behavior_data(): # 这里从文件或数据库读取示例用模拟数据 data { user_id: [1, 1, 2, 2, 2, 3, 3, 4, 4, 4], item_id: [101, 102, 101, 103, 104, 102, 104, 101, 103, 105], weight: [5, 3, 5, 4, 1, 3, 1, 5, 4, 2] # 假设购买5收藏3浏览1 } df pd.DataFrame(data) return df def calculate_item_similarity(df): # 构建用户-物品评分矩阵 user_item_matrix df.pivot_table(indexuser_id, columnsitem_id, valuesweight, fill_value0) # 计算物品之间的余弦相似度 item_similarity cosine_similarity(user_item_matrix.T) # 转置后计算列物品之间的相似度 item_ids user_item_matrix.columns.tolist() similarity_df pd.DataFrame(item_similarity, indexitem_ids, columnsitem_ids) return similarity_df def save_to_redis(similarity_df): r redis.Redis(hostlocalhost, port6379, db0) # 为每个物品存储最相似的N个物品及其分数 top_n 20 for item_id in similarity_df.columns: # 获取与该物品最相似的其他物品排除自身 sim_series similarity_df[item_id].drop(item_id) top_similar sim_series.nlargest(top_n).to_dict() # 存储为JSON字符串 r.set(fitem_cf_sim:{item_id}, json.dumps(top_similar)) print(ItemCF相似度矩阵已存入Redis.) if __name__ __main__: df load_behavior_data() sim_df calculate_item_similarity(df) save_to_redis(sim_df)步骤2在线推荐服务Java Spring Boot// 文件src/main/java/com/flower/recommend/service/impl/ItemCFRecommenderServiceImpl.java Service public class ItemCFRecommenderServiceImpl implements RecommenderService { Autowired private RedisTemplateString, String redisTemplate; Override public ListInteger recommend(Integer userId, int topK) { // 1. 获取用户近期有过正反馈购买、收藏、加购的商品列表 ListInteger userPositiveItems getUserPositiveItems(userId); // 从数据库或缓存查询 if (userPositiveItems.isEmpty()) { return Collections.emptyList(); // 无行为数据退回其他策略 } // 2. 从Redis获取每个物品的相似物品并聚合得分 MapInteger, Double candidateScoreMap new HashMap(); for (Integer itemId : userPositiveItems) { String key item_cf_sim: itemId; String simJson redisTemplate.opsForValue().get(key); if (simJson ! null) { MapString, Double simMap JSON.parseObject(simJson, new TypeReferenceMapString, Double() {}); for (Map.EntryString, Double entry : simMap.entrySet()) { Integer candidateItemId Integer.parseInt(entry.getKey()); Double similarity entry.getValue(); // 累加相似度得分 candidateScoreMap.put(candidateItemId, candidateScoreMap.getOrDefault(candidateItemId, 0.0) similarity); } } } // 3. 过滤掉用户已经有过行为的商品 userPositiveItems.forEach(candidateScoreMap::remove); // 4. 按得分排序取TopK return candidateScoreMap.entrySet().stream() .sorted(Map.Entry.Integer, DoublecomparingByValue().reversed()) .limit(topK) .map(Map.Entry::getKey) .collect(Collectors.toList()); } private ListInteger getUserPositiveItems(Integer userId) { // 模拟从数据库查询用户最近购买或收藏的商品ID列表 // 实际应从user_behavior表查询 behavior_type in (buy,collect,cart) 的记录 return Arrays.asList(101, 102); // 示例数据 } }4.2 召回器二基于内容标签的推荐 (Content-Based)该推荐器根据商品标签的匹配度进行推荐特别适合解决冷启动。步骤1构建商品标签向量离线/在线均可我们将商品标签转化为向量。这里采用简单的TF-IDF思想但更简化为每个标签赋予一个全局ID。// 文件src/main/java/com/flower/recommend/service/impl/ContentBasedRecommenderServiceImpl.java Service public class ContentBasedRecommenderServiceImpl implements RecommenderService { Autowired private ItemMapper itemMapper; // MyBatis Mapper用于查询商品 // 内存中维护标签到索引的映射 private MapString, Integer tagIndexMap new ConcurrentHashMap(); private ListString indexTagList new ArrayList(); PostConstruct public void initTagIndex() { // 从数据库加载所有商品提取去重标签 ListFlowerItem allItems itemMapper.selectAllActiveItems(); SetString allTags new HashSet(); for (FlowerItem item : allItems) { ListString tags JSON.parseArray(item.getTags(), String.class); allTags.addAll(tags); if (item.getSeasonTag() ! null) { allTags.add(item.getSeasonTag()); } } // 构建映射 int index 0; for (String tag : allTags) { tagIndexMap.put(tag, index); indexTagList.add(tag); index; } System.out.println(初始化标签库共 tagIndexMap.size() 个标签。); } /** * 将商品对象转换为标签向量二进制表示出现则为1 */ private boolean[] itemToVector(FlowerItem item) { boolean[] vector new boolean[tagIndexMap.size()]; ListString tags JSON.parseArray(item.getTags(), String.class); for (String tag : tags) { Integer idx tagIndexMap.get(tag); if (idx ! null) vector[idx] true; } if (item.getSeasonTag() ! null) { Integer idx tagIndexMap.get(item.getSeasonTag()); if (idx ! null) vector[idx] true; } return vector; } /** * 计算两个向量的余弦相似度二进制简化版即Jaccard相似度思想 */ private double calculateSimilarity(boolean[] v1, boolean[] v2) { int intersection 0; int union 0; for (int i 0; i v1.length; i) { if (v1[i] v2[i]) intersection; if (v1[i] || v2[i]) union; } return union 0 ? 0 : (double) intersection / union; } Override public ListInteger recommend(Integer userId, int topK) { // 1. 获取目标用户的画像或最近交互的商品 FlowerItem userPreferredItem getPreferredItemForUser(userId); // 简化取最近浏览的一个商品 if (userPreferredItem null) { // 如果用户完全没有行为可以基于用户注册信息如选择“送恋人”生成一个虚拟商品向量 return recommendByDefaultProfile(userId, topK); } // 2. 计算目标商品与所有商品的相似度 boolean[] targetVector itemToVector(userPreferredItem); ListFlowerItem allCandidates itemMapper.selectAllActiveItems(); PriorityQueueItemScore heap new PriorityQueue(Comparator.comparingDouble(ItemScore::getScore).reversed()); for (FlowerItem candidate : allCandidates) { if (candidate.getId().equals(userPreferredItem.getId())) { continue; // 排除自身 } boolean[] candVector itemToVector(candidate); double score calculateSimilarity(targetVector, candVector); heap.offer(new ItemScore(candidate.getId(), score)); } // 3. 返回TopK ListInteger result new ArrayList(); for (int i 0; i topK !heap.isEmpty(); i) { result.add(heap.poll().itemId); } return result; } // 内部类用于存储商品ID和得分 private static class ItemScore { int itemId; double score; ItemScore(int itemId, double score) { this.itemId itemId; this.score score; } double getScore() { return score; } } private FlowerItem getPreferredItemForUser(Integer userId) { // 模拟查询用户最近浏览的一个商品 return itemMapper.selectItemById(101); // 示例 } private ListInteger recommendByDefaultProfile(Integer userId) { // 基于默认画像如热门商品、季节商品推荐 // 此处简化为返回热门商品 return itemMapper.selectHotItems(topK); } }4.3 召回器三基于热门与规则的召回 (Rule-Based)这是一个保底策略确保推荐列表的多样性和业务目标。// 文件src/main/java/com/flower/recommend/service/impl/RuleBasedRecommenderServiceImpl.java Service public class RuleBasedRecommenderServiceImpl implements RecommenderService { Autowired private ItemMapper itemMapper; Autowired private RedisTemplateString, String redisTemplate; Override public ListInteger recommend(Integer userId, int topK) { ListInteger result new ArrayList(); // 策略1近期热门商品从Redis读取由离线任务计算 String hotKey rec:hot:weekly; String hotJson redisTemplate.opsForValue().get(hotKey); if (hotJson ! null) { ListInteger hotItems JSON.parseArray(hotJson, Integer.class); result.addAll(hotItems.stream().limit(topK / 2).collect(Collectors.toList())); } // 策略2季节/节日特供商品 String currentSeasonTag getCurrentSeasonTag(); // 例如 valentine, mother_day ListInteger seasonalItems itemMapper.selectItemsBySeasonTag(currentSeasonTag, topK / 3); result.addAll(seasonalItems); // 策略3高价利润商品商业策略 if (isHighValueUser(userId)) { // 判断是否为高价值用户 ListInteger highMarginItems itemMapper.selectHighMarginItems(topK / 4); result.addAll(highMarginItems); } // 去重并截取 return result.stream().distinct().limit(topK).collect(Collectors.toList()); } private String getCurrentSeasonTag() { // 简单实现根据月份判断 // 实际应结合具体节日日期 return spring; // 示例 } private boolean isHighValueUser(Integer userId) { // 根据用户历史消费金额判断 return false; // 示例 } }5. 混合推荐管理器策略融合与调度这是系统的“大脑”负责协调多个召回器并决定最终结果。// 文件src/main/java/com/flower/recommend/service/impl/HybridRecommendationServiceImpl.java Service public class HybridRecommendationServiceImpl implements RecommendationService { Autowired private ItemCFRecommenderServiceImpl itemCFRecommender; Autowired private ContentBasedRecommenderServiceImpl contentBasedRecommender; Autowired private RuleBasedRecommenderServiceImpl ruleBasedRecommender; Override public ListFlowerItem getRecommendation(Integer userId, String scene, int size) { // scene: 推荐场景如 home_page, item_detail, cart_page MapString, ListInteger recallResults new HashMap(); // 1. 并行或串行调用多个召回器 // 这里为了演示使用串行生产环境可使用CompletableFuture并行调用 ListInteger itemCFList itemCFRecommender.recommend(userId, 100); ListInteger contentBasedList contentBasedRecommender.recommend(userId, 100); ListInteger ruleBasedList ruleBasedRecommender.recommend(userId, 50); recallResults.put(itemCF, itemCFList); recallResults.put(content, contentBasedList); recallResults.put(rule, ruleBasedList); // 2. 融合与重排序策略 ListInteger finalItemIds fuseAndRank(recallResults, userId, scene); // 3. 获取商品详细信息 return getItemDetails(finalItemIds.subList(0, Math.min(size, finalItemIds.size()))); } private ListInteger fuseAndRank(MapString, ListInteger recallResults, Integer userId, String scene) { // 权重配置可根据场景、用户状态动态调整 MapString, Double strategyWeight new HashMap(); if (isNewUser(userId)) { // 新用户侧重内容和规则 strategyWeight.put(itemCF, 0.2); strategyWeight.put(content, 0.5); strategyWeight.put(rule, 0.3); } else { // 老用户侧重协同过滤 strategyWeight.put(itemCF, 0.6); strategyWeight.put(content, 0.2); strategyWeight.put(rule, 0.2); } // 打分合并 MapInteger, Double scoreMap new HashMap(); for (Map.EntryString, ListInteger entry : recallResults.entrySet()) { String strategy entry.getKey(); ListInteger items entry.getValue(); double weight strategyWeight.getOrDefault(strategy, 0.0); // 为每个召回结果中的商品按位置赋予基础分如第一名100分第二名95分... for (int i 0; i items.size(); i) { int itemId items.get(i); double baseScore 100.0 - i; // 简单线性衰减 double weightedScore baseScore * weight; scoreMap.put(itemId, scoreMap.getOrDefault(itemId, 0.0) weightedScore); } } // 按总分排序 return scoreMap.entrySet().stream() .sorted(Map.Entry.Integer, DoublecomparingByValue().reversed()) .map(Map.Entry::getKey) .collect(Collectors.toList()); } private boolean isNewUser(Integer userId) { // 根据用户行为数量判断 return false; // 示例 } private ListFlowerItem getItemDetails(ListInteger itemIds) { if (itemIds.isEmpty()) { return Collections.emptyList(); } // 调用商品服务批量查询 // 示例直接使用Mapper return itemMapper.selectItemsByIds(itemIds); } }6. 系统运行与效果验证6.1 启动与接口测试启动服务确保MySQL、Redis服务已启动运行Spring Boot应用。触发离线计算运行Python脚本计算ItemCF相似度矩阵并存入Redis。同时应有定时任务计算热门商品列表。调用推荐接口通过API工具如Postman调用推荐接口。示例推荐接口// 文件src/main/java/com/flower/recommend/controller/RecommendController.java RestController RequestMapping(/api/recommend) public class RecommendController { Autowired private HybridRecommendationServiceImpl recommendationService; GetMapping(/forUser) public ApiResponseListFlowerItem getRecommendationsForUser( RequestParam Integer userId, RequestParam(defaultValue home_page) String scene, RequestParam(defaultValue 10) Integer size) { ListFlowerItem items recommendationService.getRecommendation(userId, scene, size); return ApiResponse.success(items); } }请求示例GET http://localhost:8080/api/recommend/forUser?userId123sceneitem_detailsize106.2 验证推荐结果验证时应从业务角度检查多样性推荐列表是否包含了不同品类、价格区间的鲜花相关性对于有历史行为的老用户推荐的商品是否与其过去喜好相关新鲜度是否有新品或季节商品被推荐出来冷启动为新用户userId0或新ID推荐时是否避免了空白结果是否以内容或热门推荐为主实时性用户刚刚浏览或收藏某个商品后刷新推荐列表相关推荐是否有所变化这需要实时行为日志接入7. 常见问题与排查思路问题现象可能原因排查方式解决方案推荐结果重复率高缺乏多样性1. 混合权重配置不合理某一策略权重过高。2. 召回源本身多样性不足如热门商品列表过短。3. 融合后的去重逻辑有误。1. 检查fuseAndRank方法中的权重配置。2. 分别查看各召回器ItemCF, Content, Rule的独立输出结果。3. 检查最终结果列表的去重逻辑。1. 调整策略权重增加内容或规则召回的比例。2. 在规则召回中增加更多样化的来源如新品、折扣品。3. 确保融合时不是简单拼接而是加权打分。新用户或新商品得不到推荐冷启动问题1. ItemCF依赖历史行为新用户/商品无数据。2. 内容召回的特征工程不完善新商品标签未生效。1. 查看新用户的推荐日志看走了哪条分支。2. 检查新商品的标签是否已入库并参与向量计算。3. 检查规则召回是否生效。1. 强化isNewUser逻辑对新用户显著提高内容和规则召回的权重。2. 确保商品上架后其标签能及时进入标签库并触发向量更新或在下一次请求时动态计算。3. 引入“猜你喜欢”等兜底策略。推荐结果响应慢1. 召回阶段串行执行耗时叠加。2. 内容召回实时计算向量相似度商品库大时性能差。3. Redis或数据库查询慢。1. 使用APM工具或日志记录各召回阶段耗时。2. 检查内容召回中selectAllActiveItems()是否全表扫描。3. 检查Redis连接和命令性能。1. 使用CompletableFuture将多个召回器改为并行执行。2. 为内容召回建立商品特征向量缓存离线计算好或增量更新。3. 对ItemCF和热门数据做好Redis缓存避免实时复杂查询。线上效果不佳点击率低1. 特征工程不到位标签质量差。2. 排序策略过于简单。3. 业务规则过滤过强。1. 分析曝光-点击日志看哪些商品有点击哪些没有。2. 进行A/B测试对比不同混合权重的效果。3. 检查是否过滤掉了有库存的热门商品。1. 优化商品标签体系引入更细粒度的特征如颜色饱和度、花材数量。2. 引入机器学习排序模型LR、GBDT、DeepFM使用更多用户和上下文特征。3. 定期review业务规则避免好心办坏事。8. 最佳实践与工程建议数据质量是基石商品标签需要运营人员精心维护标签体系的设计如“场合-情感-价格-花材”直接影响内容召回效果。行为日志确保view,collect,cart,buy等行为能被准确、及时地收集。建议在前端进行埋点通过消息队列异步上报避免影响主流程性能。离线与在线分离像ItemCF相似度计算、用户画像更新、热门商品统计等重计算任务必须设计成离线定时任务如每天凌晨运行。在线服务API只负责轻量的读取、融合和排序保证高并发下的响应速度。缓存策略多级缓存高频访问的数据如商品基本信息、召回结果应使用Redis缓存。缓存更新制定合理的缓存过期和更新策略。例如商品相似度矩阵可以每天更新一次并全量替换Redis中的旧数据。可观测性与迭代埋点日志必须记录每一次推荐请求的userId,scene,返回的商品ID列表以及后续的用户行为是否点击、加购、购买。这是评估推荐效果和迭代算法的唯一依据。A/B测试框架搭建简单的A/B测试系统可以方便地对比不同算法策略、不同参数对核心指标点击率、转化率、GMV的影响。从简单开始逐步复杂化不要一开始就追求复杂的深度学习模型。本文实现的“协同过滤内容规则”混合召回配合简单的加权融合已经能解决80%的常见问题且易于理解和调试。当基础系统稳定运行并积累了足够数据后再考虑引入更精细的排序模型精排使用逻辑回归、梯度提升树等模型对召回后的几十个商品进行精准打分。业务规则是安全网永远保留一个强规则的召回通道如热门、新品、清仓。它不仅是冷启动的保障也能在算法出现异常时确保推荐列表不会“开天窗”。在最终输出前一定要经过业务规则过滤层确保无库存、已下架、不符合当前政策的商品不会被推荐。构建一个有效的推荐系统技术实现只是第一步更重要的是与业务场景深度结合并通过数据驱动持续迭代。本文提供的混合推荐系统框架为你搭建了一个坚实且可扩展的起点。你可以在此基础上深入探索特征工程、模型优化和线上服务治理让推荐真正成为驱动鲜花电商增长的核心引擎。
返回列表