◂ feed-research2026-08-29 빌드

추천 파이프라인 안의 LLM

최종 갱신: 2026-08-13

LLM/VLM이 추천 시스템에 들어가는 자리는 여섯 군데다. 섞어서 얘기하면 헷갈리니 분리해서 본다.

  1. 콘텐츠 주석 (nearline) — 아이템 하나를 LLM에 태워 품질/토픽/안전 라벨을 뽑아 KV 스토어에 적어둔다. 서빙 때는 조회만 한다.
  2. 안전성 판정 — 위 주석의 특수 케이스지만 실패 시 동작(fail-open/fail-closed)이 달라서 따로 본다.
  3. 랭킹 모델 자체 — LLM 아키텍처를 랭커로 쓴다. → sequence-transformer-ranking.md
  4. 유저 관심사 요약 — 유저 이력을 LLM으로 요약해 프로파일을 만든다.
  5. 오프라인 평가 (LLM-as-judge) — 랭킹 결과의 품질을 LLM이 채점한다. 서빙 경로에 없다.
  6. 유저 자연어 지시 파싱 — 유저가 말로 랭킹 선호를 입력하면 그걸 해석해 랭커에 반영한다.
자리 X Meta
1 콘텐츠 주석 확실 (Grox) ads 한정, 둘 다 확실 (HIR = 엔티티, LLaTTE = fine-tuned LLaMA content embedding)
2 안전성 판정 확실 (PTOS, fail-closed) 진술 없음
3 LLM을 랭커로 트랜스포머 랭커 있음(Phoenix) 광고는 여전히 비유(LLM-scale). 단 유기 피드에는 2026-08 ConnectionMind 진술이 나왔다 — Llama 3.1-8B가 그래프 경로 추론기로 헤비 유저 5–10%의 온라인 hot path에 서빙, 90–95%는 그 LLM이 offline discover한 meta-path로 학습된 Student GNN. 지면은 미공개("short-form video platform"). 아래 케이스 절
4 유저 관심사 요약 확인 불가 진술 없음
5 LLM-as-judge 진술 없음 확실 (Groups Search, Llama 3)
6 자연어 지시 없음 제품은 있음, 모델은 미공개

두 회사가 정확히 반대 칸을 채웠다. X는 1·2, Meta는 5·6이다. [추정] — 위 표의 각 칸이 아래에서 1차 출처로 뒷받침되지만, "반대"라는 대조 자체는 공개된 것만 놓고 본 해석이다. 표의 "진술 없음" 칸도 전부 [추정]이다 — 검사한 코퍼스는 아래 출처 목록(2026-08-09 열람)이고, 미공개 시스템에 대해서는 아무 말도 하지 않는다.

그리고 자리 3의 공백은 2026-07에 처음 깨졌고(Netflix GenRec, 아래 케이스 절), 2026-08 Meta ConnectionMind가 두 번째 진술을 냈다.테제 변경(2026-08-13) — 이전에는 *"유기 피드 랭킹 경로에 LLM이 들어간다는 1차 진술은 X·Meta 어느 쪽에도 없다"*고 썼는데, ConnectionMind가 그 진술을 내면서 반쪽이 뒤집혔다. 다만 두 회사의 형태가 근본적으로 다르다 — Netflix GenRec은 랭커 그 자체(LLM 백본 + catalog softmax 헤드), Meta ConnectionMind는 그래프 경로 추론기(LLM이 JSON으로 path 확장을 emit하고 F1 기반 GRPO로 정렬). 그리고 ConnectionMind는 서빙 층에서 하이브리드를 택했다 — 대다수 트래픽은 LLM이 오프라인에서 발굴한 meta-path로 학습된 GNN이 서빙하고, LLM은 헤비 유저 5–10%의 온라인 hot path만 커버한다. 두 사례에서 "LLM이 랭킹한다"의 실체가 다르다는 점이 이 자리의 최대 관전 포인트다.

케이스: X의 Grox (2026)

grox/는 Kafka 기반 nearline 콘텐츠 주석 파이프라인이다. 요청 경로에 없다. [확인] xai-org/x-algorithm, 2026 — grox/main.py, grox/data_loaders/kafka_loader.py

프로세스 3개(grox-engine / grox-dispatcher / gRPC 서버)가 multiprocessing.Manager 큐로 통신한다. [확인]grox/main.py, grox/schedules/context.py:19-28

무엇을 뽑는가 — plan 9개

plan 산출물
plan_initial_banger quality score, description, tags, Grok 토픽, slop score, minor-presence score, image-editability
plan_post_safety "deluxe" 안전성 bool 메타데이터
plan_safety_ptos PTOS 정책 위반 판정 (2단계: 카테고리 탐지 → 정책별 판정)
plan_spam_comment 답글 스팸
plan_reply_ranking 답글 0–3점
plan_post_embedding_* (4개) 멀티모달 포스트 임베딩 v3/v4/v5_1

[확인]grox/plans/plan_master.py 및 각 plan 파일

slop score — LLM이 "저품질 콘텐츠"를 정수로 매긴다

slop_score: int | None이 분류기 출력 스키마의 1급 필드이고, slopScore로 영속화되며, 값별 카운터까지 붙어 있다(task.publish_unified_post_annotations.slop_score_3.count). 실험이 아니라 계측된 프로덕션 기능이다. [확인]grox/classifiers/content/banger_initial_screen.py:33-41, grox/tasks/task_pub.py:317, :175-178

같은 VLM 호출 하나가 두 종류의 결과를 낸다 — 품질 스크리닝(BANGER_INITIAL_SCREEN)과 랭킹 시그널(GROK_RANKER). [확인]banger_initial_screen.py:49-52,157

안전 라벨은 fail-closed, 답글 품질은 fail-open

같은 서비스 안에서 자세가 정반대다. 설계 의도가 뚜렷하다.

특정 snowflake ID(2_054_275_414_225_846_272) 이후의 포스트는 PTOS_REVIEWED 라벨이 없으면 무조건 MediumRisk다 — 즉 어느 시점부터 LLM 안전 심사를 광고 인접성의 전제 조건으로 못박았다. [확인]home-mixer/models/brand_safety.rs:37,53

hallucination 가드

LLM이 뱉은 토픽 ID를 fetch해온 allow-list와 대조해서 모르는 ID는 버리고 카운터를 올린다. [확인]grox/tasks/task_pub.py:232-265

JSON 파싱은 3단 fallback: pydantic model_validate_jsonjson_repair → 정규식 → 예외. [확인]grox/classifiers/content/reply_ranking.py

temperature = 0.000001. 0이 아니라 0에 아주 가까운 값을 쓴다. [추정] — zero-temperature 코드 경로를 피하려는 것으로 보이나 코드에 이유는 없다. [확인](값 자체) banger_initial_screen.py:45-47

reasoning API 호출이 실패하면 아무 예외에서나 조용히 VLM으로 폴백한다. 모델 등급이 요청마다 달라질 수 있다는 뜻이다. [확인]grox/classifiers/content/safety_ptos.py:269-280

안전성 2단계 구조

카테고리 7종을 지원하고, 그중 AdultContent/ViolentMedia 2종만 "deluxe 4.2" 경로를 탄다. deluxe 모드에서는 AdultContent 재검사를 무조건 한 번 더 주입했다가 위반 없으면 제거한다 — 가장 리스크 큰 카테고리에 대한 고의적 high-recall 2차 패스. [확인]safety_ptos.py:217-230, grox/tasks/task_safety_ptos_policy.py:39-61

이 케이스에서 일반화할 수 있는 것

아직 확인 못한 것 — 유저 관심사 요약

inferred_grok_topics(유저별 추론 관심 토픽, 32비트 multi-hot)를 home-mixer가 Strato에서 읽기만 한다. 그걸 만드는 서비스는 공개 레포에 없다. [확인]home-mixer/query_hydrators/inferred_grok_topics_query_hydrator.rs:22-27

Grox 안에는 유저 요약 태스크가 없다. TaskContext에 유저 필드가 아예 없고, TaskWithUser 추상 클래스는 있는데 구현체가 없다. [확인]grox/schedules/types.py:56-69, grox/tasks/task.py

