- 읽은 자료 2건
- 정본 반영 2개 파일
- 레이더 2건
오늘 함께 본 다른 변화는 다음과 같다.
- X는 같은 커밋에서 후보마다 어느 retrieval 소스에서 왔는지 기록하고, 요청의 5%를 Kafka로 발행하는 경로를 새로 만들었다.
- X의 노출 판정 엔진(VF)은 판정 결과를 숨김과 표시 두 갈래의 트리로 나타내도록 다시 쓰였다.
- Netflix는 추천 시스템 관측을 반사실 측정 문제로 다루는 RecSys 2026 논문을 냈다. Row Curators 검증에서 A/B와의 R²는 0.82였다.
1재순위 서비스 VMRanker가 값 모델 계산까지 맡을 준비를 마쳤다 — X
자료 xai-org/x-algorithm @ 3aa0fa33 — GitHub, 2026-09-22 커밋(+5,588/−2,601, 파일 72), 코드. 커밋 메시지는 관행대로 Open-source X Recommendation Algorithm 한 줄이다. 이 노트들은 X 추천 코드의 네 번째 공개본(4세대 공개) 뒤에 나온 커밋에 차례로 번호를 붙여 부르며, 이 커밋은 4세대+26이다.
배경 X는 2026-08-13 4세대 공개 이후 매일~격일 주기로 프로덕션 코드를 오픈소스 저장소에 미러링해 왔다. 홈믹서(home-mixer, X For You 피드를 조립하는 서비스)는 여러 retrieval 소스에서 후보를 모아 Phoenix가 예측한 참여 확률로 점수를 매기고, VMRanker로 피드에 낼 후보의 순서를 다시 정한다. Phoenix는 X의 Grok 기반 추천 트랜스포머다. 이번 커밋은 VMRanker의 역할 확장 준비, 후보별 retrieval 출처 기록, 노출 판정 규칙 엔진의 재작성이라는 세 방향을 함께 담았다.
새로 알게 된 것A. VMRanker에 값 모델 입력을 보내거나 값 모델을 계산하게 하는 모드가 생겼다
VMRanker는 홈믹서의 후처리 랭커로, 지금까지 DPP(서로 비슷한 후보가 함께 뽑히지 않도록 고르는 확률 모델) 재순위기 역할만 하던 gRPC 서비스다. 이번 커밋으로 그 역할이 "값 모델(value model, 후보의 최종 유효 가치를 내는 모델) 자체를 컴퓨트하는 서비스"로 확장될 준비가 끝났다.
- VMRanker 호출이 세 모드로 나뉘었다. 기존처럼 DPP 재순위만 하는 모드, 값 모델 입력을 실어 보내 그림자 평가를 하는 모드, 새 값 모델 점수를 실제로 계산하는 모드다 확인 —
home-mixer/scorers/vm_ranker.rs, 신규home-mixer/scorers/vm_ranker_request.rs(+74).- 모드는 두 새 파라미터
VMRankerSendValueModelInputs와VMRankerComputeValueModel로 갈린다. 둘 다 기본 false다. dpp_only는 기존 동작이다.send_inputs는 viewer 컨텍스트와 후보 정책 플래그를 실어 보내 shadow evaluation을 한다.compute_value_model은 실제로 새 value model 스코어를 컴퓨트한다.- VMRanker 요청 페이로드에는 신규 domain type
FsRecipientInputs의 12필드가 실린다.user_id,country_code,language_code,client_app_id,client_version,user_roles,datacenter,has_phone_number,resurrection_time_ms,product,now_ms,fs_overrides
- 후보별 8필드와
PhoenixScores26필드도 함께 실린다. Experiment6라는 6번째 클러스터가 새로 등록됐다.
- 모드는 두 새 파라미터
- 작성자 콜드스타트 처리가 내린 정책 결정 두 가지가 후보에 태그로 붙기 시작했다 확인 —
home-mixer/scorers/author_cold_start.rs(+85/−20).AuthorColdStart::apply_with_decisions()가 새로 생겼고,ColdStartOutcome { scores, author_policy_zeroed: Vec<bool>, lift: Option<ColdStartLift> }을 리턴한다.author_policy_zeroed[i]는 MoE ranking policy에서 이 후보가 zero-score로 마스킹됐는지를 담는다. MoE(mixture of experts)는 여러 전문가 하위 모델 가운데 일부를 골라 쓰는 모델 구조다.lift는 어느 후보를 어느 rank로 lift했는지를 담는다.RankingScorer가 이 두 필드를PostCandidate에 채우면 downstream(VMRanker와 새 Kafka 파이프라인)이 볼 수 있다.
새로 알게 된 것B. 후보마다 어느 retrieval 소스에서 왔는지 기록하고, 요청 일부를 Kafka로 내보낸다
retrieval 소스별 후보 기여도를 오프라인에서 분석할 수 있는 attribution 파이프라인이 홈믹서에 신설됐다. 후보마다 자신이 어느 retrieval 소스에서 어느 클러스터로 어느 rank에 들어왔는지를 벡터로 기록하고, 요청의 5%를 Kafka에 selected/non-selected와 함께 발행한다.
- 샘플링한 요청의 retrieval 후보 목록을 Kafka 토픽으로 발행하는 side effect가 새로 생겼다 확인 — 신규
home-mixer/side_effects/retrieval_candidates_kafka_side_effect.rs(+209).- 두 새 파라미터
RetrievalCandidatesKafkaSamplePercent(기본 5.0)와RetrievalCandidatesKafkaMaxCandidates(기본 200)로 게이팅된다. - 요청마다
RetrievalCandidateBatch프로토 하나가RETRIEVAL_CANDIDATES_TOPIC로 발행된다. 프로토에는request_id,viewer_id,request_time_ms,sample_rate,ranker_cluster,experiment_buckets와 후보 리스트가 담긴다. is_prod()안에서만 켜지고, in-network-only 요청과 캐시된 요청은 제외된다.
- 두 새 파라미터
- 후보가 자기를 가져온 retrieval 소스의 기록을 갖게 됐다 확인 —
home-mixer/models/candidate.rs.- 새 필드는
PostCandidate::retrieval_sources: Vec<RetrievalSource>이다.RetrievalSource는{served_type, cluster: Option<PhoenixRetrievalCluster>, score: Option<f32>, position: Option<u32>}다. - Phoenix/MoE/Topics 세 retrieval RPC 소스는 후보 생성을 신규 헬퍼
candidates_from_retrieval_response()로 이관하면서, served_type별 score 내림차순 rank(1-based)를 붙인다. - Simclusters 소스도
RetrievalSource::from_served_type(ForYouSimclusters)를 붙인다. - 여러 소스에서 나온 중복 후보는 dedup 필터(
filters/drop_duplicates_filter.rs)가retrieval_sources벡터를 병합해, 하나의 후보에 여러 소스 기록을 남긴다. - 대응하는 aggregate 메트릭도 함께 연결됐다.
side_effects/scored_stats_side_effect.rs의record_retrieval_source_contribution이 다음 세 계열을 발행한다.Phoenix.RetrievalContribution.Selected(source·mode=credited/inclusive)PhoenixTopK(k ∈ {10, 100, 200, 500, 1000})SelectedTotal
- 새 필드는
새로 알게 된 것C. 노출 판정 엔진(VF)의 판정 결과가 숨김과 표시 두 갈래의 트리로 바뀌었다
visibility-filtering(VF)은 포스트마다 이 뷰어에게 보여도 되는지를 판정하는 서비스다. 이번 커밋에서 VF rule engine이 완전히 재작성됐다. 판정은 평면 액션 하나에서 이원 판정 트리로 바뀌었고, rule은 함수에서 데이터(predicate 목록, audience, action)로 옮겨 갔다.
- 판정 결과가 숨김과 표시 두 갈래의 트리가 됐다. 숨김에는 드롭과 tombstone(포스트 자리에 안내 문구만 남기는 처리)이 있다 확인 — 신규
visibility-filtering/models/verdict.rs(+62),visibility-filtering/treatment.rs(+446).이전 판정은 flat
VfAction(Allow/Drop/Interstitial 3-variant)이었다. 새 판정은 이원Verdict트리(Withheld{Drop|Tombstone}|Shown{media?, engagement?})다.새 정의는 다음과 같다.
pub enum Verdict { Withheld(Decided<Withholding>), Shown { media: Option<Decided<MediaInterstitial>>, engagement: Option<Decided<LimitedEngagement>> }, } pub enum Withholding { Drop(FilteredReason), Tombstone(TombstoneReason) }Withheld는 terminal(정책·규제 드롭 또는 tombstone)이다.Shown은 non-terminal이라 media interstitial과 limited engagement 두 restriction이 동시에 겹칠 수 있다.결정마다
by: &'static str이 rule 이름을 개별로 기록한다.TombstoneReason::LocalRegulations와LimitedEngagementReason::ConversationControlenum 슬롯은 wire는 있지만, 아직 어떤 rule도 발동하지 않아#[expect(dead_code)]로 마킹돼 있다. 지역 규제 대체 렌더링과 대화 통제 정책이 이 슬롯으로 들어올 준비다.
- rule은 이제 함수가 아니라 데이터로 적는다. rule 하나가 이름, 조건 목록, 적용 대상, 액션으로 이뤄진다 확인 —
visibility-filtering/rules/rule_spec.rs(+240/−69).- 이전
RuleSpec::{Tweet, Author, Custom}enum이RuleClause { rule_name, when: &[Condition], applies_to: Audience, action: ActionSpec }struct로 대체됐다. - Predicate는 4계열로 카탈로그화됐다.
TweetPredicate11종,AuthorPredicate8종,ViewerPredicate5종,RelationshipPredicate5종이다. - Audience는 3종이다:
Everyone/ExceptAuthor/ExceptAuthorAndFollowers. - ActionSpec은 4-variant다:
Drop/Tombstone/Interstitial{legacy, media}/LimitedEngagement. - 신규 helper
tweet_timestamp_ms(tweet_id)가 Snowflake epoch(1288834974657 ms, shift 22-bit)에서 tweet 생성 시각을 뽑는다. - Policy 조립은
rules/registry.rs에서 이뤄진다.TimelineHome30개,TimelineHomeRecommendations56개 rule의 순서는 회귀 테스트wired_rule_order_matches_pre_migration_sequence로 잠긴다.
- 이전
- NSFW interstitial(콘텐츠 위에 씌우는 경고 화면)이 트윗 생성 시점에 따라 다른 사유로 걸린다 확인.
- 신규 rule
NsfwHighPrecisionAdultInterstitialRule이CreatedAfter(1705536000000)(2024-01-18 UTC) predicate로 갈라진다. - 그 이후 생성 트윗은
InterstitialReason::Nudity(true)로, 그 이전 트윗은 기존InterstitialReason::Sensitive(true)로 blur된다. NSFW_HIGH_PRECISION라벨의 semantics가 2024-01-18에 정책적으로 바뀌었고, 이전 라벨을 재해석하지 않고 시점 기준으로 분리 처리한 것으로 읽힌다 추정.
- 신규 rule
- hydration 단계에서 쓰는 SafetyLevel이 새로 생겼다. 이 레벨에서는 트윗만 보는 rule 6개만 돈다 확인.
- SafetyLevel은 VF가 적용할 rule 목록(policy)을 정하는 단위다. 새 레벨
TimelineHomeHydration은 4-variant 중 4번째로 신설됐다. - hydration 단계에서는 author-state와 socialgraph rule을 뺀 tweet-only rule만 돈다.
TWEET_LABEL_DROPS/EXCLUSIVE_TWEET_DROP/TAKEDOWN_DROPS/SENSITIVE_VIEWER_DROPS/NSFW_MEDIA_INTERSTITIALS/NSFW_AUTHOR_INTERSTITIAL
- Thrift
TIMELINE_HOME_HYDRATIONenum(값 4)이 이제 인식된다. 2026-09-18 커밋(4세대+25)에서 이 값은unimplemented로 스텁이었다.
- SafetyLevel은 VF가 적용할 rule 목록(policy)을 정하는 단위다. 새 레벨
새로 알게 된 것D. Phoenix retrieval 서빙의 필터 두 개가 모델 러너로 합쳐지고, int8 양자화 옵션이 생겼다
- Phoenix xrex 서빙 코드에서 별도 파일에 있던 bloom filter와 topic filter가 model_runner 하나로 통합됐다 확인 —
phoenix/xrex/inference/model_runner.py(+328).- 두 필터를 흡수한 것은
RetrievalModelRunner다. - 삭제된 파일은
phoenix/xrex/inference/serving_filters_runner.py(−543)와phoenix/xrex/models/recsys_two_tower_serving_filters.py(−173)다. - Topic filter는 6개 옵션의 parquet(
1fav_topic_option_{0..5}_1day.parquet)를 로드해 요청별로 하나를 고른다. 옵션 0이 기본이고, 1~5는 A/B 대체다. - Bloom filter는 bucket별 pinned host 메모리에 mask 버퍼를 할당하고, Rust(
RetrieveRequestBatch::build_eligible_mask_into_shards())가 이를 채운다. - 둘 중 하나라도 켜지면 live post-embeddings hotswap이 비활성화되고, drained finalize 경로로 폴백한다.
- 이 폴백은 pinned mask가 all_post_ids에 강하게 coupling돼 있어 stale mismatch를 피하기 위한 것이다 추정.
- 두 필터를 흡수한 것은
- 포스트 임베딩 테이블을 int8로 양자화해 쓰는 옵션이 생겼다 확인 — 신규
phoenix/xrex/inference/int8_post_table.py(+11).quantize_post_table()함수가 per-post absolute-max 스케일링으로 bf16 → int8 변환을 한다. scale은 float32다.RetrievalModelRunner.enable_int8_post_table플래그가 켜지면, post embedding 객체가 바뀔 때마다(cache[0] is not xidentity check) 재양자화하고 캐시한다.RecsysTwoTowerModel.forward()가post_scales인자를 새로 받아, int8 → bf16 변환 후 matmul을 수행한다.- 새 sharding pspec
(("stage", "expert", "replica", "data"), ("seq", "model"))로 post embedding 첫 축이 4-axis sharding까지 확장됐다. pipeline·data 병렬 축이 추가된 것이다.
새로 알게 된 것그 밖의 변경
- Phoenix 서빙 엔진의 copy_port 클라이언트가 크게 리팩터돼, 느린 전송 하나가 다음 배치를 막지 않게 됐다 확인 —
phoenix/crates/serving/xai-recsys-engine/src/copy_port_client.rs(+879/−93).- copy_port 클라이언트는 서빙 노드가 트레이너/피어에서 embedding 테이블·dense weight를 병렬 다운로드하는 클라이언트다.
- 배치-per-배치 방식이 사라지고
tokio::task::JoinSet기반 streaming continuation으로 대체돼, slow-tail transfer가 다음 배치를 막지 않는다. - 새 env var는 두 개다.
COPY_PORT_TRAINER_CONNS_PER_SOURCE는 트레이너 하나에 여는 병렬 커넥션 개수다(1~16 clamp).XAI_RECSYS_RDMA=1은 RDMA 모드이고, 이 모드에서는 커넥션 다중화가 비활성된다. - 신규
spawn_striped_trainer_downloads()가 트레이너 하나의 소유 파일 리스트를 커넥션 수로 균등 분할해 파이프라이닝한다. - Checkpoint hot-swap 지연을 줄이기 위한 최적화다 추정.
- 홈믹서에 하드코딩돼 있던 상수 두 개가 FS(FeatureSwitch, 런타임에 값을 바꿀 수 있는 설정 스위치) 파라미터로 옮겨졌다 확인.
NEW_USER_OON_WEIGHT_FACTOR상수는NewUserOonWeightFactor(FSrust_home_mixer_new_user_oon_weight_factor, 기본0.00001)로 이동했다.ANN_MAX_POST_CANDIDATE_AGE_HOURS상수는SimclustersMaxCandidateAgeHours(FSrust_home_mixer_simclusters_max_candidate_age_hours, 기본 48)로 이동했다.- Simclusters cache key가
signal_id → (signal_id, max_candidate_age_hours)로 확장돼, age가 다른 실험이 서로 다른 cache entry를 갖는다.
- Phoenix MoE 후보 소스를 즉시 끌 수 있는 kill-switch decider가 생겼다 확인 —
home-mixer/sources/phoenix_moe_source.rs(+66/−19).- 새 decider
disable_home_mixer_phoenix_moe_source가 켜지면 MoE 소스가 즉시 disable된다. - FS는 rollout에 시간이 걸리지만, decider는 seconds 단위로 propagate된다.
PhoenixMoeColdStartMaxResults(기본 0)도 신설돼, 2026-09-18 커밋(4세대+25)에서 non-MoE 소스에 도입된 cold-start 슬라이스 상한이 MoE에도 노출된다.
- 새 decider
- Grox(X의 LLM 주석 파이프라인)의 간이 답글 점수기가 인용 트윗이 있는 답글을 full 점수기로 넘기고, LLM 출력 JSON을 3단계로 복구한다 확인 —
grox/flows/reply_spam/classifier_simple_reply_scorer.py(+103/−3).- 간이 점수기는
SimpleReplyScorer다. 인용 트윗(quoted_post)이 있는 리플라이는 simple 경로를 건너뛰고 fullReplyScorer경로로 위임된다(카운터task.spam_comment_detection.full_scorer.count). - LLM output JSON 파서는 다음 3단계로 방어한다.
re.search(r"\{.*\}", output, re.DOTALL)로 추출한다.- 실패하면
json_repair.repair_json()을 쓴다. - 여전히 실패하면
r'"score":\s*([\d.]+)'regex로 숫자만 뽑아 낸다.
- 파싱 실패는
task.reply_ranker.invalid.count{reason=invalid_format|invalid_score_format|score_out_of_range}3계열로 세어진다. - 새 히스토그램
ranked_replies_scores가 4-bucket(0.0, 1.0, 2.0, 3.0)으로 score 분포를 관측한다.
- 간이 점수기는
"The framework treats recommender-system observability as a counterfactual measurement problem: estimating what the recommender would have done, and what engagement would have followed, in the absence of a specific content item or model decision." — Beyond Raw Engagement (arXiv 2609.22747), 2026-09-19 (Netflix 자료에서 인용, 이 자료 아래 절 참조)
정본 반영 services/x.md의 공개 소스 4세대 표에 4세대+26 행을 추가해 3aa0fa33 커밋을 요약했다. 열린 질문의 세 축은 VMRanker의 value model 실체, retrieval attribution의 downstream 활용, VF Tombstone/LimitedEngagement 슬롯이 언제 채워지는지이고, 모두 후속 커밋에서 지켜볼 대상이다.
의미 VMRanker 확장, retrieval attribution 파이프라인, VF verdict 트리 재작성이 한 커밋에 함께 왔고, 세 축 모두 "인프라 연결은 완성됐지만 랭킹 동작은 그대로"라는 4세대의 반복되는 패턴을 따른다. 다만 retrieval 후보의 Kafka 발행은 기본값 5.0(퍼센트)에 따라 대상 요청의 5%에서 이미 돈다(위 RetrievalCandidatesKafkaSamplePercent).
- VMRanker는 값 모델을 컴퓨트할 준비를 마쳤다.
- retrieval attribution 파이프라인은 후보 origin을 후보 자체에 기록하고, 5% Kafka 샘플과 aggregate metric을 함께 낸다.
- VF verdict 트리 재작성은 여러 restriction의 겹침을 표현하고, Tombstone/LimitedEngagement 슬롯을 열었다.
- Phoenix xrex serving 층에서도 별도 파일이었던 bloom filter·topic filter가 model_runner로 통합되고, int8 post table quantization까지 함께 왔다. 이것은 retrieval serving의 대규모 스케일 대응 축이다.
- 앞으로 관찰할 지점은 세 개다.
VMRankerComputeValueModel=true가 실험으로 켜지는 시점, retrieval attribution Kafka가 어느 오프라인 잡의 입력이 되는지, Tombstone/LimitedEngagement 슬롯이 어느 rule에서 처음 채워지는지다.
2추천 시스템 관측을 반사실 측정 문제로 다루는 RecSys 2026 논문 — Netflix
자료 Beyond Raw Engagement: A Counterfactual Observability Framework for Recommender Systems at Netflix (arXiv 2609.22747) — arXiv, 2026-09-19 v1 제출, 논문. RecSys 2026(2026-10-02 Minneapolis)에 accepted됐다. 저자 4인 가운데 Chaoran Guo·Ding Tong·Scarlet Chen 3인은 Netflix(Los Gatos) 소속이고, Ting-Po Lee는 Netflix에서 연구를 수행했다고 적었다(소속지 San Jose). HTML 판에서 이메일 도메인 @netflix.com 3인을 확인했다.
배경 대규모 recommender system에서 조회수·클릭 같은 raw engagement 신호만 보면 여러 요인이 뒤섞인다. 섞이는 것은 콘텐츠 품질, 모델 동작, 노출 편향, 청중 도달(각각 content quality, model behavior, presentation bias, audience reach)이다. 그래서 어떤 원인이 어떤 결과를 냈는지 귀속하기 어렵다. 예를 들어 새 모델이 좋은 콘텐츠를 잘못 배치해 CTR이 낮게 나오면, raw CTR만 보는 한 그 콘텐츠가 저평가된다. Netflix는 이 문제를 "recommender-system observability를 counterfactual measurement problem으로 재정의"하는 방식으로 접근하는 프레임워크를, 몇 년에 걸쳐 여러 recommender 위에 구축·배포해 왔다고 밝힌다. 이 방식은 특정 콘텐츠 아이템이나 특정 모델 결정이 없었다면 어떤 추천이 나오고 어떤 engagement가 뒤따랐을지를 추정한다. Counterfactual 측정 자체는 새 개념이 아니다. 이 자료의 각도는 "content creator와 model developer 두 청중을 단일 측정 기반으로 지원한다"는 관점과, cascading recommender(upstream 단계가 후보 pool을 먼저 거르는 다단계 추천)로의 확장이다. 이번 논문은 bias reduction / relativity / incrementality 세 축의 방법론과, 프로덕션 검증 사례 하나(Row Curators A/B alignment R²=0.82, label misattribution 자동 감지)를 공개했다.
새로 알게 된 것A. 측정은 세 축으로 이뤄지고, exploration으로 남긴 노출 확률 로그를 전제로 한다
- Netflix가 자체 recommender에 배포한 measurement의 축은 세 개다 확인 §3.1.
- Bias reduction은 노출 propensity를 SNIPS로 보정한다. SNIPS는 inverse propensity score(IPS, 관측값을 노출 확률의 역수로 가중하는 추정)의 self-normalized 변형이다. 정책 $\pi_e$와 로그 정책 $\pi_0$의 alignment는 match function $m$으로 가늠하고, exact matching이 unbiased의 특수 케이스라고 명시한다.
- Relativity는 알고리즘 성능과 콘텐츠 성능을 분리한다. 정책 대 정책 비교에는 SNIPS 차이를, 아이템 대 아이템 비교에는 position-adjusted SNIPS를 쓴다. Position bias를 완화하려고 콘텐츠 $c_i$의 각 position lift를 랜덤 콘텐츠와 비교한 뒤 position weight로 aggregate한다.
- Incrementality는 "이 아이템을 제거하면 얼마의 가치를 잃는가"를 counterfactual로 물어 콘텐츠의 실제 기여도를 잰다. Netflix는 이 축의 방법을 single-stage와 cascading 두 케이스로 나눠 제시한다.
- 이 프레임워크는 Exploration & Exploitation 모듈을 전제조건으로 한다 확인 §3.1.
- 프레임워크는 contextual bandit·RL setup 위에서 동작한다. arm $a_j$가 정책 $\pi$에 따라 확률 $\pi(a_j|x_j)$로 선택되고, 그 확률이 logging된다.
- 즉 exploration을 하지 않고 logged propensity가 없는 recommender에는 이 프레임워크를 그대로 적용할 수 없다.
- Netflix는 이 조건이 대부분의 자체 recommender에 이미 충족돼 있다고 서술한다.
새로 알게 된 것B. single-stage에서는 아이템을 뺀 반사실 정책과 비교해 증분 기여도를 재고, 캐스케이드에서는 청중마다 방법이 다르다
- single-stage incrementality는 Leave-One-Out 측정으로 잰다 확인 §3.2.
- Exploration 정책 위에 특정 아이템이 제거된 counterfactual을 시뮬레이션한 "Leave-One-Out policy"를 두고, 두 정책의 SNIPS 차이를 position별로 aggregate한다.
- match function은 다음 두 조건 중 하나에서 1이다.
- explored arm이 Exploration 정책의 top pick이고 제거 대상이 아닐 때
- explored arm이 second-best이고 top이 제거 대상일 때
- 분산을 줄이려고 logged probability를 10th percentile에서 하한 clip한다.
- cascading recommender에서는 청중에 따라 방법이 다르다 확인 §3.3.
캐스케이드에서는 후보 pool이 upstream에서 걸러지므로, 낮은 engagement가 upstream filtering 탓일 수 있다.
upstream model developer에게는 "이 아이템을 후보 pool에 넣는 것이 좋았나"를 묻고, Leave-One-Out을 재사용한다. 다만 target action이 single top pick이 아니라 set이 되므로, match $m$을 Jaccard 같은 set similarity로 재정의한다.
- 여러 아이템에서 lift가 크면 upstream이 downstream에 실제로 값을 더한다는 뜻이다.
- 반대면 pool이 downstream 관점에서 교환 가능하다는 뜻이다.
content creator와 platform observability를 위해서는 각 아이템의 전체 pipeline 기여도를 두 값으로 분해한다.
Incrementality(i) = Irreplaceability(i) · Universality(i)
- Irreplaceability는 i가 후보 pool에 있을 때의 조건부 causal lift이고, self-normalized Hájek IPS로 추정한다.
- Universality는 i가 eligible한 확률이다.
새로 알게 된 것C. Row Curators의 오프라인 측정과 실제 A/B의 alignment가 R²=0.82였고, 라벨 오귀속을 자동으로 감지한 사례가 있다
Row Curators의 오프라인 incrementality 측정과 실제 A/B의 alignment는 R²=0.82였다 확인 §4.2.
- Netflix 홈페이지의 "Row Curator"는 콘텐츠 큐레이터가 만드는 title 컬렉션 row다.
- 이 row의 오프라인 incrementality 측정을 실제 A/B ground truth와 비교했다. A/B는 해당 row 시리즈를 recommender에서 제거하고 user engagement 손실을 측정한 것이다.
- 11개 A/B에서 alignment는 R²=0.8212였다.
- Netflix는 self-normalized Hájek estimator를 선택한 이유로 heterogeneous propensity 환경에서의 견고성을 든다.
- 프로덕션 세부 사항은 세 가지다.
- propensity를 [0.0001, 0.9999]로 clip한다.
- row당 최소 100 observation을 요구한다.
- 서로 다른 길이의 홈페이지에 걸쳐 aggregate한다.
"For the Irreplaceability estimate, we tried different estimators and eventually selected the self-normalized Hájek estimator for robust observability signal under such heterogeneous propensities. In practice, we clip the propensities to [0.0001, 0.9999] to further reduce variance, require at least 100 observations for each row, and aggregate across homepages of varying lengths. Across 11 A/B tests, the R² between our proposed row-incrementality measurement and the A/B-test ground truth is 0.8212, providing strong validation of our approach." — arXiv 2609.22747, 2026-09-19
model developer 관측 사례에서는 라벨 misattribution이 자동으로 감지됐다 확인 §4.3.
- Incrementality 시계열 모니터링이, 다른 유사 콘텐츠는 안정된 상황에서 특정 콘텐츠 A의 성능 dip를 감지해 냈다.
- 원인을 추적한 결과는 "모델의 positive label misattribution"이었다.
- 저자는 이 프레임워크가 raw engagement로는 놓칠 발견을 하고, model developer가 root cause에 빨리 접근하게 만든다고 정리한다.
새로 알게 된 것D. 논문이 밝히지 않은 것이 다섯 가지 있다
- 논문은 다음 다섯 가지를 명시하지 않는다 관찰 논문 정독.
- 프레임워크가 각각 어느 recommender에 배포됐는지 이름을 밝히지 않는다. 홈페이지 row 큐레이션이 명확한 유일한 사례다.
- core online metric의 절대값이 공개되지 않는다.
- FM·GenRec·GenPage 같은 세대 라인과의 관계가 명시되지 않는다. 이 프레임워크가 GenRec의 A/B alignment에 쓰였는지, 자체 라인인지 불분명하다.
- FM은 회원 표현을 중앙화한 Netflix의 Foundation Model이다. GenRec은 LLM 랭커이고, GenPage는 페이지 전체를 트랜스포머 하나로 생성하는 모델이다.
- Row Curators A/B 11개의 개별 결과가 논문 본문에는 제시되지 않고, R² 하나로만 aggregate돼 있다.
- 프레임워크가 아직 커버하지 않는 recommender(exploration 없는 경우 등)의 대응책이 언급되지 않는다.
정본 반영 services/netflix.md의 학습 주기·평가 절 아래에 새 하위 절 "Counterfactual observability 프레임워크 (2026-09, RecSys 2026)"를 만들었다. 정본에는 기존 진술 "오프라인 지표가 A/B를 예측 못 함(10년째 같은 고백)"과, MediaFM(Netflix의 비디오 프리뷰용 foundation model)의 popularity-based winner 프록시가 gate 역할을 하는 방식이 있었다. 이번 자료는 그 옆에 "운영 중 관측(observability)" 축을 counterfactual measurement 기반으로 별도로 세운다는 진술로 들어갔다. 그 절에는 Row Curators A/B alignment R²=0.82와 label misattribution 자동 감지 사례를 담았다. 또 MediaFM 프록시가 "체크포인트 gating(선발전)"이라면 이 프레임워크는 "프로덕션 monitoring(경기 중 관측)"이라는 위치 차이를 명시했다.
의미 이번 자료는 오프라인 평가와 A/B의 alignment 문제 가운데 한 축인 "프로덕션 관측성"에 대해, counterfactual measurement 기반의 자체 프레임워크를 제시한다. Netflix는 그동안 이 alignment가 낮다는 것을 정직하게 인정해 왔다("A/B 결과를 원하는 만큼 예측하지 못한다", 2015). Row Curators A/B alignment R²=0.82는 이 프레임워크의 오프라인 추정치가 실제 A/B 결과의 82%를 설명한다는 강한 결과다(random baseline이 0에 가까울 것을 감안).
- 저장소 정본에서 이 프레임워크는 MediaFM의 popularity-based winner(체크포인트 gating용 오프라인 프록시)와 나란히 서지만 자리가 다르다. winner는 배포 전 선발이고, 이 프레임워크는 배포 후 관측이다.
- GenRec 논문의 A/B 결과 검증에 이 프레임워크가 쓰였는지가 후속 확인 대상이다.
- exploration 기반 logged propensity가 전제이므로, non-exploring recommender(예: pure Foundation Model shadow 배포)에는 그대로 적용할 수 없다는 제약이 함께 붙는다.
- Netflix가 recommender 측정 방법론을 별도 논문으로 공개한 것은, 이 저장소 코퍼스 안에서 counterfactual measurement 라인의 첫 회사 진술이다. 위치와 목적은 MAPS(Netflix의 아트워크·비디오 프리뷰 개인화 시스템)의 offline gating과는 별개다.
레이더
오늘 arXiv cs.IR 신규 30건을 triage해 3건을 통과시켰고, 그중 2건을 radar.md에 편입했다. 통과한 나머지 1건은 Netflix 자료로, 위 2절에서 자세히 다뤘고 서비스 정본에 직접 반영했으므로 레이더에는 편입하지 않는다. 파싱된 <entry> 개수는 30, 대상 기간은 2026-09-18~09-21이다.
- UNIQUE는 산업 mobile feed에서 retrieval과 ranking을 통합하고 single-layer flat quantization을 쓰는 Baidu·Beihang·CityU 논문이다 확인 — arXiv 2609.23718, 2026-09-20 v1.
- RecSys 2026에 accepted됐다.
- 저자 소속은 HTML 판에서 확인했다: Baidu Inc.·Beihang University·Hong Kong Institute of AI for Science.
- 논문은 후보 retrieval의 hierarchical quantization instability와 retrieval-ranking stage 간 정보 손실을 두 축의 문제로 지적한다.
- 그리고 generative code-based retrieval과 target-aware ranking을 early-fusion single architecture로 통합해, end-to-end 학습과 효율적 후보 생성을 함께 노린다고 주장한다.
- Baidu는 canon 서비스(이 저장소가 정본 문서를 두고 추적하는 서비스)는 아니지만, 대규모 산업 mobile feed인 Baidu App을 운영한다.
- 논문이 프로덕션 배포와 A/B 수치를 abstract 수준에서 명시하는지는 정독이 필요하다. radar에는 심층 분석 대기로 편입했다.
- MuSeR는 deployed MGS 위에서 10^4~10^5 규모 유저 이력을 hierarchical temporal compression으로 압축하는 Kuaishou의 multi-interest 시퀀스 retrieval이다 확인 — arXiv 2609.23677, 2026-09-20 v1.
- HTML 판에서 저자 소속이 Kuaishou 도메인임을 확인했다.
- 최근 액션은 full resolution으로 유지하고, 오래된 세그먼트는 점진 pooling으로 압축해 fixed serving budget 안에서 lifelong history를 담는다는 접근이다.
- Kuaishou는 이미 radar에 SWIM·UniRec·DrEM 등 다수 스레드가 있다.
- MuSeR는 Tencent의 ChronicleRec와 자리가 인접하고, 둘 다 ultra-long behavior sequence를 사전 압축한다. MuSeR는 radar의 lifelong user modeling 각도에 데이터 포인트를 하나 더한다.
나머지 27건은 탈락했고 관찰 대상이 아니다. 요건 삼각, 즉 플랫폼 기업 저자, 프로덕션 A/B 진술, 메커니즘·스케일 신규성을 만족하지 않았다. 탈락 목록은 Ascent(clinical MCP), UK-PRBENCH(법률 case law retrieval), Semantic ID reproducibility study, Baidu·Google AI search auditing(외부 audit), Graded-Relevance e-commerce multimodal, publication bias biomedical causal search, UniK universal knowledge, Q-TIE temporal IR, YouTube Music LLM rationale(음악 도메인), UNDRR disaster schema extraction, Redundancy Reduction Sequential Recommendation(academic), PSD LLM agent memory, Answer-Oriented Context AI search, candidate-job matching bi-encoder eval, Brand Visibility AI Search, MM-ContextFold multimodal RAG, EU research policy, Inherit4Rec(Kuaishou 파라미터 상속, mechanism-novel하지만 프로덕션 A/B 미언급으로 이번 batch에서는 탈락), Static-vs-Agentic RAG Taiwan history, Attributable RAG citations, R-GEAN medication change(EHR), Per-Query Gating LLM rerankers, Dense-Sparse Fusion BEIR SciFact, DOA-SORT multi-object tracking(비-IR), GEO score cross-engine, AdaMerge visual doc retrieval, semantic candidate-job matching hybrid retrieval이다.
산업 블로그 훑기는 월요일에만 한다. 수요일인 오늘은 대상이 아니었다.
다음에 볼 것
- X 3aa0fa33 커밋이 연 세 축이 후속 커밋에서 어떻게 연결되는지 본다. 볼 지점은 세 개다.
VMRankerComputeValueModel=true가 실험으로 켜지는 시점(현재 기본 false)- retrieval attribution Kafka(
RETRIEVAL_CANDIDATES_TOPIC)의 5% 샘플이 어느 오프라인 잡의 입력이 되는지 - VF
TombstoneReason::LocalRegulations/LimitedEngagementReason::ConversationControl슬롯이 어느 rule에서 처음 채워지는지
- Netflix counterfactual observability 프레임워크가 어디까지 쓰이는지 본다 — 프레임워크가 GenRec의 A/B 결과 검증에 쓰였는지, 다른 지면(FM·GenPage·MediaFM·MAPS) 자료에서 이 프레임워크의 measurement가 인용되는지 관측한다. RecSys 2026(2026-10-02) 발표 시점에 후속 진술이 나오는지도 본다.
- UNIQUE 원문을 정독할지 판단한다 — Baidu App feed 배포 진술과 A/B 수치가 abstract 밖 본문에 있는지 본다. 있다면
topics/generative-retrieval.md같은 SID(semantic ID, 아이템을 계층 코드로 표현한 토큰 열)·early-fusion 스레드로 승격할 후보인지 가린다. RecSys 2026 발표 시점에 함께 재확인한다.