个性化 Feed 与重排序:从热度榜到千人千面的时间线

系统覆盖微型博客个性化 Feed 的完整链路:时间线候选生成(关注/热点/兴趣召回)、用户兴趣画像(显式标签与隐式行为信号)、实时特征与粗排精排两阶段、多样性/频控/去重等后处理、冷启动与探索-利用权衡、以及 A/B 评估与效果指标,帮助读者把「统一热度时间线」升级为「千人千面的个性化推荐」。

「所有人的时间线都一样」是产品早期的合理选择,但很快瓶颈出现:大 V 霸榜、小众内容永远没人看、新用户无所适从。个性化 Feed 的目标是把「统一热度榜」改造成「每人一份的时间线」——但它的工程量比想象中大得多:候选从哪来、兴趣怎么建模、实时特征怎么接、重排序模型怎么训、以及最容易被忽视的多样性、频控与冷启动。本文从候选生成到评估上线,讲透一条可落地的个性化时间线链路。

前置:/miniblog-follow-timeline-push-pull/(候选时间线生成)、/miniblog-content-moderation-recommendation/(多路召回与排序模型)、/miniblog-search-ranking/(召回-排序漏斗)。算法基础可参考 AI/ML 专题。

目录

1. 为什么需要个性化:热度榜的困境

纯热度时间线的三个典型问题:

问题 1:马太效应
  大 V 内容永远霸榜,长尾创作者的内容被淹没
  → 新创作者没有曝光,生态活力下降

问题 2:兴趣错配
  关注了科技内容,但时间线塞满无关热点
  → 用户刷着刷着流失

问题 3:新用户冷启动
  没有关注任何人,时间线空无一物
  → 只能用「全局热点」顶一下,体验差
个性化的收益:
□ 人均时长:内容相关性提升 → 刷得更久
□ 长尾激活:小众兴趣被覆盖 → 创作者留存上升
□ 商业价值:精准曝光 → 广告/付费转化更高

工程要点:个性化不是「锦上添花」,而是生态可持续的关键。但它的复杂度远超想象——建议从「排序混排」起步(候选仍以关注为主),逐步加入兴趣召回,避免一上来就全量算法化。

2. 总体链路:候选生成到重排序

个性化 Feed 的生产链路(每条时间线刷新时执行):

1. 候选生成(Candidate Generation)
   关注流 + 热点流 + 兴趣流 → 合并候选池(几十~几百条)
2. 特征工程(Feature)
   用户特征 + 内容特征 + 交互特征 + 实时信号
3. 粗排(Coarse Ranking)
   轻量模型/规则 → 从几百条筛到几十条
4. 精排(Fine Ranking)
   深度模型逐条打分 → 排序
5. 后处理(Post-processing)
   多样性约束、频控、已读去重、置顶规则
6. 写入时间线缓存,返回客户端
性能要求:
□ 单次刷新 < 100ms(含缓存命中)
□ 特征在线获取要有本地缓存(特征服务)
□ 粗排轻量、精排限量,避免全部过深度模型

工程要点:链路的核心是**「分阶段降量」**——候选多、粗排快、精排精。不要试图让最重的模型处理全部候选,那是延迟与成本的双重灾难。

3. 用户兴趣画像:显式与隐式信号

兴趣画像是个性化的「用户侧底座」:

显式信号(用户主动表达):
□ 关注列表:最强烈的兴趣声明
□ 屏蔽/不感兴趣:负向信号
□ 标签/话题订阅:明确兴趣点

隐式信号(行为推断):
□ 点击/点赞/转发/评论:不同强度的正反馈
□ 阅读时长:深度兴趣的代理指标
□ 停留位置:滚动深度
□ 收藏/分享:高质量兴趣

画像存储:
□ 用户兴趣向量(embedding)→ 向量库
□ 兴趣标签带权重(topic: {权重, 更新时间})
□ 兴趣要衰减:老兴趣权重随时间衰减
信号权重示例:
关注 = 1.0,点赞 = 0.6,转发 = 0.8,评论 = 0.7,阅读>30s = 0.4,点击 = 0.2,曝光未点 = -0.1

