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

> Documentation Index
> Fetch the complete documentation index at: https://x-algorithm.vergego.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 候选帖子选择与成型机制

> 本文承接 [推荐系统工作原理](https://x-algorithm.vergego.ai/guide/how-it-works/) 中的模型打分环节，说明系统如何从已打分的候选池中筛选出最终交付的推荐内容。如需查阅工程实现细节，请参考技术文档 [候选选择与成型](https://x-algorithm.vergego.ai/concepts/candidate-selection/)。本页数值均为开源默认值。

## 核心流程概述

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

## 候选选择流程拆解

```mermaid
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`：它向[可见性过滤](https://x-algorithm.vergego.ai/concepts/visibility-filtering/)服务查询每条帖子能不能展示（`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`）。广告插入与安全间隙规则参见 [广告混排](https://x-algorithm.vergego.ai/concepts/ads-blending/)。

## 未选定候选的处理机制

落选的候选不会直接丢失。第 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 条 | [候选选择与成型](https://x-algorithm.vergego.ai/concepts/candidate-selection/) | `home-mixer/params/config.rs:17-18` |
| 视频轮播从落选候选补选，默认关闭 | [候选选择与成型](https://x-algorithm.vergego.ai/concepts/candidate-selection/) | `home-mixer/selectors/top_k_score_selector.rs:18-25` |
| 可见性检查在选择之后 | [可见性过滤](https://x-algorithm.vergego.ai/concepts/visibility-filtering/) | `home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:487` |
| 5 个选后过滤器 | [过滤流水线](https://x-algorithm.vergego.ai/concepts/filtering-pipeline/) | `home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs:511-517` |
| 带遮罩的帖子保留 | [过滤流水线](https://x-algorithm.vergego.ai/concepts/filtering-pipeline/) | `home-mixer/filters/vf_filter.rs:22-27` |
| 选后过滤后再截断，截断部分并入未选定列表 | [候选选择与成型](https://x-algorithm.vergego.ai/concepts/candidate-selection/) | `candidate-pipeline/candidate_pipeline.rs:141-160` |
| `BlenderSelector` 的组装顺序 | [广告混排](https://x-algorithm.vergego.ai/concepts/ads-blending/) | `home-mixer/selectors/blender_selector.rs:40-106` |

## 相关页面

- [候选选择与成型](https://x-algorithm.vergego.ai/concepts/candidate-selection/) —— 选择阶段的完整技术实现细节
- [过滤流水线](https://x-algorithm.vergego.ai/concepts/filtering-pipeline/) —— 选后过滤器的删除条件
- [可见性过滤](https://x-algorithm.vergego.ai/concepts/visibility-filtering/) —— 可见性检查的规则与四种裁定
- [推荐系统工作原理](https://x-algorithm.vergego.ai/guide/how-it-works/) —— 推荐系统端到端执行流程说明
- [术语速查表](https://x-algorithm.vergego.ai/guide/glossary/) —— 核心术语速查表
- [常见疑问解答](https://x-algorithm.vergego.ai/guide/faq/) —— 推荐系统常见问题解答

Source: https://x-algorithm.vergego.ai/guide/how-posts-are-picked/index.mdx
