你以為推薦演算法是在「猜你喜歡什麼」。不是。它在預測你「會做什麼動作」。

xAI 把 X 平台「為你推薦」的完整推薦系統原始碼丟上了 GitHub。不是示意圖,不是論文,是真的在跑的那套程式碼。從幾十億則貼文裡,即時幫你挑出最相關的幾十則——決定你每天打開 X 會看到什麼。

23,761 顆星,Apache 2.0 授權。這是目前公開過最完整的 production-level 社群推薦系統,包含檢索、排序、過濾、廣告混合、內容安全,整條鏈路一次攤開。

不是猜你喜歡,是算你會幹嘛

先搞懂一件事:推薦系統不是在做「你喜歡貓所以推貓」這種事。

想像你走進一間有三萬道菜的自助餐。餐廳不可能讓你一道一道看,所以它分兩步:第一步,服務生先從三萬道菜裡撈出三百道你可能感興趣的(粗篩);第二步,主廚根據你的口味、今天的心情、甚至你上次剩了什麼菜沒吃,幫你排出最上面那十道。

x-algorithm 就是這樣。Two-Tower Retrieval 負責粗篩,Transformer Ranking 負責精排。

粗篩用的是「雙塔模型」——一邊是你的使用者特徵,一邊是貼文特徵,兩邊各自算出一個向量,距離近的就是候選。這步要快,幾十億則貼文要在毫秒內縮到幾百則。

精排才是真正的主角。

Grok 的骨架,換了一個腦子

這裡有個反直覺的事:排序模型的 Transformer 架構是直接從 Grok-1 移植過來的。對,就是那個聊天機器人的骨架。同樣的結構,但目的從「生成下一個字」變成「預測你會不會按讚」。

這就像拿一台法拉利的引擎,裝到一台送貨車上。引擎沒變,但用途完全不同。Grok 學到的語言理解能力,現在被拿來理解「這個人看到這則貼文會有什麼反應」。

更猛的是,它不只預測一件事。模型同時預測你對一則貼文可能做的 19 種動作——按讚、回覆、轉發、引用、收藏、封鎖、檢舉、停留時間……全部同時算。最終分數是這 19 個機率的加權總和。

為什麼是 19 種?因為單看「按讚」太片面了。一個人可能看到某則貼文想回覆但不想按讚,另一個人看到想轉發但會封鎖作者。推薦系統要的不是「你喜不喜歡」,是「你會做出什麼行為」,然後把這些行為的商業價值加權。

四大模組,兩種語言

整個系統拆成四塊,Rust 和 Python 各管各的:

home-mixer 是協調層,用 Rust 寫的。它的工作像餐廳的外場經理——不自己做菜,但負責把前菜、主菜、甜點、廣告(對,廣告也是一道菜)按順序排好端上桌。你的 For You feed 最終長什麼樣,就是它組裝出來的。

thunder 也是 Rust,負責即時貼文儲存。用 DashMap 做記憶體快取,背後接 Kafka。有人發了一則新貼文,thunder 確保幾秒內就能被推薦系統看到。速度在這裡是一切。

phoenix 是 ML 模型核心,Python 搭配 JAX 框架寫的。Two-Tower 檢索和 Grok Transformer 排序都在這裡。取名 phoenix 大概是因為從舊系統浴火重生的意思(純猜)。

grox 也是 Python,做內容理解。垃圾訊息偵測、內容分類、多模態嵌入(圖片和文字一起看)。它是推薦系統的眼睛——不懂內容是什麼,就沒辦法推薦。

為什麼用兩種語言?Rust 處理高併發的服務層,效能好、記憶體安全;Python/JAX 處理 ML 推論,生態成熟、迭代快。各取所長。

Candidate Isolation:一個精妙的設計

這邊有個技術細節值得特別講。

一般 Transformer 裡,所有 token 可以互相看到(self-attention 嘛)。但 x-algorithm 在排序的時候做了一個 trick:候選貼文之間互相看不到。

什麼意思?假設系統要幫你排 200 則候選貼文。正常做法是 200 則一起丟進 Transformer,讓它們互相比較。但 x-algorithm 的做法是:每則候選貼文只能看到「你的使用者上下文」,看不到其他候選。

用排隊的比喻:不是 200 個人站在你面前讓你比較,而是每個人獨立走進房間跟你面談,你給每個人打分,他們之間不知道彼此的存在。

這帶來三個好處。分數獨立,不會因為旁邊放了一則超熱門貼文就影響其他人的分數。可以快取,因為使用者上下文短時間內不會變,算過的中間結果能重複用。可以平行,200 則候選可以同時算,不用等。

這不是什麼天才發明,但在 production 規模下,這種設計決定了系統撐不撐得住。

和 2023 年那次開源差在哪

2023 年 Twitter 也開源過推薦演算法。那次用的是 SimClusters(社群聚類)加上手工設計的特徵,Scala 語言,模型相對簡單。

三年後的版本跳了一整個世代:

手工特徵變成 Grok Transformer 自動學習。Scala 整個換成 Rust。模型從淺層跳到 2-4 層 Transformer。而且這次包含了完整的廣告混合和內容安全邏輯——2023 年那次這兩塊是拿掉的。

開源出來的是縮小版(mini),Embedding 維度 128~256,模型大概 3 GB。生產環境的版本更大,但架構一模一樣。

限制要先講清楚

三個重要的但是。

第一,這是 transparency release,不是社群專案。xAI 放出來是為了透明度,不是要大家一起貢獻 PR。Issue 和 Discussion 不一定會有人回。

第二,沒有訓練程式碼。你看到的是推論(inference)的部分,怎麼訓練模型的程式碼沒有放。所以你可以理解它怎麼跑,但沒辦法自己從頭訓一個。

第三,Rust 元件依賴 X 內部的建置系統。你沒辦法 cargo build 就直接跑起來,需要自己補一些相依套件。Python 部分相對獨立,比較好玩。

看懂它你會學到什麼

推薦系統的論文滿天飛,但能看到真正跑在幾億使用者上的完整程式碼,這是第一次。

這套系統背後其實就兩條線在拉扯:速度精準度。粗篩要快所以用向量檢索,精排要準所以上 Transformer。Rust 管速度,Python 管精準。19 個預測目標管精準,Candidate Isolation 管速度。

每一個設計決策都是在這兩條線之間找平衡。理解了這個框架,你看任何推薦系統都能快速抓到它的取捨。不只是 X,YouTube、TikTok、Instagram 的推薦系統骨子裡都在處理同一個問題——只是各自選了不同的平衡點。


原始碼:xai-org/x-algorithm — GitHub