X가 LLM으로 유저 프로파일을 만드는지는 공개 소스로 판정 불가.


Meta — 두 가지가 섞여 있다: LLM 표현(실재)과 LLM 비유(수사)

Meta 추천 문헌에서 LLM이라는 단어는 서로 다른 두 가지를 가리킨다. 섞으면 결론이 정반대가 된다.

무엇 실체 어디
A. LLM = 표현(representation) fine-tuned LLaMA / 커스텀 LLM 추론 엔진이 콘텐츠·엔티티를 임베딩으로 인코딩하고, 그 벡터가 일반적인(non-LLM) 랭커의 입력 피처로 들어간다 실재한다 LLaTTE 논문("fine-tuned LLaMA models"), HIR("customized LLM inference engine") — 둘 다 ads
B. LLM = 아키텍처 비유 "LLM-inspired", "LLM-style scaling laws", "LLM-Scale" — 학습 규모·스케일링 곡선·파라미터 수를 LLM에 빗댄 말. 지칭 대상 모델은 언어 모델이 아니다 수사다 GEM·LLaTTE·MARM 블로그

[확인] A는 아래 "자리 1"·"자리 3"의 인용문, B는 바로 아래 표의 인용문이 각각 1차 출처다.

따라서 "Meta 광고 스택은 LLM 파생 피처를 실제로 소비한다"와 "Meta의 랭킹 모델은 LLM이 아니다"는 동시에 참이다. [추정] — 이 노트가 이전에 B만 보고 A까지 비유로 묶었던 것이 오류였다. 정정해 둔다.

함정 — "LLM-scale" ≠ "랭커가 LLM이다" (B의 문제)

[확인] 문서 본문 전수 확인, 2026-08-09:

표현 출처 실제 의미
"an LLM-inspired paradigm", "trained at the scale of large language models" GEM 블로그, 2025-11-10 학습 규모와 레시피의 비유. 광고 추천 모델이지 언어 모델이 아니다
"predictable, LLM-style scaling laws" LLaTTE 블로그, 2026-08-05 스케일링 곡선 모양의 비유. 같은 글이 *"Unlike LLMs, which process dense and continuous text, ads recommendation systems must integrate sparse ID features"*라며 스스로 선을 긋는다
"Serve LLM-Scale Models for Ads" MARM 블로그, 2026-03-31 파라미터 수(O(1T))의 비유

"Llama"라는 단어는 GEM·LLaTTE·MARM 블로그 본문 어디에도 0회 등장한다. [관찰] 2026-08-09 — 검사한 코퍼스는 위 표의 블로그 3편 본문이고, 각 본문을 받아 Llama/LLaMA 문자열을 센 결과가 0이다.

단, 블로그 한정이다. LLaTTE 논문(arXiv 2601.20083)에는 *"dense content embeddings produced by fine-tuned LLaMA models"*가 명시돼 있다 [확인](아래 자리 3). 블로그가 B(비유)만 말하고 A(실재하는 LLM 피처)를 논문에만 남긴 사례다.

[추정] 언론과 요약글이 이 세 표현을 "Meta가 피드 랭킹에 LLM을 쓴다"로 옮기는 걸 여러 번 봤다. 두 군데가 틀렸다 — LLM이 들어가는 건 랭커가 아니라 입력 피처이고, 지면은 피드가 아니라 광고다.

자리 1 — 콘텐츠 주석: 광고 엔티티에만 있다

[확인] Exploring Hierarchical Interest Representation For Meta Ads Deep Funnel Optimization, 2026-07-15

"We retrieve the multimodal information in summary text, images, and video and process it through a customized LLM inference engine that produces encoded feature inputs for our representation learning." "multimodal advertiser and product content processed through LLMs enriches sparse interactions, enabling generalization to rare and unseen entities." "These features are pulled from structured page metadata and advertiser catalog attributes and processed through vision or language models."

X의 Grox와 구조는 같고 대상이 다르다. Grox는 유저가 올린 포스트를 주석하고, HIR은 광고주·상품 엔티티를 주석한다. 그리고 목적이 다르다 — Grox는 품질/안전 판정(필터·광고 인접성 게이팅)이고 HIR은 콜드스타트 일반화다("rare and unseen entities").

