X Algorithm 소개
X Algorithm은 전 세계 수억 명의 사용자가 매일 마주하는 소셜 미디어 X(이전의 Twitter)의 'For You(추천)' 타임라인을 구성하는 핵심 엔진입니다. 이 프로젝트는 일론 머스크(Elon Musk)의 xAI 팀과의 긴밀한 협력을 통해 개발되었으며, 과거 트위터 시절부터 이어져 온 거대하고 복잡한 레거시 코드베이스를 End-to-End Deep Learning 기반의 현대적인 아키텍처로 완전히 탈바꿈시킨 결과물입니다.
X Algorithm은 특히 추천 문제(Recommendation)를 대규모 언어 모델(LLM)이 문장을 생성하는 방식과 유사하게 접근했다는 점이 흥미롭습니다. 기존의 추천 시스템이 '사용자'와 '아이템'의 정적인 매칭에 주력했다면, X Algorithm은 사용자의 과거 행동(좋아요, 리트윗 등)을 하나의 '문장(Sequence)'으로 보고, 다음에 올 행동을 예측하는 생성형(Generative) 방식을 채택했습니다. 이를 구현하기 위해 xAI가 이전에 공개한 Grok-1 모델 아키텍처를 추천 시스템에 맞게 경량화 및 최적화하여 적용했습니다.
X Algorithm의 공개는 단순한 코드 공개를 넘어, 추천 시스템의 패러다임이 어떻게 변화하고 있는지를 보여줍니다.
| 비교 항목 | Legacy System (기존 트위터) | Modern X Algorithm (현재) |
|---|---|---|
| 핵심 철학 | Heuristics & Rules: 사람이 직접 설계한 수천 개의 규칙과 가중치에 의존. (예: "이미지가 있으면 +2점") | End-to-End Learning: 원시 데이터(Raw Data)로부터 모델이 직접 피처와 패턴을 학습. |
| 모델 구조 | GBDT & Hybrid: 의사결정 나무(Decision Trees)와 초기 딥러닝 모델이 혼재된 복잡한 구조. | Transformer (Grok-based): 어텐션(Attention) 메커니즘을 활용한 단일 통합 아키텍처. |
| 데이터 처리 | Graph & Clusters: SimClusters, RealGraph 등 그래프 알고리즘에 크게 의존하여 후보를 추출. | Embedding & ANN: 사용자/게시물을 고차원 벡터로 변환하여 유사도 검색(Two-Tower Architecture). |
| 구현 언어 | Scala & Java: JVM 기반으로, 무거운 런타임과 가비지 컬렉션(GC) 이슈 존재. | Rust & JAX: 고성능 시스템 프로그래밍 언어와 최신 ML 프레임워크의 결합. |
| 목표 변수 | Relevance Score: 하나의 통합된 '관련성 점수'를 산출. | Multi-Action Probability: 좋아요, 리플, 리포스트, 체류 시간 등 다양한 행동 확률을 개별 예측. |
X Algorithm은 트윗 추천을 위해 두 가지 데이터 흐름을 처리합니다. 첫째는 사용자가 팔로우하는 계정의 게시물인 In-Network 소스이며, 둘째는 사용자가 팔로우하지 않았지만 관심을 가질 만한 Out-of-Network 소스입니다. 이 두 소스는 Phoenix라고 불리는 통합 모델을 통해 처리되어 최종적으로 사용자의 'For You' 타임라인을 구성합니다.
기술적으로는 Python과 JAX/Flax 프레임워크를 사용하여 모델을 학습시키고, 실제 사용자에게 서비스를 제공하는 서빙(Serving) 레이어는 메모리 안전성과 병렬 처리 성능이 뛰어난 Rust로 전면 재작성되었습니다. 이를 통해 수천 개의 하드코딩된 규칙을 제거하고, 데이터 자체가 추천 로직을 결정하는 유연하고 강력한 시스템을 구축했습니다.
X Algorithm의 주요 아키텍처
전체 파이프라인은 크게 데이터 소싱(Sourcing), 후보 추출(Retrieval), 점수 산정(Scoring), 필터링(Filtering) 의 단계로 나뉩니다.
┌─────────────────────────────────────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────────────────────────────────────┘
이 모든 과정은 Thunder와 Phoenix라는 두 가지 핵심 마이크로서비스에 의해 구동됩니다.
Thunder: In-Network (팔로우) 처리 엔진
Thunder 는 사용자가 직접 팔로우한 계정들의 게시물을 처리하는 전용 엔진입니다. "내 타임라인에 내가 팔로우한 사람의 글이 안 보인다"는 불만을 해결하기 위해, 극도로 낮은 지연 시간(Low-latency)과 높은 처리량(Throughput)을 목표로 설계되었습니다.
-
실시간 수집 (Real-time Ingestion): Kafka와 같은 이벤트 스트림에서 발생하는 모든 트윗을 실시간으로 소비(Consume)하여 저장합니다.
-
저장소 구조 (Storage Abstraction): 내부적으로는 X의 독자적인 분산 KV 저장소(Key-Value)인 'Manhattan'을 사용하지만, 오픈소스 버전에서는 이를 추상화하여 RocksDB를 기본 백엔드로 사용하도록 구현되어 있습니다. 이는 로컬 환경에서도 대용량 데이터를 효율적으로 처리할 수 있게 합니다.
-
Sparse Computing: 팔로우하는 계정이 수천 명이어도, 실제로 최근에 활동한 계정은 소수입니다. Thunder는 이러한 희소성(Sparsity)을 활용하여, 모든 팔로우 계정을 검색하지 않고 최근 활동이 있는 계정의 데이터만 빠르게 조회하여 병합(Merge)합니다.
Phoenix: 통합 추천 및 랭킹 모델
Phoenix 는 사용자가 팔로우하지 않은 콘텐츠(Out-of-Network)를 발굴하고, 최종적으로 어떤 게시물을 보여줄지 결정하는 두뇌 역할을 합니다. Phoenix의 후보 추출 및 순위 선정 과정은 다음과 같이 이뤄집니다:
-
후보 추출을 위한 Phoenix Retrieval(Two Tower Model): 이는 전체 게시물(Corpus) 중에서 사용자가 좋아할 만한 후보군을 1차적으로 걸러내는 단계입니다. 크게 사용자와 아이템을 기반으로 한 모델을 구성하고, 이를 기반으로 동작합니다.
-
User Tower: 사용자의 과거 상호작용 기록, 인구통계학적 정보 등을 입력받아 '사용자 임베딩(User Vector)'을 생성합니다.
-
Item Tower: 게시물의 텍스트, 이미지, 작성자 정보 등을 입력받아 '아이템 임베딩(Item Vector)'을 생성합니다.
-
ANN(Approximate Nearest Neighbor): 생성된 사용자 벡터와 가장 가까운 거리에 있는 아이템 벡터들을 고속으로 검색합니다. 이 과정에서 HNSW(Hierarchical Navigable Small World)와 같은 알고리즘이 활용되어 수억 개의 게시물 중 수백 개를 밀리초(ms) 단위로 찾아냅니다. 이 과정은 기존의 'SimClusters'나 'RealGraph'와 같은 복잡한 그래프 알고리즘을 대체합니다.
-
-
정밀한 순위를 선정하기 위한 Phoenix Ranking(Transformer): 이후 추출된 후보 게시물들의 최종 순위를 결정하기 위해 Grok 기반의 Transformer 모델이 사용됩니다. 이 모델의 핵심 구조는 다음과 같습니다:
-
입력 시퀀스 구조 (Input Sequence): 모델은
[사용자 히스토리(User History)] + [타겟 후보군(Target Candidates)]형태의 시퀀스를 입력받습니다. 여기서[사용자 히스토리]는 사용자가 최근에 긍정적으로 반응한 게시물들의 나열이며,[타겟 후보군]은 평가 대상이 되는 후보 게시물의 목록입니다. -
Logit Masking (핵심 기술): 일반적인 Transformer는 모든 입력 토큰이 서로를 참조(Self-Attention)합니다. 하지만 추천 랭킹에서는 독립성을 보장하기 위해 후보 게시물 A의 점수가 후보 게시물 B의 존재 여부에 영향을 받으면 안 됩니다. 즉, 후보 게시물 A의 점수가 후보 게시물 B의 존재 여부에 따라 추천 여부가 달라져서는 안됩니다. 이를 위해 후보 게시물들끼리 서로 참조(Attention)을 차단하는 Logit Masking을 적용합니다. 따라서 각 후보 게시물의 점수를 독립적으로 계산할 수 있어, 한 번의 추론(Inference)으로 여러 게시물의 점수를 병렬로 계산하여 연산 효율성을 높이고 캐싱(Cach)이 가능해집니다.
-
Multi-Task Prediction: 모델은 단순히 사용자가 클릭을 할 확률 뿐만 아니라, P(Like), P(Reply), P(Reply), P(Click) 등과 같이 다양한 사용자의 상호 작용 확률을 개별적으로 예측합니다. 각 확률들을 개별적으로 계산한 뒤, 가중치를 적용하여 최종 점수(Final Score)를 합산합니다.
-
전체 파이프라인 상세 흐름 (End-to-End Pipeline)
사용자가 앱을 켜고 새로고침이 발생하는 순간, 백엔드에서는 다음과 같은 과정이 일어납니다:
-
문맥 불러오기(Context Loading): 사용자의 ID, 현재 시간, 디바이스 정보, 언어 설정 등을 파악합니다.
-
후보 게시물 수집하기(Sourcing): Thunder와 Phoenix Retrieval에서 각각 팔로우 중인 계정의 최신 트윗 및 팔로우하지 않았지만 관심 있을 법한 트윗을 절반 가량씩 수집합니다.
-
가져온 후보 게시물 정제(Filtration): 앞에서 가져온 후보 게시물 중, 차단(Block)했거나 뮤트(Mute)한 계정의 트윗을 제거하거나, 유해 콘텐츠, 스팸 콘텐츠 등을 제거하는 몇 가지 필터를 거쳐 후보 게시물들을 걸러냅니다.
-
점수 계산(Scoring): 앞서 설명한 Phoenix Ranking 모델을 통해 각 후보 게시물에 대한 예측 확률을 계산하고 점수화합니다.
-
재정렬 및 혼합(Re-ranking & Mixing): 마지막으로 특정 작성자의 글이 연속으로 나오지 않게하거나(Author Diversity), 이미지와 비디오, 텍스트 트윗의 비율을 적절히 섞습니다(Content Balance). 또한, 광고와 일반 글의 비율을 조정하는 등(Ads Injection)의 최종 재정렬 작업을 통해 다양성 조정 과정을 거칩니다.
핵심 설계 원칙 및 기술적 특징 (Key Design Decisions)
X Algorithm 팀은 시스템의 효율성과 확장성을 위해, 알고리즘 설계 시 다음과 같은 5가지 주요 설계 원칙을 세우고 적용했습니다:
-
수동 피처 엔지니어링 제거 (No Hand-Engineered Features): 기존 시스템은 '이미지가 있으면 가점'과 같은 수동 규칙에 의존했으나, 새로운 시스템은 Grok 기반 트랜스포머가 사용자 참여 시퀀스(Sequence)로부터 직접 관련성을 학습합니다. 이를 통해 데이터 파이프라인과 서빙 인프라의 복잡도를 획기적으로 낮췄으며, 모델이 데이터의 패턴을 스스로 파악하게 됩니다.
-
랭킹 단계의 후보 격리 (Candidate Isolation in Ranking): 트랜스포머 추론(Inference) 시, 후보 게시물들이 서로를 참조(Attention)하지 못하도록 마스킹(Masking) 처리합니다. 오직 '사용자 컨텍스트'만 참조 가능합니다. 후보 게시물의 격리로 특정 게시물의 점수가 함께 배치(Batch)된 다른 게시물들의 존재 여부에 영향을 받지 않게 됩니다. 이를 통해 점수의 일관성을 보장하고, 계산된 점수를 캐싱(Caching) 하여 재사용할 수 있게 되었습니다.
-
해시 기반 임베딩 (Hash-Based Embeddings): 검색(Retrieval)과 순위 선정(Ranking) 단계 모두에서, 단일 임베딩 룩업 대신 다중 해시 함수(Multiple Hash Functions) 를 사용하여 임베딩을 조회합니다. 이는 메모리 사용량을 최적화하면서도 충돌을 줄이고 표현력을 유지하기 위한 기법입니다.
-
다중 행동 예측 (Multi-Action Prediction): 이전처럼 단순히 하나의 '관련성 점수(Relevance Score)'를 뭉뚱그려 예측하지 않습니다. 새로운 모델은 '좋아요', '리포스트', '답글', '클릭' 등 사용자가 여러가지 행동에 대한 확률을 개별적으로 예측합니다. 이를 통해 비즈니스 목표에 따라 가중치를 유연하게 조절하여 최종 순위를 결정할 수 있습니다.
-
조합 가능한 파이프라인 아키텍처 (Composable Pipeline Architecture): Rust로 작성된
candidate-pipeline크레이트(Crate)는 매우 유연한 프레임워크를 제공하며, 다음과 같은 이점들을 갖습니다:- 분리(Separation): 파이프라인의 실행 및 모니터링 로직과 실제 비즈니스 로직을 철저히 분리했습니다.
- 병렬성(Parallelism): 서로 의존성이 없는 단계(Stage)들은 자동으로 병렬 실행되며, 오류 발생 시 전체가 중단되지 않고 우아하게 처리(Graceful Error Handling)됩니다.
- 확장성(Extensibility): 새로운 데이터 소스(Source), 데이터 보강(Hydration), 필터(Filter), 스코어러(Scorer)를 레고 블록처럼 쉽게 추가할 수 있습니다.
라이선스
X Algorithm 프로젝트는 Apache License 2.0으로 배포되고 있습니다. 이는 누구나 자유롭게 코드를 사용, 수정, 배포할 수 있음을 의미하며, 상업적 이용도 가능하지만 원저작자 표기 및 라이선스 고지 의무를 준수해야 합니다.
X Algorithm 프로젝트 GitHub 저장소
이전 방식(2023년)의 For You 피드 추천 알고리즘 소개 블로그
https://blog.x.com/engineering/en_us/topics/open-source/2023/twitter-recommendation-algorithm
이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. ![]()
파이토치 한국 사용자 모임
이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일
로 보내드립니다! (기본은 Weekly지만 Daily로 변경도 가능합니다.)
아래
쪽에 좋아요
를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ ![]()
