一、线上线下不一致问题
这是推荐系统中最常见也最隐蔽的问题之一。
特征不一致是首要原因。离线训练时使用的特征数据与线上实时请求时的特征存在时间差。例如,12月16日凌晨0-5点期间,线上服务使用的是12月14日的旧特征数据,而离线样本拼接时却使用12月15日的特征。这种特征Pipeline处理延迟导致的不一致会随着流程变长而加剧。即使是实时特征,从客户端埋点上报到流式计算处理完成也需要时间,用户刚点击某个内容后立即下滑,系统无法即时获取该行为特征,造成离在线严重不一致。
数据分布不一致则表现为"冰山效应"。离线训练使用的是老模型产生的有偏样本(冰山上可见的数据),而线上预估需要预测整个数据空间(包括冰山下从未曝光的数据)。当新模型与旧模型差异较大时(如从LR升级到深度模型),新模型给未见过的高分数据一旦表现不佳,就会出现离线AUC上涨但线上CTR下降的现象。
我们在PAI-Rec产品中提供了打分和样本特征一致性检测的工具:https://help.aliyun.com/zh/airec/what-is-pai-rec/user-guide/consistency-check
二、评估指标的困境
推荐系统的评价指标本身就是一个巨大的坑。CTR作为核心优化目标存在明显缺陷:高CTR会导致擦边球内容和标题党泛滥;优化停留时长会使视频和超长文章占据主导;优化阅读完成率则偏向短内容。这些指标相互依赖、此消彼长,目前业界仍沿用计算广告的CTR路径,但并未找到真正能指导系统的完美指标。
采样评估带来的偏差同样严重。除了AUC外,Precision@K、Recall@K、NDCG等指标在采样计算时会产生高偏差、低方差的问题,很多情况下与真实结果相差甚远。能不采样就不采样,如果必须采样则需要采用纠偏方案。
我们一般要考虑多目标,只考虑单一目标会比较偏颇。https://torcheasyrec.readthedocs.io/zh-cn/latest/models/multi_target.html
三、探索与利用(E&E)的两难
Exploration & Exploitation是推荐系统的"天问"。精准推荐会局限用户视野,只推送用户已知感兴趣的内容,导致信息茧房;而兴趣探索又会牺牲短期指标,大部分探索内容用户体验为负向。究竟牺牲多少CTR来保探索才算合适?探索的ROI何时大于1?如何确定探索效果?这些问题业界至今没有定论。E&E就像玩扫雷游戏,你不知道下一个推荐会让用户开疆辟壤还是直接GAME OVER导致用户流失。
通过流量调控来对新物品给曝光:案例:当物品发布6小时内的流量调控
四、算法精准度与用户体验的矛盾
好的算法未必带来好的用户体验。一个极度精准的推荐系统可能只推送汽车、电竞、科技三类内容给用户,虽然每个推荐都符合用户历史兴趣,但长期来看会严重局限用户视野。有时候"稍微差一点"的推荐算法反而体验更好,因为它在核心兴趣和边缘领域之间保持平衡。这就引出了"高瘦子"(精准但狭窄)与"矮胖子"(分散但广泛)的选择难题。
参考上面的流量调控。
五、工程实现层面的陷阱
代码不一致是常见坑点。离线用MaxCompute/ Scala/Python处理用户最近50个行为,在线用C++实现却只取30个,这种不同语言实现导致的逻辑差异很难排查。
特征穿越和数据泄漏也会导致离线表现虚高。使用了与标签强相关的特征,训练集和测试集差异大,上线后效果骤降。
模型迭代带来的收敛问题也值得关注。新模型上线初期相当于在拟合老模型产生的样本,如果一开始效果较差,需要经过一段时间迭代,让影响的样本分布慢慢趋近新模型才能收敛,这个过程效率较低。常用的trick包括对无偏数据上采样、线上线下模型线性融合等。
六、系统性问题
推荐系统本质上是一个技术远远达不到需求的领域。即使今日头条这样国内领先的推荐系统仍然颇受诟病。"推荐用户希望看到的东西"这个目标本身就难以精确定义,工程师和产品经理往往都没完全清楚自己要什么。规则引擎虽然被一些技术人员视为"不够算法",但作为系统工程中保证人工把控能力的最强先验,实际上是必不可少的架构灵活性组成部分。
这些坑贯穿了从数据处理、特征工程、模型训练、离线评估到线上服务的全链路,需要系统性地思考和解决。