[추정] 이게 두 회사의 LLM 용도를 가르는 핵심이다. X는 LLM을 심판으로 쓰고 Meta(광고)는 피처 인코더로 쓴다. 같은 "content understanding"이라는 말이 정반대 역할을 가리킨다.

[추정] 유기 피드(Facebook Feed / Instagram Feed / Reels / Threads) 콘텐츠를 LLM으로 주석한다는 Meta의 1차 진술은 찾지 못했다. 검사한 코퍼스는 아래 출처 목록의 Meta 블로그·논문과 Transparency Center 시스템 카드 15종(2026-08-09 열람)이다. HIR은 명시적으로 ads deep funnel 문헌이다.

자리 3 — LLaTTE의 "semantic feature" = A의 결정적 증거

[확인] LLaTTE (arXiv 2601.20083), 2026-01-27:

"semantic features bend the scaling curve: they are a prerequisite for scaling, enabling the model to effectively utilize the capacity of deeper and longer architectures."

블로그도 스케일링 축 중 하나로 *"content/semantic enrichment"*를 든다. [확인]

이 semantic feature의 출처는 LLM이라고 같은 논문이 직접 쓴다 [확인] (2026-08-09 HTML 전문 확인):

"we introduce dense content embeddings produced by fine-tuned LLaMA models as well as Content Understanding models processing heterogeneous multimodal signals (e.g., text and images)" "when LLaMA content embeddings are enabled..."

즉 "semantic feature = LLM 출력"은 추정이 아니라 확인이다. 블로그는 이 사실을 말하지 않고 논문만 말한다. 그리고 이게 A와 B를 가르는 지점이다 — **LLaTTE 모델 자체는 LLM이 아니지만(B: "Unlike LLMs…"), 그 입력에는 LLaMA가 만든 벡터가 들어간다(A).** 두 문장이 같은 글에 있다.

이게 sequence-transformer-ranking.md의 대립과 직결된다 — HSTU는 *"raw categorical engagement feature"*만으로 간다고 하고, LLaTTE는 semantic feature가 스케일링의 전제조건이라고 한다. 같은 회사 두 계보가 반대로 말한다.

자리 5 — Meta가 블로그에서 Llama를 이름으로 부르는 유일한 곳

[확인] Modernizing the Facebook Groups Search, 2026-04-21

*"We utilize Llama 3 with multimodal capabilities as an automated judge to grade search results against queries."*

용도가 중요하다 — build verification test(BVT) 안의 오프라인 평가다. 서빙 경로가 아니다. 프롬프트를 "somewhat relevant" 범주를 인식하도록 설계했다는 디테일까지 공개돼 있다.

그리고 같은 글이 LLM을 랭킹에 넣는 것을 미래형으로 쓴다:

"LLMs in Ranking: We plan to apply LLMs directly within the ranking stage." "Adaptive Retrieval: We are exploring LLM-driven adaptive retrieval strategies..."

즉 2026-08 시점 Meta의 공개 문헌에서 "LLM을 랭킹 단계에 직접 넣는다"는 계획이지 배포가 아니다. [추정] — 위 인용문의 미래형은 [확인]이지만, "공개 문헌 전체에 배포 진술이 없다"는 부분은 같은 코퍼스(블로그·논문·카드 15종) 한정이다. 그것도 피드가 아니라 Groups 검색 얘기다. ⚠ 여기서 "직접"이 중요하다 — LLM 출력을 피처로 넣는 건 ads 쪽에서 이미 배포돼 있다(위 A).

자리 6 — 제품은 있는데 모델을 안 밝힌다

Meta에는 X에 없는 게 하나 있다. 유저가 자연어로 랭킹에 지시하는 표면.

둘 다 무슨 모델이 자연어를 파싱하는지 밝히지 않는다. Instagram은 *"AI"*라고만 쓴다. [관찰] 2026-08-09 (검사한 코퍼스: 위 뉴스룸 글 2건 본문)

[추정] 자유 텍스트를 받아 토픽 선호로 바꾸는 구조라 LLM이거나 최소한 텍스트 분류기가 있어야 한다. 하지만 경량 토픽 분류기로도 구현 가능하다 — "LLM일 것"이라고 단정할 근거가 없다.

