冷启动推荐:新用户的第一个推荐不能太离谱

发布时间:2026/7/22 12:26:20
冷启动推荐:新用户的第一个推荐不能太离谱 冷启动推荐新用户的第一个推荐不能太离谱一、第一个推荐就是第一印象冷启动的代价比想象中贵新用户打开 App 的 5 秒内推荐系统要给出第一批内容。这 5 秒没有历史行为数据、没有画像标签、没有任何个性化信号——只有设备信息、IP 归属地和注册渠道。推荐系统面对的是一个几乎完全空白的用户向量。冷启动推荐的质量直接影响次日留存率。某内容平台的 A/B 测试数据表明冷启动推荐优化前新用户次日留存为 32%把冷启动策略从全量热门切换为人口统计 分群推荐后次日留存提升到 38%。6 个百分点的提升看起来不大但换算成用户规模——日新增 10 万用户每天多留住 6,000 人一个月多留住 18 万人。冷启动的代价不是技术问题是用户增长问题。然而另一个现实是新用户的第一个推荐不能太离谱——不能因为系统没有用户数据就完全随机推荐或者推送极端小众的内容。用户的第一印象一旦形成这个 App 推的东西和我没关系挽回的成本远高于让他一开始就感兴趣的成本。冷启动的目标不是精准匹配而是避免明显失配。二、冷启动的三阶段从人口统计到行为协同冷启动不是一个一次搞定的动作而是一个分阶段渐进式的过程。用户从注册到积累足够行为数据通常需要经历三个推荐策略的切换。第一阶段首次请求 → 前 10 次行为纯人口统计推荐。根据设备机型高端/中端/低端推断消费能力根据 IP 归属地推断城市层级一线/新一线/二三线根据注册渠道应用商店/信息流广告/社交分享推断兴趣倾向。这些信号经过统计建模映射到一个预设的人群分组上。分组内推荐的内容是该人群在过去 7 天内点击率最高的 Top 50 内容。这个阶段的推荐准确率很低——同一消费能力的用户兴趣千差万别。但目标是不太离谱不是精准。一个一线城市 iPhone 用户打开 App看到的是数码、生活方式、职场类内容而不是农村养殖技术——这就算合格。第二阶段10-100 次行为内容特征的浅层匹配。用户已经有了少量行为点击、浏览时长、滑动行为足够做初级的兴趣判断。这个阶段切换到基于内容的推荐——用户点击过的内容提取其标签和 Embedding用标签匹配和向量相似度召回类似内容。不做协同过滤用户太少计算不出有意义的关系不做深度模型数据太少模型会过拟合。第三阶段100 次行为完整接入个性化推荐管道。行为数据足够启动协同过滤和双塔模型。此时冷启动流程结束用户进入正常的个性化推荐链路。三阶段的切换阈值10 次、100 次需要根据业务场景调整。短视频场景行为密度高阈值可以设高一些50 次 / 500 次图文场景行为密度低阈值适当降低5 次 / 50 次。三、工程实现分群标签系统和瀑布流策略冷启动推荐的工程核心是一套分群标签系统。设备和渠道信息在注册时已经可以获取需要预计算好每个分群的推荐内容池。分群维度至少包括设备价格段0-2000 / 2000-5000 / 5000 元、操作系统iOS / Android、城市层级一线 / 新一线 / 二三线 / 四线及以下、注册时段0-6 / 6-12 / 12-18 / 18-24 时、注册渠道自然搜索 / 信息流广告 / 社交分享 / 地推。这么多维度叉乘下来分群数量是 3 × 2 × 4 × 4 × 4 384 个。不是每个分群都有足够的数据量——四线城市凌晨通过地推注册的 iOS 高端机用户这个分群可能根本没有历史数据。所以分群标签不是严格笛卡尔积而是层级兜底先匹配最精细的分群如果该分群没有足够数据 500 条历史行为向上聚合——去掉渠道维度再不够去掉时段维度一直聚合到全量热门作为最终兜底。type ColdStartStrategy struct { scores map[string]float64 } func (s *ColdStartStrategy) GetRecommendations(user ColdStartUser) []string { // 按优先级尝试不同粒度的分群 levels : []string{ fmt.Sprintf(%s_%s_%s_%s_%s, user.DevicePrice, user.OS, user.CityLevel, user.TimeSlot, user.Channel), fmt.Sprintf(%s_%s_%s_%s, user.DevicePrice, user.OS, user.CityLevel, user.TimeSlot), fmt.Sprintf(%s_%s_%s, user.DevicePrice, user.OS, user.CityLevel), global, // 全量热门兜底 } for _, level : range levels { items : s.fetchTopItems(level, 20) if len(items) 10 { // 至少有10个候选才使用该分群 return items } } return s.fetchTopItems(global, 20) }这种层级兜底策略确保每个新用户都能拿到推荐结果即使某些分群的统计样本非常稀少。分群内容池通过离线 Spark 任务每天更新一次——计算每个分群的 Top 50 高点击内容写入 Redis HashKey 为coldstart:{level}Field 为分群标识。四、冷启动的边界隐私合规和反馈质量冷启动依赖设备信息做分群而设备信息的使用受隐私法规的严格约束。IMEI、IDFA 等设备唯一标识在用户未授权的情况下不能采集。可用的替代信息包括IP 归属地只能用于城市级别不能精确定位、UA 中的设备型号如iPhone15,2映射到高端、操作系统版本。这些信息足够做分群但信息量有限——很难进一步精细化。另一个容易被忽视的问题是反馈信号的质量。冷启动阶段的行为反馈常常是噪声——新用户带着好奇心在试探点击了不代表喜欢滑动快不代表讨厌。过早地学习这些噪声信号可能把用户引入歧途。某视频平台的数据显示新用户前 20 次行为中真实兴趣信号仅占 40%其余 60% 是探索行为和误触。因此第二阶段内容匹配不要用模型训练只用简单的标签匹配——模型会被噪声训练歪标签匹配虽然笨拙但可控。还有一个现实约束是国际化的挑战。国别差异导致分群策略不可跨国套用。同一款 2000 元手机在中国是低端在东南亚是中端在欧美是入门级。分群策略必须按国家或区域独立建模不能用一个全球分群覆盖所有市场。五、总结冷启动推荐的核心策略是分阶段渐进式个性化第一阶段靠人口统计信息做分群热门兜底避免明显失配第二阶段用少量行为做标签匹配浅层个性化第三阶段积累足够行为后接入完整推荐管道协同过滤 深度模型。工程实现的关键是层级兜底的分群标签系统每个维度叉乘产生的分群可能没有足够数据需要向上聚合降维直到全局热门作为最终兜底。分群内容池通过离线 Spark 日更新写入 Redis推荐服务实时读取即可。冷启动的优化空间有限——没有行为数据就是没有行为数据再复杂的算法也不能无中生有。把能量花在冷启动到正常推荐的切换速度上尽快积累行为信号、合理设置切换阈值比花在冷启动阶段的推荐算法优化上ROI 更高。用户前 10 秒看到的内容不那么精准可以接受但第 50 秒还飘在冷启动的迷宫里流失就已成定局。