2026年8月15日

𝕏 For You 算法研究报告

基于 xAI 开源仓库的静态源码审计:拆解 X For You 时间线的候选召回、多行为评分、作者多样性、DPP 重排与可见性过滤。

对象仓库:x-algorithm

所依据的公开分支为 main。README 记载最近一次公开更新为 2026-08-13。打分权重与执法规则文件分别标注于 2026-08-12 与生产配置同步。

本报告依据仓库源码与官方 README 做静态阅读。文中数值取自仓库内 param.rsconfig.rs 与 YAML 的已提交默认值。实验开关、GrowthBook 或 feature switch 覆盖、以及未开源规则,都可能使线上行为与本文描述不同。本文不构成对线上流量的观测。


1. 概述

For You 时间线按请求组装。候选来自两类来源:

  1. 关系内:从内存中读取观众所关注账号的近期帖文(Thunder)。
  2. 关系外:用向量检索(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.mddocs/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 归纳了五条设计原则。源码与这些原则一致。

  1. 多行为预测。Phoenix 输出一组行为概率,并附加停留时长回归。合成分数是另一步加权计算。
  2. 候选隔离。排序 transformer 中,候选之间不能互相注意,只读取观众上下文。一条候选的分数不依赖于同批次中的其他候选,因此分数可以缓存。
  3. 哈希与语义 ID 嵌入。检索与排序不维护封闭词表。新帖可以立即表示。生产检索塔使用 residual-quantized semantic ID(6 层 × 256 码)与哈希作者 ID,不使用学得的 per-user ID embedding。
  4. 排序与可见性分离。二者使用不同服务、不同输入与不同规则。
  5. 可组合管线。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 序列(ScoringSequenceQueryHydratorRetrievalSequenceQueryHydrator
  • 拉黑、静音、关注、订阅列表
  • 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始终注册1200ForYouInNetwork按关注列表(去掉已看过的 tweet ID)从内存 PostStore 取关系内帖
PhoenixSourceEnablePhoenixSource = true1000ForYouPhoenixRetrieval用 retrieval sequence 嵌入检索关系外近邻
SimclustersSourceEnableSimclustersSource = true800ForYouSimclusters对观众互动信号帖的 LOG_FAV 嵌入做余弦近似近邻,最长 48 小时
TweetMixerSourceEnableTweetMixerSource = false800默认关闭
PhoenixTopicsSource话题请求时使用1000话题检索
PhoenixMOESourceEnablePhoenixMOESource = false200ForYouPhoenixRetrievalMoe默认关闭
CachedPostsSourceEnableCachedPosts = true复用上一请求的缓存

Thunder 提供关系内候选。Phoenix 与 SimClusters 提供关系外候选。SimClusters 还要求请求上已有帖级互动信号;否则该路返回空。

4.3 候选补全

召回之后按顺序附加特征:关系内标记、互相关注、TES 正文与作者、引用、媒体、订阅、Gizmoduck 账号资料、是否被作者拉黑、过滤话题、语言、互动计数、semantic ID。

这些字段供后续过滤器与打分器使用。

4.4 打分前过滤

phoenix_candidate_pipeline.rs 中的过滤器顺序如下。顺序本身构成语义。

顺序Filter移除对象
1DropDuplicatesFilter多个来源返回的同一帖
2CoreDataHydrationFilter正文或元数据未能补全的帖
3AgeFilter超过 MAX_POST_AGE(48 小时)的帖
4SelfTweetFilter观众自己的帖
5OONRetweetReplyFilter关系外转帖与回复,以及父帖缺失的回复
6OONNsfwSimclustersFilterServedTypeForYouSimclusters、作者带有 NSFW 标记、且观众未关注该作者的帖
7RetweetDeduplicationFilter同一原帖的重复转帖
8IneligibleSubscriptionFilter订阅可见而观众未订阅的帖
9–11PreviouslySeen* / PreviouslyServed*已看过或已分发的帖
12MutedKeywordFilter匹配观众静音词的帖
13AuthorSocialgraphFilter来自观众拉黑或静音作者的帖
14VideoFilter请求排除视频时的视频帖
15TopicIdsFilter话题请求下不属于所请求话题的帖
16NewUserMinEngagementFilter新账号条件下互动不足的关系外帖
17InventoryHoldoutFilter按帖与观众确定性抽样扣减的库存

两点需要单独说明:

  • OONNsfwSimclustersFilter 只作用于 SimClusters 来源。Thunder、Phoenix 与缓存中、作者带有 NSFW 标记的关系外原创,不会被该预过滤器移除。它们仍可能被可见性过滤的关系外规则丢弃。
  • 订阅可见内容在这一层已被移除。可见性过滤中的 DropExclusiveTweetContentRule 再次限制独家内容:仅会话作者、super-follow 观众或非转帖作者可以通过。

4.5 打分

打分由三个 scorer 依次执行。

  1. PhoenixScorer 调用 PredictNextActionsreturn_logprob: true),将各输出头写入 phoenix_scores。此步骤不计算加权分。
  2. RankingScorer 进行加权、偏移、作者多样性、关系外折扣与新作者抬分,结果写入 candidate.score
  3. VMRanker 将带有 DPP 上下文的请求发送至 vm-ranker/。若服务端启用 DPP,则只保留贪心选中子集的原分,其余置 0;否则原样返回。

Home Mixer 默认发送 value_model_id = "dpp",以及 theta = 0.65max_selected_rank = 150vm-ranker 命令行的 --dpp-enabled 默认值为 false。生产进程是否带有该参数,仓库中没有说明。

4.6 选取、可见性与混排

  • TopKScoreSelectorcandidate.score 降序保留 50 条(TOP_K_CANDIDATES_TO_SELECT)。
  • 选取之后执行 VFCandidateHydratorVFFilterAncillaryVFFilterDedupConversationFilter
  • 可见性结果为 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 默认为 weightedRankingScorer 的计算为:

raw = Σ_i  weight_i × P̂(action_i)
score = offset_score(raw)

offset_score 在非负时加 0.001;负分被映射到区间 (0, 0.001)。之后再乘作者多样性因子与关系外因子,最后执行新作者抬分。

EnableMpnScoring 默认为 false。若开启,多样性因子与关系外因子只作用于正净值,负净值不放大。dwell_regret_sigmoidgated_dwell_regret 是另一套公式,用批次内相对位置调制停留,不是默认路径。

5.3 默认权重

来源为 home-mixer/params/param.rs。文件标注为 mirrored from config feature-switch defaults; last sync 2026-08-12T04:09:22Z。

正项与零权重项:

预测行为参数默认权重相对 FavoriteWeight
复制链接分享ShareViaCopyLinkWeight20.040
回复ReplyWeight5.010
引用QuoteWeight5.010
私信分享ShareViaDmWeight5.010
关注作者FollowAuthorWeight4.08
分享(通用)ShareWeight2.04
转帖RetweetWeight1.02
点赞FavoriteWeight0.51
打开帖ClickWeight0.40.8
打开外链OpenLinkWeight0.20.4
展开图片、打开视频、视频完播(VQV)、点进引用对应 *Weight0.050.1
连续停留(秒)ContDwellTimeWeight0.004
未探索帖PostUnexploredWeight0.02仅关系内,且默认为加性项
点击停留、引用 VQV、资料点击、二元停留对应参数0.0默认不进入加权

负项:

预测行为参数默认权重相对 FavoriteWeight 的绝对值比
未停留NotDwelledWeight−0.020.04
拉黑作者BlockAuthorWeight−31.262.4
不感兴趣NotInterestedWeight−43.286.4
静音作者MuteAuthorWeight−58.8117.6
举报ReportWeight−234.0468

权重不是互动计数的乘数。模型预测的是当前观众对当前候选采取该行为的概率。已有较高互动计数的帖,若模型判断当前观众采取正行为的概率低、采取负行为的概率高,其加权分仍可以较低。

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.5floor = 0.25。对应乘数为:

同一结果中的序号k乘数
第 1 条01.00
第 2 条10.625
第 3 条20.4375
第 4 条30.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() 包括:

  • 作者停用、停权、注销或下线
  • 受保护账号且观众未关注
  • 观众拉黑作者、静音作者、或静音转帖
  • 观众无权查看的独家内容
  • 帖标签:PDNABOUNCESPAMFOR_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_RECALLDO_NOT_AMPLIFY:仅在观众未关注时丢弃

因此,带有高召回垃圾或 NSFW 高精确等标签的帖,可以出现在关注者的主页时间线中,但不会作为 For You 推荐分发给未关注者。

仓库测试表明,EGREGIOUS_NSFWRECOMMENDATIONS_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_SPAMAGATHA_SPAM_TOP_USERSEARCH_BLACKLISTUNSAFE_URLCOPYPASTA_SPAMRISKY_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 的过程。权重会随实验与产品决策变化。
  • EnablePhoenixSourceEnableSimclustersSource、广告混排类型、ValueModelMode 都可以按观众分组切换。

阅读该仓库时,可以将默认值视为当前主假设,将 param.rs 的差异视为算法变更记录。


9. 对创作者的含义

本节只陈述可由源码直接推出的后果。它们是机制描述,不是运营策略。

9.1 进入候选集合的条件

  1. AgeFilter 与 SimClusters 的 48 小时上限共同限定 For You 资格。超过该时间窗的帖不再进入该管线,而不是以较低权重继续排序。
  2. 已看过或已分发的帖会被预过滤器移除。同一观众的后续请求不会再次选出同一条。
  3. 观众自己的帖不会出现在该观众的 For You 中。作者查看自己的帖不会构成分发信号。
  4. 订阅可见或独家内容不会进入未订阅观众的 For You。面向未订阅者的分发需要不设订阅限制的原创主帖。
  5. 关系外转帖与回复在打分前被移除。面向未关注者的分发主体是原创主帖。

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. 范围限定

下列判断不能仅由本仓库闭合,或需要按源码作限定:

  1. TweetMixer、Phoenix Topics 与 MOE 源在代码中存在。TweetMixer 与 MOE 默认关闭。线上是否对部分观众开启,仓库中没有记载。
  2. PhoenixScores 字段是概率还是对数概率,取决于未开源的预测客户端。
  3. Home Mixer 会发送 DPP 参数。vm-ranker 命令行默认不启用 DPP。生产进程是否启用,仓库中没有记载。
  4. NewUserAgeThresholdSecs 默认为 0,因此新用户关系外附加因子在仓库默认值下通常不生效。
  5. 可见性过滤之后不再按分数重排。广告混排会再次调整有机帖顺序。屏幕位置不必等于打分名次。
  6. 部分打标规则未开源。BDSM 阈值与 abuse-enforcement-service 的粉丝门槛已替换为示例值。
  7. AGATHA_SPAM 等标签会被写入,但不在已公开的可见性丢弃表中。
  8. media-model-proxy 不提供名为 AdultContent 的在服模型。成人相关能力通过 XxNsfw 等输出头,以及 adult-content/pnsfwmedia/ 的训练代码实现。
  9. 作者多样性公式为 (1 − 0.25) × 0.5^k + 0.25,不是 0.5^k 截断到 0.25。
  10. 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
DPPvm-ranker/scoring/dpp_model.rs

本报告依据仓库静态源码整理。线上实验、未开源规则与未同步的配置覆盖,以 𝕏 生产系统为准。