[추정] 이건 자리 4(유저 관심사 요약)의 제품화된 형태이기도 하다. Instagram이 "AI가 요약한 당신의 관심 토픽"을 유저에게 보여준다는 건 그 프로파일이 내부에 존재한다는 뜻이다. X의 inferred_grok_topics(읽기만 하고 생산자가 공개 안 됨)와 같은 물건의 반대편 — X는 파이프라인만 보이고 제품이 안 보이며, Meta는 제품만 보이고 파이프라인이 안 보인다.

케이스: Meta ConnectionMind — 자리 3(LLM을 랭커로)의 Meta 첫 프로덕션 A/B 진술 (2026-08)

[확인] ConnectionMind: Leveraging Social Networks and Large Language Models for Personalized Recommendation at Meta (arXiv 2608.10187), 2026-08-10 — 저자 6명, 1저자 Haoyu Han은 Michigan State University 인턴, 나머지 5명은 Meta Platforms(Menlo Park). 내부 팀명(Core Ranking / GenAI 등) 소속 각주 없음.

핵심 세 가지:

  1. 하이브리드 서빙 구조 — LLM이 온라인 hot path에 있는 것은 상위 5–10% 헤비 유저에 한정, 90–95%는 그 LLM이 offline에서 discover한 meta-path로 학습된 Student GNN이 서빙. §6.1: "For this cohort, requests are routed to the full ConnectionMind LLM" / "we employ an offline distillation pipeline. The LLM processes historical contexts to discover effective meta-paths. These paths are extracted to train a lightweight Graph Neural Network (Student GNN)" — Netflix GenRec의 "batch-compute 지면 100% LLM"과 다른 절충. hot path에 LLM이 실제로 들어가는 최초 유기 피드 진술이자 대다수는 여전히 GNN이 서빙한다는 이중 진술.

  2. LLM이 그래프 경로를 JSON으로 emit — §4.1: 상태 s_d는 "current paths, candidate next-hop edges, and compact textual node profiles" 프롬프트, LLM은 *"structured action with two components: path expansions and surfaced item–path pairs"*를 낸다. beam search·constrained decoding 명시 없음, format reward로 사후 검증. 학습: SFT(BFS 최단경로 teacher-forcing) → GRPO(format −1/+1 + F1 기반 recommendation reward + step-wise shaping, 가중치 α_rec=0.5·α_step=0.3·α_fmt=0.2). Netflix GenRec의 "pooled hidden state → catalog softmax" 채점기와 동작이 완전히 다르다 — ConnectionMind는 진짜로 텍스트를 생성한다.

  3. 모델 크기·A/B 결과 — 배포 백본 Llama 3.1-8B-Instruct [확인] §6.1. A/B: 수천만 유저·다주 기간, watch time +0.43% ± 0.14%, exposure +0.33% ± 0.08%, video sessions +0.22% ± 0.13%. 오프라인 벤치는 Delicious·Foursquare 공개 셋(Meta 데이터 아님, LightGCN·SASRec·HSTU 베이스라인 부재).

⚠ 이 진술을 다룰 때 주의할 것 넷:

그럼에도 이 자리의 무게중심을 흔든다 — 2026-08까지 *"Meta는 LLM을 랭킹 자체에는 안 쓴다"*가 이 노트의 테제였다. 헤비 유저 코호트 한정이라도 온라인 hot path에 8B LLM이 들어가는 것은 그 테제의 절반을 뒤집는다. 다만 형태는 Netflix와 다르다 — Netflix는 채점 함수 자체를 LLM 백본으로 바꿨고, Meta는 그래프 위 경로 탐색기로 LLM을 넣었다. 자리 3의 실체가 회사마다 다른 물건이라는 점이 새로 드러난 사실이다.

케이스: Netflix — 자리 3(LLM을 랭커로)의 첫 배포급 1차 진술

[확인] GenRec: Towards LLM-Native Recommendation at Netflix, 2026-07:

⚠ "LLM이 랭킹한다"를 오독하기 쉬운 지점 — 채점 구조는 생성이 아니다. [확인] 같은 글:

"we extract a pooled hidden state h" → 아이템 i의 학습된 임베딩 eᵢ와 scoring head ϕ가 "(e.g., via dot product or small MLP)" 결합해 sᵢ, softmax로 순위. "All parameters — the backbone, scoring head, and item embeddings — are trained jointly."

LLM이 아이템 제목을 생성해서 추천하는 게 아니다. LLM은 유저 표현 h를 만드는 인코더이고 최종 채점은 여전히 임베딩 내적/작은 MLP다. [추정] 그렇게 보면 자리 3의 실제 형태는 "추천의 생성 모델화"라기보다 시퀀스 트랜스포머 백본을 LLM으로 갈아끼우고 입력 표현을 ID·피처에서 텍스트로 바꾼 것에 가깝다 — Netflix FM(GPT식 시퀀스 트랜스포머, ID·피처 토큰)과 같은 골격에 백본과 입력만 바뀐 셈 (→ sequence-transformer-ranking.md). 이 구분을 놓치면 GenRec을 semantic ID 계열 생성형 retrieval과 혼동하게 되는데 둘은 다른 물건이다 (→ radar.md "생성형 retrieval / semantic ID").

같은 회사의 다른 자리들:

X·Meta와 나란히 놓으면: X는 LLM을 심판(주석·안전)으로, Meta는 피처 인코더(ads)와 오프라인 심판으로, Netflix는 랭커 그 자체로 넣었다. 셋 중 Netflix만 서빙 경로의 채점 함수가 LLM이다 — 단 공개된 실험은 배치 연산 지면 한정. [추정] 코퍼스 크기가 이 순서를 설명할 수 있다 — 후보가 수천 개면 LLM 추론 비용이 감당되고, X·Meta처럼 수억 코퍼스 + ms 단위 예산이면 자리 1·2(오프라인)부터 들어가는 게 자연스럽다. → netflix.md

프레이밍 검증 — "X는 제품 표면, Meta는 업스트림"이 맞는가

이 노트를 시작할 때의 가설이었는데 절반만 맞다. 정정해 둔다.

정확한 문장은 이렇다(2026-08-13 갱신 — ConnectionMind로 두 번째 문장이 뒤집혔다). [추정](등급: 중간 — 공개 문헌 기준으로는 견고하나 미공개 시스템에 대해서는 아무 말도 못 한다)

X는 LLM 판정을 프로덕션 의사결정에 물려 놨고, Meta는 LLM을 (광고) 피처 인코더·(Groups Search) 오프라인 심판, 그리고 이제 (미공개 short-form video 지면) 헤비 유저 hot path의 그래프 경로 추론기로 쓴다. 유기 피드 랭킹 경로에 LLM이 들어간다는 1차 진술은 Netflix GenRec(2026-07, LLM = 채점 함수)이 처음이었고, Meta ConnectionMind(2026-08, LLM = 그래프 경로 추론기)가 두 번째다.

⚠ 이 프레이밍이 흔들릴 수 있는 지점: ① Meta는 유기 피드 스택을 거의 안 공개한다 — 부재가 곧 미사용은 아니었고 실제로 ConnectionMind가 나오면서 이 부분이 확인됐다 ② X는 소스가 공개돼서 있는 걸 다 볼 수 있다 ③ Netflix의 진술은 batch-compute 지면 한정이고, Meta의 진술은 헤비 유저 5–10% 한정이다 — 두 회사 모두 "전면 hot path 100% LLM"은 아니다 ④ 세 회사를 한 줄에 세울 때 지면 성격·서빙 코호트 차이를 지워선 안 된다. 공개 비대칭이 결론처럼 보일 위험이 여전히 이 노트의 최대 리스크다.

[추정](secondhand) Digiday 2026 기사가 *"Meta's LLM bet has yet to touch its core ads business"*라는 제목으로 같은 방향을 보도했다. 2차 보도이므로 근거로 쓰지 않았고, 위 결론은 Meta 1차 문서만으로 세웠다.

Meta 쪽 아직 확인 못한 것


누가 이걸 쓰는가

출처

X

Meta

Netflix