工程要点:画像的新鲜度 > 完备度——用最近 N 天的行为重建画像,比用全部历史更贴合当下兴趣。负向信号(屏蔽、不感兴趣)权重要高,因为「不想看」比「想看」更能决定留存。

4. 候选召回:关注、热点与兴趣

多路召回保证「候选池有足够的多样性」:

路 1:关注流(最强信号)
  关注用户最近 N 条内容 → 基础候选
  大 V 限流:每个关注者最多取 K 条,防霸占

路 2:热点流(兜底)
  全局/分话题热点榜 → 补充活跃内容
  适合冷启动用户与低活跃用户

路 3:兴趣流(个性化扩展)
  用户兴趣标签 → 召回对应话题/相似内容
  embedding 召回:内容向量 ≈ 用户兴趣向量

路 4:社交扩展(可选)
  共同关注/二度关系 → 发现新内容源
候选合并:
□ 各路候选打标(来源路名),供后处理/评估使用
□ 去重:同一内容只保留一次
□ 候选上限:每路有配额,防止单路霸占

工程要点:多路召回的核心是**「配额 + 去重 + 打标」**。配额保证多样性(关注路不能 100%),打标让后处理知道候选来源,评估时能分析「哪一路带来了点击」。

5. 实时特征:动作、速度与新鲜度

排序特征分静态与实时两类,实时特征往往决定效果:

静态特征:
□ 内容:作者粉丝数、内容长度、媒体类型、标签
□ 用户:注册时长、活跃度、历史互动率

实时特征(在线计算/缓存):
□ 内容实时热度:近 1h/6h/24h 的互动速度(非总量)
□ 作者实时状态:是否在线、近 1h 是否活跃
□ 用户-内容关系:历史对该作者的互动率
□ 新鲜度:内容的 age(分钟级),衰减因子

特征服务:
□ 特征以 KV 缓存提供(Redis/内存),避免查库
□ 特征版本管理,离线训练与在线使用保持一致
实时热度公式示例:
hot_score = ln(1 + 近1h互动数) * 新鲜度衰减
新鲜度衰减 = exp(-age_hours / T)   # T 按内容类型不同

工程要点:「速度」比「总量」重要——一条刚发布但快速升温的内容,比一条累计了很多但已经过气的内容更值得排在前面。实时特征必须有缓存,否则每次刷新都查库会打爆数据库。

6. 粗排与精排:两阶段排序

把候选从几百条降到最后展示的几十条,两阶段各有分工:

粗排(几毫秒/条):
□ 轻量模型:LR / 浅层 DNN / 规则打分
□ 目标:快速筛掉明显不相关的候选
□ 特征:用少量核心特征(热度、关注、兴趣相关性)

精排(几十毫秒/条):
□ 深度模型:DIN / DIEN / 双塔 + 注意力
□ 目标:精确预估点击/时长/互动概率
□ 特征:全量特征 + 交叉特征

目标函数:
□ 单点目标:预估 pCTR(点击率)
□ 多目标:pCTR + pDuration + pEngage 加权
□ 排序分 = f(pCTR, pDuration, pEngage, 新鲜度, 多样性)
工程注意:
□ 特征一致性:在线打分必须用训练时同版本的特征
□ 模型上线:离线 AUC/GAUC 提升 → 在线 A/B 验证
□ 推理成本:精排只对粗排后的 Top-K 做

工程要点:两阶段是成本与效果的平衡——粗排用便宜模型降量,精排用贵模型保质。精排模型上线要「离线指标 + 在线 A/B 双确认」,防止离线涨、在线跌的假象。

7. 后处理:多样性、频控与去重

排序分再高,也不能把时间线填成「同一话题刷屏」:

多样性约束:
□ 话题/Tag 去重:同一话题最多出现 K 条
□ 作者去重:同一作者最多出现 N 条(防霸榜)
□ 内容类型均衡:纯文字/图片/视频 混合

频控(Repetition Control):
□ 用户已读内容不重推(seen list)
□ 展示过的内容降权(衰减重推概率)
□ 同一内容短时间不重复出现

去重与置顶:
□ 全局去重:同一内容在多路召回里只留一条
□ 置顶规则:官方公告/关注的特别事件 → 强制置顶(不走排序)
MMR 思路(最大边缘相关):
score = α * 相关度 - (1-α) * max(与已选内容的相似度)
→ 平衡「相关」与「多样」

