Skip to content

Instantly share code, notes, and snippets.

@opparco
Created September 9, 2025 03:55
Show Gist options
  • Select an option

  • Save opparco/a722fa0c18c889f70703e832d95edc6c to your computer and use it in GitHub Desktop.

Select an option

Save opparco/a722fa0c18c889f70703e832d95edc6c to your computer and use it in GitHub Desktop.
Summarize by Claude

X (Twitter) レコメンデーションアルゴリズムの技術的に面白い箇所

概要

このドキュメントでは、X(旧Twitter)のレコメンデーションアルゴリズムのコードベースから、技術的に特に興味深い実装や設計について解説します。

1. Navi: Rust製高性能MLモデルサーバー

特徴

  • プロダクション最適化: 超高性能、安定性、可用性を重視したミニマリスト設計
  • TensorFlow Serving互換: 既存のTensorFlow ServingクライアントとgRPC APIで互換性
  • プラグインアーキテクチャ: TensorFlow、ONNX Runtime、PyTorch(実験的)をサポート

技術的なポイント

// 予測サービスの非同期アーキテクチャ
pub async fn predict(
    &self,
    idx: usize,
    version: Option<i64>,
    val: Vec<TensorInput>,
    ts: Instant,
) -> Result<PredictResult>
  • 非同期処理: Tokioベースの完全非同期実装で高スループットを実現
  • メッセージパッシング: MPSCチャネルを使用したワーカープールパターン
  • モデル管理: 複数モデル・複数バージョンの動的ロード/アンロード
  • Prometheus統合: リアルタイムメトリクス収集

2. SimClusters: コミュニティベース埋め込み

アルゴリズムの核心

  1. 二部グラフ表現: フォロー関係を Producer(フォローされる人)と Consumer(フォローする人)の二部グラフで表現
  2. コミュニティ検出: Metropolis-Hastings サンプリングベースのコミュニティ検出で約145,000のコミュニティを発見
  3. スパース埋め込み: 各プロデューサーは最大1つのコミュニティに所属する最大スパース行列

技術的な革新

  • Known For 行列: プロデューサー→コミュニティの関係(n × k行列、k ≈ 145,000)
  • InterestedIn 行列: A × V = U の計算でユーザーの長期的興味を算出
  • リアルタイム更新: Heronストリーミングジョブでツイート埋め込みをリアルタイム更新
// ツイート埋め込みの更新ロジック
// ユーザーがツイートをファボるたびに、そのユーザーのInterestedInベクトルがツイートベクトルに加算される

3. UTEG (User Tweet Entity Graph): 高性能インメモリグラフ

GraphJetフレームワークの活用

  • インメモリ処理: 24-48時間のユーザーエンゲージメントをメモリに保持
  • 協調フィルタリング: 重み付きフォローグラフからトップ重み付きツイートを効率的に取得
  • リアルタイム更新: Kafkaストリームでリアルタイムに状態を取り込み・永続化

技術的特徴

  • 効率的なグラフ探索: "XXX Liked"のout-of-networkツイート生成
  • GC最適化: 古いイベントの自動削除とガベージコレクション
  • Finagleサービス: 高性能なThriftサービスとして実装

4. Real Graph: ユーザー間相互作用予測

機械学習パイプライン

  • 勾配ブースティング: ユーザー間相互作用の確率を予測
  • BigQueryベース: 大規模グラフデータの効率的な処理
  • 特徴量工程: ツイート数、フォロー数、ファボ数、その他の行動メトリクス

データ処理アーキテクチャ

// 日次集計 → ロールアップ処理 → ML予測スコア算出
// 複数の相互作用タイプ(ファボ、RT、フォローなど)を統合

5. Tweepcred: PageRankベースユーザー影響度算出

PageRankの応用

  • ユーザー影響度: ユーザー間の相互作用(メンション、RTなど)をエッジとするグラフでPageRank
  • Hadoop MapReduce: 大規模分散処理での実装
  • レピュテーション調整: フォロワー/フォロー比による後処理調整

最適化技術

  • ブロック圧縮: メモリ使用量削減
  • 遅延ロード: 必要時のみデータロード
  • インメモリキャッシュ: 高速アクセス

6. 統合ユーザーアクション (UUA): リアルタイムストリーム処理

ストリーミングアーキテクチャ

  • 統合ストリーム: クライアント・サーバーサイドイベントの統一処理
  • マルチシンク: Kafka → HDFS、GCP Pubsub、BigQuery への並列出力
  • リアルタイム性: 暗黙・明示的ユーザーアクション(ブックマーク、インプレッション、動画視聴)

7. Product Mixer: パイプラインフレームワーク

設計パターン

  • コンポーネント指向: 再利用可能で標準化されたコンポーネント
  • パイプライン設定: どのコンポーネントをいつ使用するかの宣言的設定
  • 階層構造: Product → Mixer → Recommendation → Candidate → Scoring

実装の特徴

// 型安全なパイプライン設定
// 異種候補の統合(ツイート、広告、ユーザー)
// 同種候補のスコアリング・ランキング

8. 重み付きランキングモデル

Heavy Ranker (ClemNet)

  • マルチタスク学習: 通知開封確率とエンゲージメント確率を同時予測
  • 畳み込み層: 独自の畳み込みアーキテクチャ
  • 継続学習: リアルタイムモデル更新とチェックポイント管理

Light Ranker

  • ロジスティック回帰: より多くのツイートに対する簡易版Heavy Ranker
  • リアルタイム特徴: RT数、ファボ数、返信数、毒性・ブロックスコア
  • 静的特徴: URL有無、トレンドワード、テキスト品質スコア

9. リアルタイム特徴量パイプライン

Earlybird特徴量パイプライン

  • Index Ingester: ツイート生成時の基本情報・静的特徴
  • Signal Ingester: 動的特徴(エンゲージメント数、スパムシグナル)
  • User Table Features: ユーザーごとの特徴量
  • Search Context Features: 検索者の情報(言語、時間)

技術的な教訓

  1. スケーラビリティ: インメモリ処理とストリーミングの組み合わせで大規模リアルタイム処理
  2. モジュラリティ: コンポーネント指向設計で保守性と再利用性を実現
  3. 多言語活用: 用途に応じた最適な言語選択(Rust、Scala、Python)
  4. データパイプライン: バッチ処理とストリーミングの効果的な組み合わせ
  5. 機械学習の実用化: 研究とプロダクションの橋渡しとなる実装

これらの技術は、月間数億ユーザーという大規模ソーシャルメディアプラットフォームの要求を満たすための、実践的で革新的なソリューションを示しています。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment