블로그로 돌아가기
SNS 마케팅

X 알고리즘 코드를 직접 읽었다 — 가중치보다 필터 17개가 먼저다

X 알고리즘 저장소가 열렸다. 2023년에 한 번 공개하고 방치했던 그 코드가 아니라, 지금 For You 피드를 실제로 돌리는 코드다. 커밋은 8월 25일까지 들어와 있고, 8월 13일과 14일 두 번의 업데이트 노트가 README에 그대로 붙어 있다.

앞서 우리는 X 알고리즘의 가중치가 공개됐다에서 외신 보도를 정리했다. 이번에는 저장소를 직접 열어 읽었다. 그 결과 두 가지가 분명해졌다. 하나는 가중치 숫자를 배수로 읽은 해석이 X 스스로 코드에 주석을 달아 부정할 만큼 잘못됐다는 것이고, 다른 하나는 마케터가 실제로 손댈 수 있는 지점이 가중치가 아니라 그 앞뒤에 있다는 것이다.

저장소에 무엇이 들어 있나

xai-org/x-algorithm은 Apache 2.0 라이선스로 공개돼 있다. 크게 두 갈래다. 요청이 들어온 순간 피드를 조립하는 요청 경로, 그리고 게시물과 계정에 라벨을 붙여두는 라벨링 경로다.

요청 경로의 중심은 home-mixer다. Rust로 짜였고, 후보를 모아 거르고 점수를 매겨 자르는 파이프라인 전체가 여기 있다. 랭킹 모델 Phoenix는 JAX 학습 코드와 Rust 서빙 엔진이 함께 들어왔다. 이번 릴리스에서 X는 예제 모델이 아니라 프로덕션 구현 자체라고 못 박았다. 합성 데이터 생성기까지 포함돼 있어서, GPU 한 장으로 축소판 모델을 끝까지 학습시켜 볼 수도 있다.

라벨링 경로는 8월 13일 업데이트에서 통째로 들어왔다. 노출 여부를 결정하는 visibility-filtering, 그 판단의 재료인 라벨을 만드는 시스템들(grox, agatha, bdsm, user-cred-v2, scarecrow, botmaker, abuse-enforcement-service), 그리고 이미지·영상 분류 모델까지다.

8월 14일 노트는 성격이 다르다. 새 기능이 아니라 정정이다. 공개 직후 퍼진 해석이 틀렸다며, X는 코드 두 곳에 주석을 달았다. 사람과 LLM이 읽고 오해하지 않도록.

피드 한 번에 벌어지는 일

For You를 한 번 당기면 아래 순서가 돈다.

후보 수집

세 곳에서 동시에 긁어온다.

  • Thunder — 팔로우한 계정의 최근 게시물. 메모리에 상주한다. 기본 상한 1,200건.
  • Phoenix 리트리벌 — 팔로우하지 않은 계정에서 찾아오는 임베딩 검색. 기본 상한 1,000건.
  • SimClusters — 누가 무엇에 반응하는지로 계정과 게시물을 군집화해 후보를 뽑는다.

여기에 별도 소스 800건까지 더해진다. 대략 3,000건 안팎이 출발점이다.

사전 필터 17개

점수를 매기기 전에 17개 필터가 순서대로 돈다. 이 단계에서 걸리면 아무리 좋은 콘텐츠여도 점수 계산 자체가 안 된다.

필터걸러내는 것
DropDuplicatesFilter여러 소스에서 중복으로 올라온 같은 글
CoreDataHydrationFilter본문·메타데이터 로딩에 실패한 글
AgeFilter48시간이 지난 글
SelfTweetFilter본인이 쓴 글
OONRetweetReplyFilter비팔로우 계정의 리포스트와 답글
OONNsfwSimclustersFilter성인물 플래그 계정의 SimClusters 후보
RetweetDeduplicationFilter같은 글의 반복 리포스트
IneligibleSubscriptionFilter접근 권한 없는 구독자 전용 글
PreviouslySeenPostsFilter이미 노출된 글
PreviouslySeenPostsBackupFilter두 번째 노출 기록에 남은 글
PreviouslyServedPostsFilter같은 세션에서 이미 내보낸 글
MutedKeywordFilter뮤트 키워드에 걸린 글
AuthorSocialgraphFilter차단·뮤트한 계정의 글
VideoFilter영상 제외 요청 시 영상 게시물
TopicIdsFilter요청 토픽 밖의 글, 제외 토픽의 글
NewUserMinEngagementFilter신규 계정에게 보여줄 참여도 미달 비팔로우 글
InventoryHoldoutFilter실험용으로 결정적 규칙에 따라 빼는 일정 비율