工程要点:多样性是留存的基本盘——再精准的推荐,如果时间线单调,用户照样会腻。多样性约束放在排序之后做(后处理),比塞进模型里更可控、更容易调。

8. 冷启动与探索-利用

新用户、新内容没有历史数据,个性化算法无从下手:

新用户冷启动:
□ 引导选择兴趣标签(最直接的信号)
□ 用注册信息推断(手机号地区/邀请人)
□ 先用「热点 + 热门长尾」混合推荐
□ 快速收集前几十次行为 → 快速建立画像

新内容冷启动:
□ 给小流量曝光机会(探索配额)
□ 用作者历史质量做先验
□ 提升期给内容加探索权重

探索-利用(E&E):
□ 利用(Exploitation):按模型排序
□ 探索(Exploration):给低曝光但高潜力的内容机会
□ 实现:ε-greedy、UCB、Thompson sampling
探索的实现示例:
explore_score = 利用分 + λ * (不确定性/曝光次数)
→ 曝光越少、不确定性越高,越值得给机会

工程要点:冷启动是「给机会」的问题——新内容没有数据时,模型无法判断好坏,只能用小流量探索去「试错」。探索配额要可配置,避免探索内容占比过高拖累整体时长。

9. A/B 评估与上线节奏

个性化系统的上线必须有严格的评估与实验机制:

离线指标:
□ AUC / GAUC:排序质量
□ 覆盖率:长尾内容被推荐的比例
□ 多样性指标:话题/作者分布熵

在线指标(A/B):
□ 核心:人均时长、7 日留存、互动率
□ 辅助:曝光到点击率(pCTR 校准)、次留
□ 防副作用:广告收入、创作者活跃度

实验机制:
□ 分桶实验:按用户 hash 分桶,桶间互不可见
□ 灰度节奏:1% → 5% → 25% → 100%
□ 指标护栏:时长涨了但留存跌了 → 不通过
上线决策:
□ 离线指标 + 在线 A/B 双确认
□ 单实验至少 7 天,跨完整周末
□ 结果显著性用置信区间判断,不只看均值

工程要点:「在线 A/B 说了算」——离线 AUC 提升只是必要条件,真正的护栏是留存与时长。实验要同时看「正向指标」和「护栏指标」,防止优化单一指标伤害生态。

10. 速查表与一句话记忆

问题一句话答案
为什么个性化破解马太效应、匹配兴趣、激活长尾
链路怎么搭候选生成 → 特征 → 粗排 → 精排 → 后处理
兴趣怎么建模显式信号 + 隐式行为,带衰减
候选哪来关注 + 热点 + 兴趣 + 社交 多路召回
什么特征关键实时热度速度 + 新鲜度衰减
排序怎么做粗排轻量降量,精排深度保质
怎么防单调多样性、频控、作者/话题去重
没数据怎么办冷启动引导 + 探索-利用配额
怎么验证效果离线指标 + 在线 A/B + 留存护栏

一句话记忆:个性化 Feed = 多路候选(关注/热点/兴趣)+ 兴趣画像(显式/隐式/衰减)+ 粗排精排两阶段(成本与效果平衡)+ 后处理多样性(防单调)+ 冷启动探索(给机会)+ A/B 护栏(留存说了算)——把「统一热度榜」升级为「千人千面的时间线」。

延伸阅读

  • /miniblog-follow-timeline-push-pull/ — 候选时间线的推拉架构
  • /miniblog-content-moderation-recommendation/ — 多路召回与排序模型
  • /miniblog-search-ranking/ — 召回-排序漏斗与评估
  • /miniblog-analytics-stats/ — 事件埋点与热度建模
  • AI/ML 专题 — 排序模型与特征工程
  • Redis 专题 — 实时特征缓存
  • 数据工程专题 — 特征平台与离线训练

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「miniblog」更多文章

  1. 创作者经济与商业化:打赏、付费订阅、广告分成与收益结算
  2. 用户画像与标签体系:画像建模、标签存储与应用
  3. 多端同步与离线优先:本地缓存、同步协议与冲突解决