这道题本质上是问我们怎么把用户零散的行为信号,转化成能实时响应用户口味变化的推荐系统。我理解它的核心挑战在于两个:一是兴趣是动态的,今天喜欢美妆明天可能就迷上露营了;二是工程上要在效果和成本之间做取舍。
先说数据收集。我会把它分成三层来抓:行为层,就是点击、点赞、收藏这些,特别是完播率,在小红书这种内容平台是很强的兴趣信号;内容层,笔记的图文、标签、[[OCR]]文本甚至视觉特征,我会抽成[[多模态]][[embedding]];社交层,关注关系、互动频次和社群归属。处理链路我用Flink做实时清洗,然后分流:一份进离线数仓做天级特征,一份留在流里做分钟级兴趣更新。
特征工程这块,我分静态画像、动态兴趣和演化特征。静态就是人口属性、注册来源,月级更新就行。动态兴趣是核心,比如用户最近50条点击序列和实时浏览的topic分布,分钟级刷新。演化特征比较有意思,像兴趣漂移速度、话题跨度,这些能判断用户是不是在探索新领域,天级更新就够了。关键技巧是时间衰减加权,近期行为权重指数级提升,不然三个月前点的健身视频还在推,用户早腻了。
算法选型上,我坚持多路召回加精排。召回层我会上协同过滤的ItemCF,捕捉“看了又看”的关联;向量召回用[[双塔]]模型,用户embedding实时更新;再加上图召回,基于社交关系的GraphSAGE。精排层主模型用DeepFM或者DIN,DIN的好处是能通过注意力机制处理行为序列,把用户最近对什么感兴趣显式地建模出来。多目标优化我会用MMoE结构,同时优化点击、互动和时长,因为只优化点击容易推标题党。
模型更新策略我分层处理。全量更新每周或每月一次,基模型重训,捕捉长期趋势。增量更新每天跑,用新增样本finetune,快速收敛。实时更新是分钟级的,用户embedding在线刷新,应对突发兴趣,比如突然刷到某个明星同款。工程上有个坑:精排模型天级更新就够了,但用户向量必须通过参数服务器实时推送,这样才能做到“刷完即影响下次推荐”。如果向量更新不及时,用户刚点了一篇露营笔记,下次刷新还在推美妆,体验就很差。
这里我想提一个延伸点:当用户兴趣短期剧烈波动时,比如大促期间从理性购物变成冲动消费,模型很容易过拟合短期行为,导致推荐结果变得很窄。我倾向于在实时更新时引入一个探索与保守的平衡因子,比如用贝叶斯方法动态调节历史行为和新行为的权重,避免兴趣窄化。
所以整体上,我更倾向把兴趣建模看成一套分层响应系统:底层用全量更新保证基础质量,中间层用增量更新快速适应,顶层用实时更新捕捉脉冲。前提是数据质量要过关,埋点得有足够的唯一标识和时间戳,不然实时更新再快也是垃圾进垃圾出。