세 번째 줄이 중요하다. 48시간이다. 그 이후에는 점수가 얼마든 후보에 들어오지 못한다.

점수 계산

살아남은 후보에 Phoenix가 행동별 확률을 매긴다. 좋아요, 답글, 리포스트, 인용, 공유, DM 공유, 링크 복사 공유, 각종 클릭, 체류, 영상 시청, 작성자 팔로우, 그리고 관심없음·뮤트·차단·신고 같은 부정 행동까지다.

RankingScorer가 이걸 하나로 합친다.

최종 점수 = Σ (가중치 × P(행동))

선택과 노출 판정

정렬해서 상위 50건을 남긴다. 그다음 visibility-filtering에 게시물마다 물어본다. 여기서 드롭 판정이 난 글이 빠진다. 최종 응답 크기는 35건이다. 3,000건에서 출발해 35건이 남는다.

블렌딩

랭킹된 게시물에 모델이 매기지 않는 것들이 섞인다. 광고, 팔로우 추천, 프롬프트다. 팔로우 추천은 6번째 자리처럼 고정 위치에 들어가고, 기본 광고 블렌더는 광고 인접성을 맞추려고 게시물 순서를 한 번 더 손댄다.

가중치 실제 기본값

home-mixer/params/param.rs에 적힌 값 그대로다.

행동가중치
링크 복사 공유20.0
답글5.0
인용5.0
DM 공유5.0
작성자 팔로우4.0
공유2.0
리포스트1.0
게시물 클릭0.4
링크 열기0.2
좋아요0.5
영상 열기0.07
사진 확대0.05
체류0.05
체류 시간(연속값)0.004
프로필 클릭0.0
관심없음−43.2
작성자 차단−31.2
작성자 뮤트−58.8
신고−234.0
체류 안 함−0.02

여기에 맞팔 답글 부스트 +15.0이 별도로 붙는다. 뒤에서 다시 다룬다.

좋아요 40배가 틀린 이유

링크 복사 공유 20.0을 좋아요 0.5로 나누면 40이 나온다. 신고 −234를 0.5로 나누면 468이 나온다. 그래서 링크 복사 한 번이 좋아요 40개, 신고 하나가 좋아요 468개를 상쇄한다는 말이 돌았다.

X가 8월 14일 코드에 붙인 주석은 이 계산을 정면으로 부정한다.

가중치는 예측 확률에 곱해진다. 실제 카운트에 곱해지는 게 아니다. 점수 식이 Σ(가중치 × P(행동))이지 Σ(가중치 × 행동 횟수)가 아니라는 뜻이다. 곱해지는 건 이 사람이 이 글을 신고할 확률이지, 이 글이 받은 신고 수가 아니다.

그러면 왜 신고 가중치만 −234로 큰가. 신고가 일어날 기본 확률이 좋아요보다 1,000배 이상 낮기 때문이다. 확률이 극단적으로 작으니 가중치를 크게 잡아야 최종 점수에 영향이라도 준다. 큰 숫자는 중요도가 아니라 스케일 보정이다.

여기서 하나 더 따라 나온다. 조직적인 대량 신고·차단으로 특정 계정 도달을 떨어뜨리는 시나리오 말이다. X는 코드 주석에서 이걸 세 가지 이유로 부정한다.

첫째, 추천은 개인화돼 있다. 악의적 계정들의 신고는 주로 그들과 비슷한 사용자의 추천에 반영된다. 모든 사람에게 같은 크기로 작동하지 않는다.

