Table de contenu Overview System Architecture Components Home Mixer Thunder Phoenix Candidate Pipeline How It Works Pipeline Stages Scoring and Ranking Filtering Key Design Decisions Vue d’ensemble L'algorithme de For You feed récupère, classe et filtre les messages à partir de deux sources: In-Network (Thunder): Posts provenant des comptes que vous suivez Out-of-Network (Phoenix Retrieval): Posts découverts à partir d’un corpus mondial Les deux sources sont combinées et classées ensemble en utilisant , un modèle de transformateur basé sur Grok qui prédit les probabilités d'engagement pour chaque poste. Le score final est une combinaison pondérée de ces engagements prédits. Phoenix Le transformateur basé sur Grok fait tout le lourd soulèvement en comprenant votre historique d'engagement (ce que vous avez aimé, répondu, partagé, etc.) et en utilisant cela pour déterminer quel contenu est pertinent pour vous. Architecture du système ┌─────────────────────────────────────────────────────────────────────────────────────────────┐ │ FOR YOU FEED REQUEST │ └─────────────────────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────────────────────┐ │ HOME MIXER │ │ (Orchestration Layer) │ ├─────────────────────────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ QUERY HYDRATION │ │ │ │ ┌──────────────────────────┐ ┌──────────────────────────────────────────────┐ │ │ │ │ │ User Action Sequence │ │ User Features │ │ │ │ │ │ (engagement history) │ │ (following list, preferences, etc.) │ │ │ │ │ └──────────────────────────┘ └──────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ CANDIDATE SOURCES │ │ │ │ ┌─────────────────────────────┐ ┌────────────────────────────────┐ │ │ │ │ │ THUNDER │ │ PHOENIX RETRIEVAL │ │ │ │ │ │ (In-Network Posts) │ │ (Out-of-Network Posts) │ │ │ │ │ │ │ │ │ │ │ │ │ │ Posts from accounts │ │ ML-based similarity search │ │ │ │ │ │ you follow │ │ across global corpus │ │ │ │ │ └─────────────────────────────┘ └────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ HYDRATION │ │ │ │ Fetch additional data: core post metadata, author info, media entities, etc. │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ FILTERING │ │ │ │ Remove: duplicates, old posts, self-posts, blocked authors, muted keywords, etc. │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ SCORING │ │ │ │ ┌──────────────────────────┐ │ │ │ │ │ Phoenix Scorer │ Grok-based Transformer predicts: │ │ │ │ │ (ML Predictions) │ P(like), P(reply), P(repost), P(click)... │ │ │ │ └──────────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────────────────┐ │ │ │ │ │ Weighted Scorer │ Weighted Score = Σ (weight × P(action)) │ │ │ │ │ (Combine predictions) │ │ │ │ │ └──────────────────────────┘ │ │ │ │ │ │ │ │ │ ▼ │ │ │ │ ┌──────────────────────────┐ │ │ │ │ │ Author Diversity │ Attenuate repeated author scores │ │ │ │ │ Scorer │ to ensure feed diversity │ │ │ │ └──────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ SELECTION │ │ │ │ Sort by final score, select top K candidates │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ▼ │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ FILTERING (Post-Selection) │ │ │ │ Visibility filtering (deleted/spam/violence/gore etc) │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────────────────────────────┐ │ RANKED FEED RESPONSE │ └─────────────────────────────────────────────────────────────────────────────────────────────┘ Composants Mixer à domicile Location: home-mixer/ La couche d'orchestration qui assemble le For You feed. cadre avec les étapes suivantes : CandidatePipeline Stage Description Query Hydrators Fetch user context (engagement history, following list) Sources Retrieve candidates from Thunder and Phoenix Hydrators Enrich candidates with additional data Filters Remove ineligible candidates Scorers Predict engagement and compute final scores Selector Sort by score and select top K Post-Selection Filters Final visibility and dedup checks Side Effects Cache request info for future use Rechercher des hydratants Retrouvez le contexte de l'utilisateur (historique de l'engagement, liste suivante) Sources Récupérer les candidats de Thunder et Phoenix hydraulique Enrichir les candidats avec des données supplémentaires Les filtres Supprimer les candidats non éligibles Scoreurs Prévoir l’engagement et calculer les scores finaux Sélecteur Trier par score et sélectionner le top K Filtres post-sélection Visibilité finale et vérifications de dédoublement Effets secondaires Cache demande d'informations pour une utilisation future Le serveur expose un endpoint gRPC ( ) qui renvoie des messages classés pour un utilisateur donné. ScoredPostsService Le Thunder Location: thunder/ Un magasin de messagerie en mémoire et un pipeline d'ingestion en temps réel qui suit les messages récents de tous les utilisateurs. Consumes post créer / supprimer des événements de Kafka Maintenir des stocks par utilisateur pour les messages originaux, les réponses / réponses et les messages vidéo Servit les candidats de poste « en réseau » à partir des comptes suivis par l’utilisateur demandant Réduit automatiquement les messages plus anciens que la période de conservation Thunder permet des recherches sous millisecondes pour le contenu du réseau sans frapper une base de données externe. Phénix Location: phoenix/ Le composant ML avec deux fonctions principales: Retrieval (modèle à deux tours) Trouver des articles pertinents hors réseau : User Tower: Encode les fonctionnalités utilisateur et l'historique des engagements dans un embedding Candidate Tower: Encode tous les messages dans les embeddings Recherche de similitudes : Retrieves des messages top-K via similitude de produit Classement (Transformer avec isolation de candidat) Prévoir les probabilités d’engagement pour chaque candidat : Prend le contexte utilisateur (historique de l'engagement) et les messages des candidats en tant qu'entrée Utilisez un masque d'attention spéciale pour que les candidats ne puissent pas se rencontrer les uns les autres Sortie des probabilités pour chaque type d'action (comme, réponse, repost, clic, etc.) Voir Documentation architecturale détaillée. phoenix/README.md Le candidat à la pipeline Location: candidate-pipeline/ Un cadre réutilisable pour la construction de pipelines de recommandation. Définit les caractéristiques pour: Trait Purpose Source Fetch candidates from a data source Hydrator Enrich candidates with additional features Filter Remove candidates that shouldn't be shown Scorer Compute scores for ranking Selector Sort and select top candidates SideEffect Run async side effects (caching, logging) Source Récupérer les candidats à partir d'une source de données Hydrator Enrichir les candidats avec des fonctionnalités supplémentaires Filter Supprimer les candidats qui ne devraient pas être affichés Scorer Calcul du score pour le classement Selector Sélectionner et sélectionner les meilleurs candidats SideEffect Exécuter les effets secondaires asynchrones (caching, logging) Le cadre exécute les sources et les hydrates en parallèle où cela est possible, avec un traitement des erreurs et un enregistrement configurables. Comment ça fonctionne Les étapes du pipeline Hydratation de requête : récupère l'historique et les métadonnées des engagements récents de l'utilisateur (par exemple, la liste suivante) : Retrieve candidates from: Candidate Sourcing : Recent posts from followed accounts (in-network) Thunder : ML-discovered posts from the global corpus (out-of-network) Phoenix Retrieval : Enrich candidates with: Candidate Hydration Core post data (text, media, etc.) Author information (username, verification status) Video duration (for video posts) Subscription status : Remove posts that are: Pre-Scoring Filters Duplicates Too old From the viewer themselves From blocked/muted accounts Containing muted keywords Previously seen or recently served Ineligible subscription content : Apply multiple scorers sequentially: Scoring : Get ML predictions from the Phoenix transformer model Phoenix Scorer : Combine predictions into a final relevance score Weighted Scorer : Attenuate repeated author scores for diversity Author Diversity Scorer : Adjust scores for out-of-network content OON Scorer Sélection : trier par score et sélectionner les meilleurs candidats K Traitement post-sélection : validation finale des postes à servir Scoring et classement Le modèle de transformateur basé sur Phoenix Grok prédit les probabilités pour plusieurs types d'engagement : Predictions: ├── P(favorite) ├── P(reply) ├── P(repost) ├── P(quote) ├── P(click) ├── P(profile_click) ├── P(video_view) ├── P(photo_expand) ├── P(share) ├── P(dwell) ├── P(follow_author) ├── P(not_interested) ├── P(block_author) ├── P(mute_author) └── P(report) Le Combinez-les en un résultat final : Weighted Scorer Final Score = Σ (weight_i × P(action_i)) Les actions positives (comme, repost, share) ont des poids positifs.Les actions négatives (block, mute, report) ont des poids négatifs, poussant le contenu que l'utilisateur n'aura probablement pas aimé. filtrage Les filtres fonctionnent en deux étapes : Pre-Scoring Filters: Filter Purpose DropDuplicatesFilter Remove duplicate post IDs CoreDataHydrationFilter Remove posts that failed to hydrate core metadata AgeFilter Remove posts older than threshold SelfpostFilter Remove user's own posts RepostDeduplicationFilter Dedupe reposts of same content IneligibleSubscriptionFilter Remove paywalled content user can't access PreviouslySeenPostsFilter Remove posts user has already seen PreviouslyServedPostsFilter Remove posts already served in session MutedKeywordFilter Remove posts with user's muted keywords AuthorSocialgraphFilter Remove posts from blocked/muted authors DropDuplicatesFilter Supprimer les identifiants de poste dupliqués CoreDataHydrationFilter Supprimer les messages qui n'ont pas réussi à hydrater les métadonnées de base AgeFilter Supprimer les messages plus anciens que le seuil SelfpostFilter Supprimer les propres messages de l'utilisateur RepostDeduplicationFilter Reposts de même contenu IneligibleSubscriptionFilter Supprimer le contenu paywalled L'utilisateur ne peut pas accéder PreviouslySeenPostsFilter Supprimer les messages l'utilisateur a déjà vu PreviouslyServedPostsFilter Supprimer les messages déjà envoyés en session MutedKeywordFilter Supprimer les messages avec les mots clés mutés de l'utilisateur AuthorSocialgraphFilter Supprimer les messages d'auteurs bloqués / mutés Post-Selection Filters: Filter Purpose VFFilter Remove posts that are deleted/spam/violence/gore etc. DedupConversationFilter Deduplicate multiple branches of the same conversation thread VFFilter Supprimer les messages qui ont été supprimés/spam/violence/en haut, etc. DedupConversationFilter Déduplicer plusieurs branches du même fil de conversation Décisions de conception clés Aucune caractéristique manuellement ingénieuse Le système s'appuie entièrement sur le transformateur basé sur Grok pour apprendre la pertinence à partir des séquences d'engagement de l'utilisateur. Aucune ingénierie manuelle des fonctionnalités pour la pertinence du contenu. Isolation des candidats au classement Pendant la déduction de transformateur, les candidats ne peuvent pas s’attendre les uns aux autres – uniquement au contexte utilisateur.Cela garantit que le score pour un poste ne dépend pas des autres messages qui sont dans le lot, ce qui rend les scores cohérents et cacheables. Les embeddings basés sur le hash La recherche et le classement utilisent plusieurs fonctions de hachage pour incorporer des recherches Prévisions multi-action Plutôt que de prédire un seul score de « pertinence », le modèle prévoit les probabilités pour de nombreuses actions. Architecture des pipelines composables Le crate fournit un cadre flexible pour la construction de pipelines de recommandation avec: candidate-pipeline Séparation de l'exécution et du suivi du pipeline de la logique d'affaires Exécution parallèle des étapes indépendantes et gestion gracieuse des erreurs Ajouter facilement de nouvelles sources, hydratations, filtres et scorers Remarque : La mise en œuvre du transformateur est portée à partir de la version open source de Grok-1 par xAI, adaptée pour les cas d'utilisation du système de recommandation. Remarque : La mise en œuvre du transformateur est portée à partir de la version open source de Grok-1 par xAI, adaptée pour les cas d'utilisation du système de recommandation. Grok-1 en version open source Ce projet est sous licence Apache 2.0. Ce projet est autorisé en vertu de . Licence Apache 2.0