刷短视频时,你有没有发现总在看相似的内容?电商平台总推你买过的品类?这些背后都是推荐流在起作用。推荐系统通过分析用户行为数据,在数据库中快速匹配可能感兴趣的内容。但问题也随之而来:推荐越精准,信息茧房就越严重,小众内容创作者更难被看到。
推荐流的本质是数据排序
推荐流不是凭空生成的,它依赖于数据库中存储的用户行为日志、物品属性、交互频率等结构化数据。常见的做法是用协同过滤或深度学习模型打分,再按分数高低排序输出。比如下面这个简化查询:
SELECT item_id, user_id, score
FROM recommendation_scores
WHERE user_id = 12345
ORDER BY score DESC
LIMIT 20;
这条 SQL 看似合理,却隐含偏见——高分内容持续曝光,低分内容永远沉底。新上传的视频、冷门类目的商品,即便质量不错,也难有机会进入视野。
公平性不是牺牲效率
有人觉得,加入公平性机制会让推荐变“不准”。其实不然。真正的优化是在准确性和多样性之间找平衡。比如可以在数据库层面引入“曝光抑制”字段,记录每个 item 近期被展示的次数:
ALTER TABLE items ADD COLUMN impression_count_week INT DEFAULT 0;
UPDATE items SET impression_count_week = impression_count_week + 1
WHERE item_id IN (SELECT item_id FROM current_feed WHERE user_id = 12345);
然后在打分阶段加入负向惩罚:
score_final = base_score - (impression_count_week * 0.05)
这样,高频曝光的内容会自动降权,给新人新物留出空间。
从数据库设计支持多样性
还可以在数据库中维护一个“冷启动池”,专门存放新发布或长期未曝光的内容。每次生成推荐流时,强制插入一定比例的池内数据。例如:
SELECT item_id FROM cold_start_pool
ORDER BY create_time ASC
LIMIT 3
再与主推荐结果合并。这种策略不会大幅影响整体体验,却能让系统更具包容性。
某音乐 App 曾做过实验:在原有推荐流中插入 5% 的非热门歌曲,结果发现用户跳出率没升反降。很多人其实厌倦了千篇一律的热歌循环,愿意尝试新鲜声音。
用户也在悄悄改变偏好
数据库里的行为数据不是静态的。一个人今天爱看搞笑段子,明天可能想学做菜。如果系统只盯着短期点击率优化,就会陷入“越推越窄”的怪圈。解决办法是在特征表中加入时间衰减因子:
user_interests UPDATE SET weight = weight * 0.95
WHERE last_updated < NOW() - INTERVAL 1 DAY;
让旧兴趣逐渐弱化,为新兴趣腾出权重空间。这样一来,推荐流既能保持相关性,又不至于固化。
推荐流的公平性,不只是算法问题,更是数据库设计和数据使用方式的问题。当我们谈论“优化”时,不该只盯着点击率和停留时长,还得想想那些还没被看见的内容,有没有机会浮出水面。