둘째, 랭킹에 반영되려면 그 행동이 홈 타임라인에 노출된 글 위에서 일어나야 한다. 단톡방에 링크를 뿌려 직접 들어가서 신고하는 방식은 랭킹에 영향이 없다.

셋째, 특정 글을 자기 타임라인에 재현 가능하게 띄우는 방법이 사용자에게는 없다.

점수 뒤에 붙는 보정 세 가지

가중합이 끝이 아니다. 세 가지가 순서대로 곱해진다.

작성자 다양성 감쇠

같은 작성자의 글이 여러 건 후보에 있으면, 두 번째부터 점수가 깎인다. 공식은 이렇다.

배수 = (1 − 하한) × 감쇠^순번 + 하한
감쇠 = 0.5, 하한 = 0.25

계산하면 첫 글 1.0, 두 번째 0.625, 세 번째 0.4375, 네 번째 0.34375로 떨어지고 0.25에서 멈춘다. 한 번의 피드 조립 안에서 같은 계정 글을 네 개 밀어 넣어도 네 번째는 첫 번째의 3분의 1 남짓으로 평가된다는 뜻이다.

아웃오브네트워크 할인

팔로우하지 않은 계정의 글은 점수에 0.75가 곱해진다. 토픽 기반 요청이면 0.5다. 팔로우한 계정이라도 그 계정의 답글과 리포스트에는 같은 할인이 붙는다.

여기 눈에 띄는 상수가 하나 있다. 계정 생성 후 일정 기간이 안 지났고 팔로우가 5개 이상인 신규 사용자에게는 이 계수가 0.00001로 내려간다. 사실상 0이다. 갓 가입한 사용자의 피드에는 팔로우한 계정 글만 들어간다고 보면 된다.

신규 작성자 부스트

노출이 적은 작성자의 글은 위로 끌어올린다. 조건이 코드에 박혀 있다. 노출 1,000회 미만, 팔로워 1,000명 이하, 게시 후 24시간 이내. 목표 슬롯은 15~16번째다. 다만 부스트로 갈 수 있는 위치는 전체의 85%까지로 제한된다.

그다음 VMRanker가 별도 서비스를 불러 한 번 더 순서를 바꾼다. 임베딩 기반 DPP로, 점수를 조금 포기하는 대신 옆자리 글끼리 덜 비슷하게 만든다.

7월에 실제로 바뀐 것 — 맞팔 부스트

저장소에는 알고리즘 변경 하나를 diff로 따라가는 문서가 들어 있다. 7월에 화제가 됐던 상호 팔로우 부스트다.

7월 10일, X는 A/B 테스트를 시작했다. 소수 사용자에게 부스트 값 5, 10, 15, 20을 무작위 배정했다. 나머지는 0이었다. 7월 13일, 결과가 좋아 값 20을 다수 사용자에게 적용했다. 7월 24일, 월드컵 기간에 팔로우하지 않은 계정 글이 안 보인다는 피드백이 나오자 15로 낮췄다. 지금 코드에 적힌 기본값이 15다.

작동 방식은 단순하다. 상호 팔로우 관계인 작성자의 글이면 답글 가중치에 15를 더한다. 5.0이 20.0이 된다. 네 배다.

조건이 있다. 코드의 bidirectional_boost_eligible은 세 가지를 모두 요구한다. 답글이 아닐 것, 리포스트가 아닐 것, 상호 팔로우 작성자일 것. 즉 맞팔 상대의 원본 게시물에만 붙는다. 같은 사람이 쓴 답글이나 리포스트에는 붙지 않는다.

랭킹과 노출은 다른 문제다

이 저장소가 분명히 하는 설계 원칙이 있다. 랭킹은 순서를 정하고, 가시성 필터는 보여줄지 말지를 정한다. 서로 다른 서비스, 다른 입력, 다른 규칙이다.

visibility-filtering은 게시물과 사용자 조합마다 셋 중 하나를 답한다. 허용, 인터스티셜(가림막을 탭해서 보는 상태), 드롭이다. 규칙은 순서대로 평가되고, 처음으로 드롭이 나오면 거기서 끝난다.

팔로워에겐 보이고 비팔로워에겐 안 보이는 구간

