
剖析 X 推薦演算法:貼文是如何出現在你的「為您推薦」?
X(原 Twitter)開源了決定「為您推薦」(For You)動態時報的核心推薦演算法原始碼(x-algorithm GitHub 倉庫)。這項舉措讓開發者與研究人員得以跳過行銷術語,直接檢視支撐全球最大社交平台之一的核心工程邏輯與系統架構。
圖片來源: GitHub - xai-org/x-algorithm: Algorithm powering the For You feed on X · GitHub
推薦系統的核心:雙管道協作架構
在 X 的設計中,「為您推薦」動態時報的組裝是單次請求即時生成的。整個系統架構由兩大管道(Pipelines)協同工作,並在 home-mixer/ 模組中完成整合:
- 帖子管道(Post Pipeline / PhoenixCandidatePipeline):負責候選帖子的檢索、過濾、排序與安全篩選。
- 混合管道(Blending Pipeline / ForYouCandidatePipeline):負責在已排序的帖子中,插入非模型排序的內容,例如廣告(Ads)、推薦關注(Who to Follow)、系統提示(Prompts)以及推送引導,最終由
BlenderSelector進行交織(Interleaving)輸出。
這兩個管道建構於名為 candidate-pipeline 的高效、可組合的 Rust 框架之上。該框架實現了業務邏輯與管道監控的分離,並支援多個候選源與過濾器的並行執行。
請求路徑(Request Path)的七大步驟
當你打開 X App 載入「為您推薦」時,系統會在極短的延遲內執行以下請求路徑:
1. 查詢水合(Query Hydration)
系統首先讀取使用者的即時情境。最核心的輸入是用戶的即時互動序列(User Action Sequence),同時載入關注列表、黑名單與靜音帳號、已靜音的關鍵字、當前會話中已讀或已送出的帖子,以及關注的主題等。
2. 並行檢索候選源(Candidate Sources)
系統會同時在網內(In-Network)與網外(Out-of-Network)兩個方向平行調用候選源,目標是抓取數百到數千條潛在帖子:
- 網內(In-Network):由
thunder/模組負責。它在記憶體中維護用戶關注帳號最新發布的帖子,並直接讀取出來。 - 網外(Out-of-Network):
phoenix/檢索:將用戶與帖子映射為高維向量,利用向量相似度檢索最接近用戶興趣的貼文。simclusters/檢索:根據「誰與什麼互動」將帳號與帖子劃分為不同的社區(Clusters),再計算社區相似度來召回潛在的網外優質帖子。
3. 候選水合(Candidate Hydration)
將初步召回的帖子補全完整的中繼資料(Metadata),包括帖子文本與媒體資源、作者詳情、帳號標籤、被引用的原始帖子、語言、實時互動計數(點讚、轉發數)以及作者的訂閱者狀態等。
4. 評分前過濾(Pre-Scoring Filters)
在進行昂貴的模型計算前,系統會依次調用 home-mixer/filters/ 下的十多個過濾器以減少計算浪費:
DropDuplicatesFilter:移除多個源召回的重複帖子。AgeFilter:過濾掉發布超過 48 小時的陳舊貼文。SelfTweetFilter:剔除用戶自己發布的貼文。PreviouslySeen/ServedFilters:利用用戶曝光記錄,過濾已讀或在當前會話中已展示過的帖子。MutedKeyword/AuthorSocialgraphFilter:攔截用戶靜音的關鍵字,以及用戶封鎖或靜音的帳號。IneligibleSubscriptionFilter:剔除用戶無權訪問的訂閱者專屬(Subscriber-only)帖子。
5. 評分與排序(Scoring & Ranking)
過濾後的候選帖子將送入核心預測與重排引擎:
- 多目標預測(PhoenixScorer):採用基於 JAX 訓練、Rust 實時服務的
PhoenixTransformer 模型。它不會預測單一的「相關性」得分,而是預測用戶對該帖子採取各項操作的獨立機率,包括積極互動(讚、回覆、轉發、引用、分享、點擊展開等)、消極互動(不感興趣、靜音、舉報、不停留)以及停留時間(Dwell Time)。 - 加權綜合評分(RankingScorer):將上述各項預測機率,乘以對應的權重(積極權重為正,消極權重為負)進行加權求和,公式為: $$ ext{Final Score} = \sum ( ext{weight}_i imes P( ext{action}_i))$$
- 動態調整:
- 作者多樣性(Author Diversity):對同一作者的多條帖子乘以衰減因子,避免時報被單一作者霸屏。
- 網外折扣(Out-of-Network Discount):對非關注帳號的帖子、轉發與回覆乘以小於 1 的折扣。
- 新作者補償(New-Author Boost):對曝光量低於閾值的新創作者進行曝光扶持。
- 多樣性重排(VMRanker):最後調用
vm-ranker/獨立服務,利用**行列式點過程(Determinantal Point Process, DPP)**算法,在帖子嵌入向量(Embeddings)空間上重新排序,略微犧牲頂部評分以換取相鄰帖子間的多樣性,避免同質化。
6. 選擇(Selection)
由 TopKScoreSelector 對最終重排得分進行排序,保留前 K 條最高分的帖子。
7. 評分後過濾(Post-Selection Filters)
排序確定後,進行最終的安全過濾:
VFFilter:向visibility-filtering/(可見性過濾模組)查詢,移除判定為不允許顯示的貼文。AncillaryVFFilter:如果貼文的父貼、引用貼或被轉發貼在VFFilter中被 Drop,則該貼也同步被連鎖剔除。DedupConversationFilter:摺疊同一討論串(Thread)中過度分支的內容。
獨立的標籤與可見性路徑(Labeling & Visibility Path)
X 演算法架構中最核心的設計原則之一,就是將**「評分排序」與「安全過濾」徹底解耦**。排序決定位置,而可見性過濾決定帖子能否顯示。這條「標籤路徑」是在後台持續、非同步運行的:
┌────── 1. 持續內容理解 ──────┐ ┌────── 2. 標籤規則引擎 ──────┐ ┌───── 3. 儲存與調用 ─────┐
│ 帖子分析: grox, clip, │ ───► │ 規則匹配: scarecrow │ ───► │ 寫入標籤儲存, 於 Request │
│ media-model-proxy │ │ (基於 botmaker 運行) │ │ Path 由 visibility- │
│ 帳號 PageRank: user-cred-v2 │ │ 安全與處罰: │ │ filtering/ 讀取過濾 │
│ 行為建模: bdsm, agatha │ │ abuse-enforcement-service │ │ │
└─────────────────────────────┘ └─────────────────────────────┘ └──────────────────────────┘
1. 持續內容理解
當帖子發布或用戶產生互動時,後台服務會持續運行:
- 帖子與媒體分類:
grox/對文本和媒體進行垃圾訊息、成人內容及暴力內容分類;media-model-proxy/與clip/則提供圖像與文本的特徵嵌入(Embeddings)與敏感符號識別。 - 帳號信譽與特徵:
user-cred-v2/在關注圖譜和互動邊上運行 PageRank 算法,為每個帳號計算全域權重(PageRank Score);bdsm/追蹤帳號的行為序列以識別協同性機器人(Bot)或異常濫用行為;agatha/則通過異步批處理,分析其他用戶對該帳號帖子的舉報、屏蔽相較於收藏(Favorites)的比例,判定是否需要打上限制標籤。
2. 標籤與安全規則(Labeling Rules)
scarecrow/規則引擎:實時對事件做出響應。它嵌入了名為botmaker/的專屬規則語言編譯器與運行時,加載位於botmaker-rules/scarecrow/的規則。其邏輯為:「當事件發生且滿足條件時,對帖子或帳號標記特定 Label」。abuse-enforcement-service/:根據安全模型的預測分數,自動對帳號或帖子實施標記、挑戰(如驗證碼)或直接暫停處置。
3. 可見性判定(Visibility Filtering)
當請求路徑讀取到帖子標籤後,visibility-filtering/ 會依據規則(定義於 rules/registry.rs 中)輸出三種精確判定:
- ALLOW(允許):正常在動態時報中顯示。
- INTERSTITIAL(插頁遮罩):帖子保留在時報中,但表面會覆蓋一層警告遮罩(例如針對成人內容或血腥媒體),用戶點擊後方可穿透閱讀。
- DROP(直接丟棄):帖子被完全移出,絕不展示。
注意:某些嚴格的過濾規則(如高召回率的垃圾郵件攔截)僅適用於網外推薦,若用戶主動關注了該作者,相同的帖子則會被允許(ALLOW)顯示,以平衡安全性與用戶的自主選擇權。
關鍵技術設計決策
- 候選隔離排序(Candidate Isolation in Ranking):在 Transformer 進行推理時,候選帖子之間無法互相協同注意(Attention),它們僅能與用戶的情境特徵進行 Attention 計算。這項設計確保了帖子的預測評分完全獨立,不因批處理(Batch)中混入了哪些其他帖子而改變,從而使評分高度一致且可進行緩存。
- 哈希無庫向量查找(Hash-Based Embeddings):檢索與排序使用多個哈希函數直接進行嵌入向量尋找(Lookup)。這種設計無需維護龐大的靜態詞彙表,新發布的帖子或新註冊的用戶能立刻獲得向量表示並被推薦,解決了冷啟動問題。
- 行列式點過程多樣化:在 VMRanker 中利用 DPP 算法重排,在向量空間中拉開相鄰帖子間的距離,天然地防止了刷到過多相似主題的帖子,比傳統的硬性規則過濾更具語意柔性。
常見問題
Q1:公開程式碼會導致個人隱私外洩嗎? 不會。開源庫僅包含模型架構、訓練流程、管道邏輯與評分規則,並未包含任何個別使用者的隱私資料、真實互動矩陣或生產環境的特徵數據。
Q2:為什麼我的動態時報仍會出現完全不感興趣的「探索性」內容?
這是演算法有意的「探索與利用(Exploration and Exploitation)」策略。為了防止用戶陷入資訊繭房,並修正和更新推薦模型的泛化精度,系統會分配一定比例的流量進行實驗性推送,這在預評分階段表現為 InventoryHoldoutFilter 的確定性實驗分配。
Q3:演算法是否存在不透明或偏袒特定言論的可能?
為了回應公眾對黑箱推薦的質疑,X 伴隨演算法開源推出了一款 Under the Hood 標籤透明度工具(在 under-the-hood/ 中實現,可在 x.com/i/under_the_hood 訪問)。該工具會聚合並展示你帳號及帖子的可見性限制標籤,讓用戶能直接對照開源代碼中的規則,了解自己的貼文是否以及如何受到限制。
Q4:倉庫中開源了所有代碼嗎?有哪些被隱藏了? 出於安全防禦和防止惡意刷量(Gaming the system)的考量,有極少數的核心敏感配置被排除在開源倉庫之外,包括:
- Grox 提示詞:例如用於引導 LLM 對內容進行理解與標籤判定時使用的
.j2模板文件。 - 部分 Botmaker 規則:特別是那些用於防範垃圾帳號惡意繞過、濫用系統的底層檢測規則。
研發與本地運行指南
對於希望動手實踐的開發者,X 演算法在 phoenix/ 目錄下提供了完整的 Cargo 專案空間、pyproject.toml 以及一鍵運行 QUICKSTART.md。
專案隨附了合成數據生成器(Synthetic Data Generator)。開發者可以在本地一鍵編譯 Rust 預測層,並利用 JAX 與合成數據,從零到一完成一個輕量級 Phoenix 推薦模型的訓練與Serving推理,是學習現代大型推薦系統工程設計的教科書級實踐項目。
# 進入 Phoenix 開發目錄並查看快速開始指引
cd phoenix/
cat QUICKSTART.md



