Skip to content

候选帖子选择与成型机制

候选帖子选择与成型机制:打分后先取 50 条、视频轮播补选、选后水合与可见性检查、5 个选后过滤器、截断到 35 条,再由 BlenderSelector 组装信息流

Updated

本文承接 推荐系统工作原理 中的模型打分环节,说明系统如何从已打分的候选池中筛选出最终交付的推荐内容。如需查阅工程实现细节,请参考技术文档 候选选择与成型。本页数值均为开源默认值。

核心流程概述

打分完成后,系统按最终分降序排列候选,先取前 50 条;视频轮播开启时,再从落选候选中补选视频。随后系统对入选候选做选后水合,其中包括可见性检查,再运行 5 个选后过滤器,截断到 35 条。最后,外层的 BlenderSelector 把帖子与广告、推荐关注等模块组装成信息流。

候选选择流程拆解

flowchart TB
    A["所有候选都有分了"] --> B["① 按分取前 50 条<br/>(轮播开启时补选视频)"]
    B --> C["② 选后水合<br/>含可见性检查"]
    C --> D["③ 5 个选后过滤器"]
    D --> E["④ 截断到 35 条"]
    E --> F["⑤ BlenderSelector 组装:帖子 + 广告 + 模块"]
    F --> G([你看到的信息流])

1. 初步截断:先取 50 条

TopKScoreSelector 按最终分由高到低排序,取前 50 条(home-mixer/params/config.rs:17)。没有分数的候选排在最后(home-mixer/selectors/top_k_score_selector.rs:32-34)。

初步截断的数量高于最终条数 35。多出的 15 条是余量,用于抵扣选后过滤删掉的候选,保证最终条数充足。

视频轮播补选。 视频轮播开启时,TopKScoreSelector 从落选候选里按轮播分数再补选至多 30 条视频(home-mixer/selectors/top_k_score_selector.rs:18-25、home-mixer/params/param.rs:1343-1348)。补选的视频带 video_carousel_extra 标记,只进入轮播模块,不进入主信息流,也不占用 50 条名额。视频轮播开关 EnableVideoCarousel 开源默认关闭(home-mixer/params/param.rs:1217-1222)。

2. 选后水合:补充关键元数据,并检查可见性

系统只对入选候选运行 10 个选后水合器(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:485-509)。第一个是 VFCandidateHydrator:它向可见性过滤服务查询每条帖子能不能展示(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:487)。其余水合器补充品牌安全等级、视频媒体信息等字段。

可见性检查在选择之后进行。站内候选用 TimelineHome 安全级别查询;站外候选、祖先帖和被引用帖用更严格的 TimelineHomeRecommendations 查询(home-mixer/candidate_hydrators/vf_candidate_hydrator.rs:70-106)。

系统对入选候选延迟查询可见性与品牌安全,避免对大量落选候选产生无谓的远程查询,降低资源消耗。

3. 选后过滤:5 个过滤器执行终审

系统按顺序运行 5 个选后过滤器(home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:511-517):

过滤器 删掉什么
VFFilter 可见性结果为 Drop、Tombstone、NotEvaluated 的帖子;带遮罩(Interstitial)、Avoid、Downrank 的帖子保留(home-mixer/filters/vf_filter.rs:22-27)
AncillaryVFFilter 祖先帖、被引用帖或被转发的原帖被判丢弃的帖子
AncestorVideoFilter 请求排除视频时,祖先帖带视频的回复
DedupConversationFilter 同一会话中分数较低的分支;同一会话只保留得分最高的一条
VideoCarouselFilter 第 1 步补选的轮播视频;它们被移出主信息流,放进轮播模块

4. 目标截断:对齐最终交付数量

选后过滤完成后,系统再按顺序截断,保留 35 条(home-mixer/params/config.rs:18、candidate-pipeline/candidate_pipeline.rs:153-157)。

第 1 步预留的 15 条余量,确保选后过滤删除部分帖子后,剩余数量仍满足信息流装载要求。

5. 外层混排:组装最终信息流

外层的 BlenderSelector 不按分数重新排序,帖子顺序在内层已经确定(home-mixer/selectors/blender_selector.rs:108-110)。它按以下顺序组装(home-mixer/selectors/blender_selector.rs:40-106):

  1. 按类型分桶:帖子、广告、推荐关注(Who to Follow)、提示卡片(Prompt)、PushToHome、Frame、问卷(FeedSurvey)、视频轮播。
  2. 存在推荐关注模块时,丢弃视频轮播。
  3. 用广告混排器把帖子与广告混排。开源默认策略是 multi_risk(home-mixer/params/param.rs:957-962)。
  4. 依次插入:提示卡片放在最前;推荐关注放在第 6 位;视频轮播默认放在第 6 位;PushToHome 钉在最前;Frame 放进规划好的槽位;问卷放在第 12 位(home-mixer/params/config.rs:29-32)。

外层最多输出 48 项:35 条帖子、5 个模块槽位、8 个 Frame(home-mixer/params/config.rs:20-22)。广告插入与安全间隙规则参见 广告混排。

未选定候选的处理机制

落选的候选不会直接丢失。第 1 步落选的候选与第 4 步截断掉的候选,一起进入未选定列表 non_selected(candidate-pipeline/candidate_pipeline.rs:153-157)。流水线把入选与未选定候选交给 side effect(不阻塞返回结果的附加任务)。例如 Redis 候选缓存把两者一起写入,供下次翻页复用(home-mixer/side_effects/redis_post_candidate_cache_side_effect.rs:49-60)。

流程小结

候选帖子的最终选择包含五个有序步骤:按分取前 50 条并补选轮播视频 → 选后水合与可见性检查 → 5 个选后过滤器 → 截断到 35 条 → BlenderSelector 组装交付。

出处

本页结论综合自系统各技术文档,不引入未经源码支持的新结论。核心结论的依据如下(精确源码行号见对应技术页的“源码锚点”):

核心结论 技术页 主要源码
先取 50 条,最终留 35 条 候选选择与成型 home-mixer/params/config.rs:17-18
视频轮播从落选候选补选,默认关闭 候选选择与成型 home-mixer/selectors/top_k_score_selector.rs:18-25
可见性检查在选择之后 可见性过滤 home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:487
5 个选后过滤器 过滤流水线 home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:511-517
带遮罩的帖子保留 过滤流水线 home-mixer/filters/vf_filter.rs:22-27
选后过滤后再截断,截断部分并入未选定列表 候选选择与成型 candidate-pipeline/candidate_pipeline.rs:141-160
BlenderSelector 的组装顺序 广告混排 home-mixer/selectors/blender_selector.rs:40-106

相关页面

Type to search…

↑↓ navigate↵ selectEsc close