핵심은 여기다. 규칙 중 일부는 팔로우하지 않은 계정의 추천일 때만 적용되고, 그 규칙들은 드롭만 할 수 있다. 재현율을 높게 잡아 걸러낸 스팸 같은 것들이다.

같은 글이 팔로워에게는 정상 노출되고 비팔로워에게는 추천되지 않는다. 흔히 말하는 섀도밴의 실체에 가장 가까운 구간이 이것이고, 규칙 이름도 그대로 드러나 있다. RecommendationsOnlyRule, AbusiveHighRecallRule, DoNotAmplifyNonFollowerRule, MaliciousUrlOonDropRule 같은 것들이다.

계정 단위 지표에서는 이게 이상하게 보인다. 팔로워 반응은 평소와 같은데 노출만 주저앉는다. 도달이 줄었는데 참여율은 유지되는 패턴이면 이 구간을 의심할 근거가 된다.

라벨은 어디서 오나

가시성 규칙이 읽는 라벨은 요청 경로 밖에서 계속 만들어진다.

  • grox — 게시 시점에 도는 분류기. 스팸, 성인물, 폭력 미디어 등.
  • media-model-proxy / clip — 이미지·영상 모델과 그 입력이 되는 임베딩.
  • agatha — 다른 사람들이 그 계정에 어떻게 반응했는지를 배치로 집계한다. 좋아요 대비 차단·신고·스팸신고 비율이 핵심 축이다.
  • bdsm — 계정이 시간에 따라 취한 행동 시퀀스를 읽어 비정상·조작 패턴을 잡는다.
  • user-cred-v2 — 팔로우 그래프와 참여 엣지에 PageRank를 돌려 계정 점수를 만든다.
  • scarecrow + botmaker — 이벤트가 발생하는 즉시 규칙을 적용해 라벨을 붙인다.
  • abuse-enforcement-service — 모델 점수를 보고 라벨·챌린지·정지를 실행한다.

agatha의 축이 시사적이다. 차단과 신고의 절대 수가 아니라 좋아요 대비 비율을 본다. 반응이 큰 계정이 신고도 같이 받는 건 정상 범위로 처리된다는 뜻이다.

공개되지 않은 것

X는 일부를 뺐다고 명시했다. Grox의 LLM 프롬프트 파일, 그리고 일부 botmaker 규칙이다. 이유는 어뷰징이다. 규칙 전문이 공개되면 우회 설계가 가능해진다.

대신 Under the Hood라는 도구를 시험 운영 중이다. 자기 계정과 게시물에 붙은 노출 제한 라벨을 집계 통계로 보여준다. X가 도달 제한 코드를 공개했다에서 다룬 그 도구다. 코드로 규칙을 읽고 도구로 내 계정에 붙은 라벨을 확인하는 조합이, X가 제시한 투명성 모델이다.

한 가지 더 짚을 만한 것이 있다. 8월 14일 노트에 브라질 2026년 선거 필터가 들어왔다. 브라질 선거법에 따라 선거법원에 신고된 계정의 글을 For You에서 제외하되, 사용자가 직접 팔로우한 경우는 예외로 두는 규칙이다. 계정 목록은 8월 25일에 갱신됐다. 국가별 법률 대응이 코드에 어떻게 들어오는지 그대로 보인다.

마케터가 실제로 쓸 수 있는 것

48시간이 전부다. AgeFilter가 그 이후를 잘라낸다. 롱테일로 계속 도달되는 콘텐츠라는 개념이 For You에는 없다. 발행 시점과 초기 몇 시간이 사실상 수명 전체다.

하루 게시 수를 늘려도 비례하지 않는다. 작성자 다양성 감쇠 때문에 같은 피드 조립 안에서 네 번째 글은 첫 번째의 34% 수준으로 평가된다. 다섯 개를 몰아 올리는 것보다 두세 개를 시간대를 벌려 올리는 쪽이 산술적으로 맞다.

