𝕏 For You 算法研究报告
基于 xAI 开源仓库的静态源码审计:拆解 X For You 时间线的候选召回、多行为评分、作者多样性、DPP 重排与可见性过滤。
对象仓库:x-algorithm。
所依据的公开分支为 main。README 记载最近一次公开更新为 2026-08-13。打分权重与执法规则文件分别标注于 2026-08-12 与生产配置同步。
本报告依据仓库源码与官方 README 做静态阅读。文中数值取自仓库内 param.rs、config.rs 与 YAML 的已提交默认值。实验开关、GrowthBook 或 feature switch 覆盖、以及未开源规则,都可能使线上行为与本文描述不同。本文不构成对线上流量的观测。
1. 概述
For You 时间线按请求组装。候选来自两类来源:
- 关系内:从内存中读取观众所关注账号的近期帖文(Thunder)。
- 关系外:用向量检索(Phoenix retrieval)和兴趣聚类(SimClusters)取得观众未关注账号的帖文。
两类候选由同一套 Phoenix 排序模型评分。模型为每条候选预测多种行为发生的可能性。随后用显式权重将预测合成为单一分数,并依次施加作者多样性、关系外折扣、新作者抬分与 DPP 重排。
排序完成之后,可见性过滤单独判定该帖对当前观众是正常展示、以插页形式展示,还是丢弃。可见性判定不修改分数。
排序目标是观众对候选的预测行为价值,不是帖文已积累的互动计数。
由代码默认值可以直接读出的若干约束如下:
- For You 的资格时间窗约为 48 小时。
- 复制链接分享的默认权重为点赞的 40 倍;举报的默认负权重绝对值为点赞的 468 倍。
- 关系外帖文,以及关系内的回复与转帖,默认再乘 0.75。
- 同一请求结果中,同一作者从第二条起按公式衰减。
- 订阅可见或独家内容不会进入未订阅观众的 For You。
- 关系外推荐比关系内多一组仅用于推荐的丢弃规则。
2. 研究范围与方法
2.1 仓库覆盖范围
官方 README 说明,仓库的目的是使公众可以审计帖文如何进入 For You。公开仓库的顶层目录如下。
| 层 | 目录 | 作用 |
|---|---|---|
| 编排 | home-mixer/、candidate-pipeline/ | 请求路径:召回、补全、过滤、打分、混排 |
| 召回 | thunder/、phoenix/、simclusters/、phoenix-rankall/、phoenix-rankall-strato/ | 关系内内存、关系外向量、兴趣聚类、检索索引 |
| 排序 | phoenix/(ranking)、vm-ranker/ | 多行为预测;DPP 重排 |
| 可见性 | visibility-filtering/、visibility-filtering-client/ | Allow / Interstitial / Drop |
| 打标 | scarecrow/、botmaker/、botmaker-rules/、abuse-enforcement-service/、safety-label-user-agg/ | 事件规则、账号执法、帖级标签向账号聚合 |
| 理解 | grox/、clip/、media-model-proxy/、adult-content/、pnsfwmedia/、agatha/、bdsm/、user-cred-v2/ | 文本与媒体分类、账号分数、行为序列 |
| 透明 | under-the-hood/ | 账号与帖文标签的聚合报告 |
| 文档 | README.md、docs/BIDIRECTIONAL_BOOST_CHANGE.md | 系统设计说明与一次参数变更记录 |
主要语言为 Scala、Rust、Python、Java,另有少量 Strato 与 Thrift。phoenix/ 包含训练、serving 与合成数据,可用于独立复现一次训练与推理。
2.2 仓库未包含的内容
官方 README 写明的边界如下:
- 部分 Grox LLM prompt(
.j2)未公开。 - 部分 botmaker 规则未公开。README 给出的理由是降低被针对性规避的风险。
- 部署、集群、内部遥测与生产数据管道大多不在仓库中。
- BDSM 的
sink_policy.yaml阈值被改写为9.99;abuse-enforcement-service 的粉丝数门槛被改为示例值。这些文件可以说明机制,不能当作生产阈值。
因此,本报告可以描述 Home Mixer 的默认管线、打分公式、可见性规则表,以及已公开标签如何被消费。本报告不能声称已经穷尽一条帖文获得某一标签的全部途径。
2.3 方法
- 以
home-mixer的两条管线为骨架,沿调用链阅读源码。 - 数值取仓库内默认值,并标注参数名。
- 与源码不一致的中间判断,以源码为准。相关限定见第 10 节。
3. 系统结构
3.1 设计原则
官方 README 归纳了五条设计原则。源码与这些原则一致。
- 多行为预测。Phoenix 输出一组行为概率,并附加停留时长回归。合成分数是另一步加权计算。
- 候选隔离。排序 transformer 中,候选之间不能互相注意,只读取观众上下文。一条候选的分数不依赖于同批次中的其他候选,因此分数可以缓存。
- 哈希与语义 ID 嵌入。检索与排序不维护封闭词表。新帖可以立即表示。生产检索塔使用 residual-quantized semantic ID(6 层 × 256 码)与哈希作者 ID,不使用学得的 per-user ID embedding。
- 排序与可见性分离。二者使用不同服务、不同输入与不同规则。
- 可组合管线。
candidate-pipeline/将 source、hydrator、filter、scorer、selector、side effect 分开,可并行执行,也可单独开关。
3.2 两条路径
请求路径 打标路径(持续运行)
──────── ────────────────
Home Mixer grox / clip / media-model-proxy
├ PhoenixCandidatePipeline agatha / bdsm / user-cred-v2
│ 召回 → 过滤 → 打分 → Top 50 scarecrow + botmaker
│ → 可见性过滤 → 再过滤 abuse-enforcement-service
└ ForYouCandidatePipeline safety-label-user-agg
帖文 + 广告 + Who to Follow + 提示 写入存储后,请求时由可见性过滤读取请求路径决定本次结果的顺序。打标路径决定帖文与账号携带哪些标签。标签不直接改写 Phoenix 分数,但可以在打分前或打分后将候选移除。
4. 请求路径
入口是 ForYouCandidatePipeline。其第一条候选源 ScoredPostsSource 内部执行完整的 PhoenixCandidatePipeline,将入选帖文转换为 FeedItem,再与广告、Who to Follow、提示等项目混排。
4.1 查询补全
在查询任何候选源之前,PhoenixCandidatePipeline 并行补全观众侧特征。phoenix_candidate_pipeline.rs 中注册的项目包括:
- 排序用与召回用两套 User Action Aggregation 序列(
ScoringSequenceQueryHydrator、RetrievalSequenceQueryHydrator) - 拉黑、静音、关注、订阅列表
- Redis 缓存帖
- 互相关注关系
- 人口统计、推断性别、已安装应用
- 关注的 Grok topics 与 Starter Packs
- 显式与隐式互动信号
- 曝光 Bloom filter、IP 与地理位置
ImpressedPostsQueryHydrator 被构造,但未加入 query_hydrators 向量。已看过的帖文主要依靠 Bloom filter、Thunder 入参排除,以及随后的 PreviouslySeen* 与 PreviouslyServed* 过滤器。
候选源在这批特征就绪之后才被查询。
4.2 候选源
代码注册了 7 个 source。默认开启的是 Thunder、Phoenix、SimClusters 与缓存源。
| Source | 默认开关 | 默认上限 | 标记 | 作用 |
|---|---|---|---|---|
ThunderSource | 始终注册 | 1200 | ForYouInNetwork | 按关注列表(去掉已看过的 tweet ID)从内存 PostStore 取关系内帖 |
PhoenixSource | EnablePhoenixSource = true | 1000 | ForYouPhoenixRetrieval | 用 retrieval sequence 嵌入检索关系外近邻 |
SimclustersSource | EnableSimclustersSource = true | 800 | ForYouSimclusters | 对观众互动信号帖的 LOG_FAV 嵌入做余弦近似近邻,最长 48 小时 |
TweetMixerSource | EnableTweetMixerSource = false | 800 | — | 默认关闭 |
PhoenixTopicsSource | 话题请求时使用 | 1000 | — | 话题检索 |
PhoenixMOESource | EnablePhoenixMOESource = false | 200 | ForYouPhoenixRetrievalMoe | 默认关闭 |
CachedPostsSource | EnableCachedPosts = true | — | — | 复用上一请求的缓存 |
Thunder 提供关系内候选。Phoenix 与 SimClusters 提供关系外候选。SimClusters 还要求请求上已有帖级互动信号;否则该路返回空。
4.3 候选补全
召回之后按顺序附加特征:关系内标记、互相关注、TES 正文与作者、引用、媒体、订阅、Gizmoduck 账号资料、是否被作者拉黑、过滤话题、语言、互动计数、semantic ID。
这些字段供后续过滤器与打分器使用。
4.4 打分前过滤
phoenix_candidate_pipeline.rs 中的过滤器顺序如下。顺序本身构成语义。
| 顺序 | Filter | 移除对象 |
|---|---|---|
| 1 | DropDuplicatesFilter | 多个来源返回的同一帖 |
| 2 | CoreDataHydrationFilter | 正文或元数据未能补全的帖 |
| 3 | AgeFilter | 超过 MAX_POST_AGE(48 小时)的帖 |
| 4 | SelfTweetFilter | 观众自己的帖 |
| 5 | OONRetweetReplyFilter | 关系外转帖与回复,以及父帖缺失的回复 |
| 6 | OONNsfwSimclustersFilter | ServedType 为 ForYouSimclusters、作者带有 NSFW 标记、且观众未关注该作者的帖 |
| 7 | RetweetDeduplicationFilter | 同一原帖的重复转帖 |
| 8 | IneligibleSubscriptionFilter | 订阅可见而观众未订阅的帖 |
| 9–11 | PreviouslySeen* / PreviouslyServed* | 已看过或已分发的帖 |
| 12 | MutedKeywordFilter | 匹配观众静音词的帖 |
| 13 | AuthorSocialgraphFilter | 来自观众拉黑或静音作者的帖 |
| 14 | VideoFilter | 请求排除视频时的视频帖 |
| 15 | TopicIdsFilter | 话题请求下不属于所请求话题的帖 |
| 16 | NewUserMinEngagementFilter | 新账号条件下互动不足的关系外帖 |
| 17 | InventoryHoldoutFilter | 按帖与观众确定性抽样扣减的库存 |
两点需要单独说明:
OONNsfwSimclustersFilter只作用于 SimClusters 来源。Thunder、Phoenix 与缓存中、作者带有 NSFW 标记的关系外原创,不会被该预过滤器移除。它们仍可能被可见性过滤的关系外规则丢弃。- 订阅可见内容在这一层已被移除。可见性过滤中的
DropExclusiveTweetContentRule再次限制独家内容:仅会话作者、super-follow 观众或非转帖作者可以通过。
4.5 打分
打分由三个 scorer 依次执行。
PhoenixScorer调用PredictNextActions(return_logprob: true),将各输出头写入phoenix_scores。此步骤不计算加权分。RankingScorer进行加权、偏移、作者多样性、关系外折扣与新作者抬分,结果写入candidate.score。VMRanker将带有 DPP 上下文的请求发送至vm-ranker/。若服务端启用 DPP,则只保留贪心选中子集的原分,其余置 0;否则原样返回。
Home Mixer 默认发送 value_model_id = "dpp",以及 theta = 0.65、max_selected_rank = 150。vm-ranker 命令行的 --dpp-enabled 默认值为 false。生产进程是否带有该参数,仓库中没有说明。
4.6 选取、可见性与混排
TopKScoreSelector按candidate.score降序保留 50 条(TOP_K_CANDIDATES_TO_SELECT)。- 选取之后执行
VFCandidateHydrator、VFFilter、AncillaryVFFilter、DedupConversationFilter。 - 可见性结果为
Drop的帖被移除。结果为Interstitial的帖保留在时间线中。本仓库不包含插页界面的绘制。 - 若祖先帖、引用帖或被转帖被丢弃,
AncillaryVFFilter会移除当前帖。 DedupConversationFilter折叠同一对话中的多余分枝。- 可见性过滤之后不再重新打分。最终屏幕位置可以与打分名次不同。
外层 ForYouCandidatePipeline 使用 BlenderSelector 混入非帖项目:
| 项目 | 默认位置或行为 |
|---|---|
| 广告 | 默认 partition_organic_low_risk,由 PartitionOrganicAdsBlender 处理;会为广告邻接调整有机帖顺序 |
| Prompt | 第 0 位 |
| Who to Follow | 第 6 位 |
| Feed survey | 第 12 位 |
| Push-to-home、Jetfuel frames | 另有插入逻辑 |
有机结果规模常数为 RESULT_SIZE = 35。广告与模块槽另行增加,因此一次响应中的格子数可以超过 35。
选择完成之后,框架以 tokio::spawn 记录已分发历史、广告与客户端及 Kafka 事件,并刷新帖缓存。该异步任务可能与 URT 序列化重叠。已分发记录会在后续请求中作为预过滤条件。
5. 打分
5.1 Phoenix 排序模型
phoenix/ 使用 JAX 训练,并以 Rust gRPC 提供推理。排序模型为 transformer:
- 输入为观众近期行为序列与当前候选。
- 输出为每个候选的一组行为 logits,以及停留时长回归。
- 候选之间不能互相注意,只读取观众上下文。
- 嵌入使用多哈希与 semantic ID。新帖不需要进入封闭词表。
检索为双塔结构。用户塔读取行为历史;生产配置还包含国家、语言等 profile token,不包含学得的 per-user ID embedding。候选塔读取 semantic ID 与哈希作者 ID。检索按点积取 Top-K。索引保存在 checkpoint 中,由 phoenix-rankall/ 随事件更新。phoenix-rankall-strato/ 决定帖文进入哪个索引,并在入索引前查询可见性过滤。
Home Mixer 请求 return_logprob: true。serving 侧会填写 top_log_probs = log_sigmoid(logits)。将这些值写入 PhoenixScores.favorite_score 等字段的预测客户端不在本仓库中。官方 README 按概率加权陈述公式。若客户端原样传入对数概率,数值尺度会改变,但权重的相对大小仍然成立。本报告按官方 README 与 RankingScorer::apply(score, weight) = score * weight 陈述。
5.2 默认加权公式
ValueModelMode 默认为 weighted。RankingScorer 的计算为:
raw = Σ_i weight_i × P̂(action_i)
score = offset_score(raw)offset_score 在非负时加 0.001;负分被映射到区间 (0, 0.001)。之后再乘作者多样性因子与关系外因子,最后执行新作者抬分。
EnableMpnScoring 默认为 false。若开启,多样性因子与关系外因子只作用于正净值,负净值不放大。dwell_regret_sigmoid 与 gated_dwell_regret 是另一套公式,用批次内相对位置调制停留,不是默认路径。
5.3 默认权重
来源为 home-mixer/params/param.rs。文件标注为 mirrored from config feature-switch defaults; last sync 2026-08-12T04:09:22Z。
正项与零权重项:
| 预测行为 | 参数 | 默认权重 | 相对 FavoriteWeight |
|---|---|---|---|
| 复制链接分享 | ShareViaCopyLinkWeight | 20.0 | 40 |
| 回复 | ReplyWeight | 5.0 | 10 |
| 引用 | QuoteWeight | 5.0 | 10 |
| 私信分享 | ShareViaDmWeight | 5.0 | 10 |
| 关注作者 | FollowAuthorWeight | 4.0 | 8 |
| 分享(通用) | ShareWeight | 2.0 | 4 |
| 转帖 | RetweetWeight | 1.0 | 2 |
| 点赞 | FavoriteWeight | 0.5 | 1 |
| 打开帖 | ClickWeight | 0.4 | 0.8 |
| 打开外链 | OpenLinkWeight | 0.2 | 0.4 |
| 展开图片、打开视频、视频完播(VQV)、点进引用 | 对应 *Weight | 0.05 | 0.1 |
| 连续停留(秒) | ContDwellTimeWeight | 0.004 | — |
| 未探索帖 | PostUnexploredWeight | 0.02 | 仅关系内,且默认为加性项 |
| 点击停留、引用 VQV、资料点击、二元停留 | 对应参数 | 0.0 | 默认不进入加权 |
负项:
| 预测行为 | 参数 | 默认权重 | 相对 FavoriteWeight 的绝对值比 |
|---|---|---|---|
| 未停留 | NotDwelledWeight | −0.02 | 0.04 |
| 拉黑作者 | BlockAuthorWeight | −31.2 | 62.4 |
| 不感兴趣 | NotInterestedWeight | −43.2 | 86.4 |
| 静音作者 | MuteAuthorWeight | −58.8 | 117.6 |
| 举报 | ReportWeight | −234.0 | 468 |
权重不是互动计数的乘数。模型预测的是当前观众对当前候选采取该行为的概率。已有较高互动计数的帖,若模型判断当前观众采取正行为的概率低、采取负行为的概率高,其加权分仍可以较低。
5.4 互相关注加成
仅当候选为原创(不是回复,也不是转帖),且 is_mutual_follow_author == true 时:
- 回复权重增加
BidirectionalFollowReplyWeightBoost,默认值为 15。此时有效回复权重为 5 + 15 = 20。 - 停留权重增加
BidirectionalFollowDwellWeightBoost,默认值为 0。该加成曾被实验,未作为默认主路径启用。
docs/BIDIRECTIONAL_BOOST_CHANGE.md 记录了 2026 年 7 月的实验过程:先测试 5、10、15、20;7 月 13 日将 20 扩大到较多用户;7 月 24 日改回 15。文档给出的原因是,部分用户在大型公共事件期间较少看到未关注账号的讨论。
5.5 作者多样性
EnableAuthorDiversity 默认为 true。先按多样性调整前的分数降序,记录同一作者已出现次数 k(第一条为 k = 0):
multiplier(k) = (1 − floor) × decay^k + floor默认 decay = 0.5,floor = 0.25。对应乘数为:
| 同一结果中的序号 | k | 乘数 |
|---|---|---|
| 第 1 条 | 0 | 1.00 |
| 第 2 条 | 1 | 0.625 |
| 第 3 条 | 2 | 0.4375 |
| 第 4 条 | 3 | 0.34375 |
| 继续增加 | → ∞ | → 0.25 |
该公式不是 0.5^k 再截断到 0.25。第 2 条的乘数为 0.625。
5.6 关系外折扣
在加权、多样性与冷启动之后:
- 关系外帖乘
OonWeightFactor,默认 0.75。 EnableOonRescoreForInNetworkRepliesRetweets默认为 true,因此关系内的回复与转帖也乘 0.75。- 话题请求使用
TopicOonWeightFactor,默认 0.5。 - 附加因子
NEW_USER_OON_WEIGHT_FACTOR = 0.00001仅在账号年龄小于NewUserAgeThresholdSecs、且关注人数不少于 5 时使用。该阈值默认为 0。按仓库默认值,该分支通常不触发,除非线上覆盖了正的年龄阈值。
因此,在默认路径上,同一条原创帖作为关系内候选时的乘数,高于作为关系外候选,也高于作为回复或转帖。
5.7 新作者抬分
EnableViewerColdStart 默认为 true。每个请求最多调整一条合格原创:
- 不是回复,也不是转帖
- 作者粉丝数不超过
ColdStartFollowerCap(1000) - 观看量小于
ColdStartImpressionThreshold(1000) - 在非零分中的名次低于
LowImpressionsMaxPositionRatio(0.85) - 将其分数改为
max(score, target),其中target是排序后区间[ColdStartSlotMin, ColdStartSlotMax) = [15, 16)上随机取到的分数
该规则每次请求最多作用一条原创,不作用于回复或转帖。
5.8 DPP 重排
vm-ranker/ 在 embedding 上使用 determinantal point process,在分数与相邻候选不相似之间做权衡。贪心选中的子集保留原分,其余置 0。随后的 Top-K 会去掉被置 0 的候选。结果是:主题相近的高分候选中,一部分可能不再进入选取集合。
6. 可见性过滤
6.1 判定结果
visibility-filtering/ 对(观众,帖)给出三种结果:
ALLOW:正常展示INTERSTITIAL:保留在时间线中,由客户端绘制插页(例如成人或血腥内容)DROP:由 Home Mixer 移除
规则按注册顺序短路求值。第一条给出 Drop 的规则终止后续评估。
关系内使用 TimelineHome。关系外使用 TimelineHomeRecommendations。后者包含前者的全部丢弃规则,并追加一组仅用于推荐的丢弃规则。
6.2 关系内与关系外均丢弃的规则
base_home_rules() 包括:
- 作者停用、停权、注销或下线
- 受保护账号且观众未关注
- 观众拉黑作者、静音作者、或静音转帖
- 观众无权查看的独家内容
- 帖标签:
PDNA、BOUNCE、SPAM、FOR_EMERGENCY_USE_ONLY - FOSNR:仇恨言论、暴力言论、虐待、公民诚信(作者通常豁免;紧急用途标签除外)
- nullcast、过期编辑、国家或地方法律下架
- 未登录、未成年或未填写年龄时的敏感媒体限制
同一组规则还注册了 NSFW 高精确、血腥暴力、NSFW 卡片图、NSFW 作者的插页规则。在关系外表面上,后注册的丢弃规则会先命中其中一部分。见下一节。
6.3 仅在推荐表面上丢弃的规则
timeline_home_recommendations_policy() 追加:
- DMCA 媒体与地域限制媒体
- 作者或帖的 NSFW user / admin 标记
- 帖标签:NSFW 高召回、NSFW 高精确、血腥暴力高精确、NSFW 卡片图、NSFW 文本、
DO_NOT_AMPLIFY、恶意链接、SPAM 高召回、FOSNR 侮辱(仅关系外) - 作者标签:NSFW 高召回、NSFW 高精确、NSFW 近乎确定、NSFW 头像、NSFW 横幅、SPAM 高召回、被盗号、只读、高精确假冒
- 用户侧
ABUSIVE_HIGH_RECALL与DO_NOT_AMPLIFY:仅在观众未关注时丢弃
因此,带有高召回垃圾或 NSFW 高精确等标签的帖,可以出现在关注者的主页时间线中,但不会作为 For You 推荐分发给未关注者。
仓库测试表明,EGREGIOUS_NSFW 与 RECOMMENDATIONS_BLACKLIST 已从丢弃规则中移除,不再仅凭这两个名称丢弃推荐。
6.4 标签来源
打标系统持续运行,不位于请求热路径上。
| 系统 | 输入 | 输出 |
|---|---|---|
grox/ | 发帖时的文本与媒体 | 垃圾、成人、暴力等分类,以及文本与图像表示 |
clip/ | 图文对 | 媒体 embedding,供下游分类器使用 |
media-model-proxy/ | 图像与视频 | XxNsfw、暴力血腥、仇恨符号、指纹与类目。仓库中没有名为 AdultContent 的在服模型;disable_adult_content_v1 是未使用的 decider |
adult-content/、pnsfwmedia/ | 训练与校准 | 成人媒体分类器。后者结合 CLIP embedding 与 Agatha 校准分 |
agatha/ | 对账号帖文的拉黑、举报与点赞比例 | 离线账号标签(包括垃圾与成人) |
bdsm/ | 账号行为序列 | 不真实或滥用行为的迹象;可写出 enforcement_threshold_reached 等标签 |
user-cred-v2/ | 关注图与互动边上的 PageRank | 范围为 0–100 的账号分数。该分数本身不是可见性丢弃规则 |
scarecrow/、botmaker/、botmaker-rules/ | 实时事件 | 条件满足时写入标签。部分规则未开源 |
abuse-enforcement-service/ | 模型分数,不读取单条事件 | 按 YAML 第一条命中规则执行:跳过、写入 30 天 TTL 的 SpamHighRecall、写入 RiskyHighVizReply、验证或活体检测、停权 |
safety-label-user-agg/ | 帖级安全标签 | 汇总为账号级标签 |
enforcement_user.yaml 的结构为:白名单、高粉丝数(门槛已替换为示例值)、cred.is_high 或分数大于等于 50 时跳过;否则按 BDSM、slop、majority-poster 等标签执行。文件头注释写明该文件镜像自 GrowthBook。生产环境中的 CEL 或动态配置可能不同。
Scarecrow 或 Grox 会写入、但本仓库可见性规则表并不读取的标签包括:AGATHA_SPAM、AGATHA_SPAM_TOP_USER、SEARCH_BLACKLIST、UNSAFE_URL、COPYPASTA_SPAM、RISKY_HIGH_VIZ_REPLY。它们可能影响搜索或其他产品面,或经由未开源规则间接发生作用。不能仅凭本仓库证明它们会单独导致 For You 帖被丢弃。
7. 其余子系统
下列目录不直接计算 For You 分数。它们影响候选是否进入召回池、携带哪些特征,或事后如何被解释。
thunder/:从 Kafka 消费新帖,保存在内存PostStore中,按关注列表返回。关系内召回的时效与容量由此决定。simclusters/:Scala 实现。按账号与帖文的互动关系聚类。近似近邻服务位于simclustersann/。phoenix-rankall/与phoenix-rankall-strato/:维护检索索引。入索引前查询可见性过滤。被可见性过滤丢弃的帖不应进入关系外召回池。candidate-pipeline/:通用编排框架。Home Mixer 是其业务实例。under-the-hood/:按日收集账号与帖文上的可见性标签,由服务层做时段聚合。产品入口为 x.com/i/under_the_hood。
8. 实验与配置
多数权重与开关通过 feature switch 读取,而不是以字面量写死在逻辑中。仓库使用定时任务将主生产值写回 param.rs。README 说明,占流量较高(例如不低于 10%)的实验,目标是可以在仓库中看到。
因此:
- 本文中的数字是仓库记载的主路径默认值,不是对每个观众都成立的常数。
- 互相关注回复加成经历了 0、实验值 5/10/15/20、扩大到 20、再改回 15 的过程。权重会随实验与产品决策变化。
EnablePhoenixSource、EnableSimclustersSource、广告混排类型、ValueModelMode都可以按观众分组切换。
阅读该仓库时,可以将默认值视为当前主假设,将 param.rs 的差异视为算法变更记录。
9. 对创作者的含义
本节只陈述可由源码直接推出的后果。它们是机制描述,不是运营策略。
9.1 进入候选集合的条件
AgeFilter与 SimClusters 的 48 小时上限共同限定 For You 资格。超过该时间窗的帖不再进入该管线,而不是以较低权重继续排序。- 已看过或已分发的帖会被预过滤器移除。同一观众的后续请求不会再次选出同一条。
- 观众自己的帖不会出现在该观众的 For You 中。作者查看自己的帖不会构成分发信号。
- 订阅可见或独家内容不会进入未订阅观众的 For You。面向未订阅者的分发需要不设订阅限制的原创主帖。
- 关系外转帖与回复在打分前被移除。面向未关注者的分发主体是原创主帖。
9.2 加权分与已有互动计数
默认权重表示的是各预测行为对综合分的相对贡献,不是系统对内容体裁的偏好声明。
| 预测行为 | 默认权重 |
|---|---|
| 复制链接分享 | 20 |
| 回复、引用、私信分享 | 各 5;互相关注观众看到原创时,回复为 5 + 15 = 20 |
| 关注作者 | 4 |
| 点赞 | 0.5 |
| 资料点击、二元停留 | 0 |
由上表可以推出:
- 复制链接、回复、引用、私信分享与关注作者,对默认加权分的贡献高于点赞。
- 互相关注加成只作用于原创主帖。发生在作者自己主帖下的回复,与发生在他人帖下的回复,适用的权重不同。
- 点赞的默认权重较低。已有点赞数也不是排序输入。
- 资料点击的默认权重为 0。简介、高光与外链可以影响关注转化,但不进入默认 For You 加权。
9.3 负项
在默认权重下,举报的绝对值是点赞的 468 倍。静音、不感兴趣与拉黑的绝对值也明显高于点赞。
模型预测的是当前观众采取这些行为的概率,不是帖文的全局争议程度。
关系外推荐额外读取一组更宽的安全标签。NSFW、高召回垃圾、恶意链接、DO_NOT_AMPLIFY 等标签可以在排序之后将推荐移除。关注者主页仍可能展示的内容,不等于该内容会作为 For You 推荐分发。
账号级标签(高召回垃圾、NSFW 头像或横幅、只读、假冒、被盗号)作用于该账号的后续推荐,而不是单条帖。头像与横幅也出现在关系外丢弃规则中。
9.4 发帖形式与间隔
- 同一请求结果中,同一作者第 2 条乘 0.625,第 3 条乘约 0.44,下限为 0.25。短时间内多条帖进入同一观众的同一次请求时,后续条目的分数会被该公式缩小。
- 关系内回复与转帖默认再乘 0.75。关系外回复与转帖在打分前被移除。默认路径上,原创主帖的适用乘数高于回复与转帖。
- 展开图片、打开视频与视频完播的默认权重为 0.05。连续停留的默认权重为每单位 0.004。媒体不是默认加权中的主要项。
- 若启用 DPP,主题相近的高分候选中会有一部分被置 0,从而离开 Top 50。
9.5 新作者抬分与账号分数
- 粉丝数不超过 1000、该帖观看量小于 1000 的原创,有可能被抬到大约第 15 名附近。每个请求最多处理一条。
user-cred大于等于 50 或cred.is_high时,abuse-enforcement-service 可以跳过后续自动执法。该分数不直接加入 For You 加权。它来自关注图与互动边上的 PageRank。
9.6 机制对照
| 行为 | 对应机制 |
|---|---|
| 发布可被复制链接分享的原创 | ShareViaCopyLinkWeight = 20 |
| 在自己的原创主帖下与互相关注者讨论 | 原创且互相关注时,回复权重为 5 + 15 |
| 积累点赞 | FavoriteWeight = 0.5;虚假行为还可能进入 BDSM 或 abuse-enforcement-service |
| 短时间内发布多条 | 作者多样性从第 2 条起衰减 |
| 以回复或转帖面向未关注者 | OONRetweetReplyFilter 在打分前移除 |
| 将主帖设为订阅可见 | IneligibleSubscriptionFilter 与独家内容规则将其排除出未订阅者的 For You |
| 账号头像或横幅带有 NSFW 标签,并作为推荐分发 | 关系外用户标签规则丢弃 |
| 提高被预测为不感兴趣、拉黑或举报的概率 | 对应负项绝对值高于点赞 |
| 帖文超过约 48 小时 | AgeFilter 使其失去 For You 资格 |
| 以已有点赞数推断排序 | 排序输入是当前观众的预测行为概率 |
9.7 标签查询
Under the Hood 汇总账号与帖文上会影响可见性的标签。若推荐分发发生变化,可以先核对该工具中是否出现第 6.3 节所列标签。仓库说明机制。该工具说明当前账号与帖文携带的标签。
10. 范围限定
下列判断不能仅由本仓库闭合,或需要按源码作限定:
- TweetMixer、Phoenix Topics 与 MOE 源在代码中存在。TweetMixer 与 MOE 默认关闭。线上是否对部分观众开启,仓库中没有记载。
PhoenixScores字段是概率还是对数概率,取决于未开源的预测客户端。- Home Mixer 会发送 DPP 参数。
vm-ranker命令行默认不启用 DPP。生产进程是否启用,仓库中没有记载。 NewUserAgeThresholdSecs默认为 0,因此新用户关系外附加因子在仓库默认值下通常不生效。- 可见性过滤之后不再按分数重排。广告混排会再次调整有机帖顺序。屏幕位置不必等于打分名次。
- 部分打标规则未开源。BDSM 阈值与 abuse-enforcement-service 的粉丝门槛已替换为示例值。
AGATHA_SPAM等标签会被写入,但不在已公开的可见性丢弃表中。media-model-proxy不提供名为 AdultContent 的在服模型。成人相关能力通过 XxNsfw 等输出头,以及adult-content/与pnsfwmedia/的训练代码实现。- 作者多样性公式为
(1 − 0.25) × 0.5^k + 0.25,不是0.5^k截断到 0.25。 - Following 时间线是否使用同样的 48 小时限制,公开源码中未单独核实。本文中的 48 小时仅适用于 For You 的 Phoenix 管线。
11. 源码索引
| 主题 | 路径 |
|---|---|
| 官方总述 | README.md |
| For You 外层混排 | home-mixer/candidate_pipeline/for_you_candidate_pipeline.rs |
| 帖管线装配 | home-mixer/candidate_pipeline/phoenix_candidate_pipeline.rs |
| 默认权重与开关 | home-mixer/params/param.rs |
| 规模常数(50 / 35 / 48 小时) | home-mixer/params/config.rs |
| 加权、多样性、关系外折扣 | home-mixer/scorers/ranking_scorer.rs |
| 新作者抬分 | home-mixer/scorers/author_cold_start.rs |
| 互相关注加成变更记录 | docs/BIDIRECTIONAL_BOOST_CHANGE.md |
| 可见性规则表 | visibility-filtering/rules/registry.rs |
| 执法用户规则 | abuse-enforcement-service/service-lib/rules/enforcement_user.yaml |
| Phoenix 模型说明 | phoenix/README.md |
| DPP | vm-ranker/scoring/dpp_model.rs |
本报告依据仓库静态源码整理。线上实验、未开源规则与未同步的配置覆盖,以 𝕏 生产系统为准。