맞팔 관계가 가장 큰 단일 레버다. 상호 팔로우 작성자의 원본 게시물은 답글 가중치가 4배가 된다. 팔로워 수를 늘리는 것과 상호 팔로우를 만드는 것은 알고리즘상 다른 일이다. 업계 계정, 파트너, 고객사 담당자와의 맞팔은 숫자상으로 의미가 있다.

리포스트와 답글로는 부스트를 못 받는다. 부스트 조건이 원본 게시물로 한정돼 있고, 비팔로우 계정의 답글·리포스트는 아예 사전 필터에서 잘린다. 채널 전략이 리포스트 중심이면 구조적으로 불리하다.

좋아요를 KPI에서 내리되 배수 계산은 하지 말자. 좋아요 0.5는 실제로 낮다. 하지만 링크 복사 40개가 좋아요 1,600개라는 식의 환산은 성립하지 않는다. 방향만 읽으면 된다. 밖으로 퍼가고 싶게 만드는 콘텐츠, 답글을 부르는 콘텐츠가 더 크게 평가된다.

신규 계정 대상 캠페인은 팔로우가 선행돼야 한다. 갓 가입한 사용자의 OON 계수는 0.00001이다. 그들의 피드에 들어가려면 추천이 아니라 팔로우가 필요하다.

도달이 떨어졌는데 참여율은 그대로면 라벨을 의심한다. 랭킹 문제가 아니라 가시성 필터 문제일 수 있다. Under the Hood에서 계정에 붙은 라벨을 먼저 확인하는 게 콘텐츠를 갈아엎는 것보다 빠르다.

마지막으로, X는 트래픽 10% 이상 규모의 실험은 저장소에서 보이게 하겠다고 했고, 크론으로 프로덕션 기본값을 코드에 반영하고 있다고 밝혔다. 파라미터 값이 바뀌면 diff로 남는다. 7월의 맞팔 부스트가 20에서 15로 내려간 것도 그렇게 확인된다. X 관련 도구를 다루는 다른 축으로는 X가 광고 MCP 서버를 열었다를 함께 보면 된다. 발표를 기다리는 대신 저장소를 구독해 두면, 다음 변경은 기사보다 먼저 읽을 수 있다.

자주 묻는 질문

신고 가중치 −234는 좋아요 0.5의 468배인가요?

아니다. 가중치는 행동 횟수가 아니라 예측 확률에 곱해진다. 신고가 일어날 기본 확률이 좋아요보다 1,000배 이상 낮기 때문에 가중치를 크게 잡아야 점수에 영향을 준다. X가 2026년 8월 14일 코드에 주석을 달아 이 배수 해석을 직접 부정했다.

48시간이 지난 글은 For You에 아예 안 나오나요?

나오지 않는다. AgeFilter가 점수를 매기기 전 단계에서 48시간 초과 게시물을 후보에서 제거한다. 점수가 아무리 높아도 계산 대상에 들어가지 않는다. 다만 이는 For You 피드에 한정된 규칙이고, 검색이나 프로필 방문에는 적용되지 않는다.

맞팔 부스트는 어떤 글에 적용되나요?

상호 팔로우 관계인 작성자의 원본 게시물에만 적용된다. 코드의 조건은 답글이 아닐 것, 리포스트가 아닐 것, 상호 팔로우 작성자일 것 세 가지를 모두 요구한다. 조건을 만족하면 답글 가중치 5.0에 15.0이 더해져 20.0이 된다.

도달만 줄고 참여율은 그대로면 무엇을 의심해야 하나요?

랭킹이 아니라 가시성 필터를 의심할 근거가 된다. 일부 규칙은 팔로우하지 않은 계정의 추천일 때만 적용되고 드롭만 할 수 있어서, 같은 글이 팔로워에게는 정상 노출되고 비팔로워에게는 추천되지 않는다. Under the Hood 도구에서 계정에 붙은 라벨을 먼저 확인하는 편이 빠르다.

원문 출처: xAI / GitHub

우리 사이트는 지금 어떤 상태일까요?

기사에서 본 내용을 우리 사이트에 대입해 보고 싶다면, 무료 진단으로 현재 상태부터 확인해 보세요.

영업일 기준 24시간 안에 담당자가 직접 답변드립니다.

함께 읽어보세요