Netflix / graphql

2 개의 포스트

netflix

The AI Evolution of Graph Search at Netflix (새 탭에서 열림)

넷플릭스는 기업 내 복잡한 데이터 생태계를 효율적으로 탐색하기 위해 기존의 구조화된 쿼리 언어(DSL) 방식에서 생성형 AI 기반의 자연어 검색으로 진화하고 있습니다. 대규모 언어 모델(LLM)을 활용하여 사용자의 모호한 질문을 정확한 필터 문구로 변환함으로써 기술적 장벽을 낮추고 업무 효율성을 극대화하는 것이 이번 프로젝트의 핵심입니다. 이를 통해 사용자 의도를 정확히 반영하면서도 기존 시스템의 안정성을 유지하는 신뢰 중심의 검색 플랫폼을 구축하고자 합니다. ## 자연어 검색 도입 배경과 비즈니스 요구사항 * **기존 방식의 한계:** 사용자들은 수백 개의 필드가 포함된 복잡한 UI에서 필터를 수동으로 설정하거나 특정 DSL(Domain Specific Language)을 학습해야 하는 번거로움을 겪었습니다. * **사용자 경험 개선:** 기술적인 구조가 아닌 일상적인 언어(예: "90년대 미국 로봇 영화")로 데이터를 즉시 찾을 수 있게 하여 검색 과정의 마찰을 줄이고자 합니다. * **시스템 보완 전략:** 기존 애플리케이션을 완전히 대체하는 것이 아니라, 자연어를 DSL로 변환하는 기능을 추가하여 기존 검색 인프라에 RAG(검색 증강 생성) 기능을 보강하는 방향을 선택했습니다. ## Text-to-Query 변환의 세 가지 핵심 기준 * **구문적 정확성 (Syntactic):** 생성된 문장이 Graph Search Filter DSL의 문법 규칙을 완벽하게 따라야 하며, 파싱이 가능한 형태여야 합니다. * **의미적 정확성 (Semantic):** 인덱스에 실제로 존재하는 필드만 사용해야 하며, 데이터 타입에 맞는 비교 연산자를 사용하고 '통제된 어휘(Controlled Vocabulary)'의 허용 범위를 준수하여 환각(Hallucination) 현상을 방지해야 합니다. * **화용적 정확성 (Pragmatic):** 기술적으로 완벽한 쿼리일지라도, 그것이 사용자가 실제로 질문한 의도와 목적을 정확하게 담아내야 합니다. ## 컨텍스트 엔지니어링을 통한 성능 최적화 * **메타데이터 활용:** GraphQL 스키마에서 추출한 필드 설명, 타입 정보 등을 LLM의 컨텍스트로 제공하여 모델이 데이터 구조를 이해하도록 돕습니다. * **통제된 어휘(Controlled Vocabulary) 관리:** 국가명이나 장르와 같이 정해진 값의 목록이 있는 경우, 이를 메타데이터에 포함하여 LLM이 유효한 값 내에서만 쿼리를 생성하도록 유도합니다. * **확장성 문제 해결:** 수백 개의 필드와 수천 개의 유효값을 가진 대규모 인덱스의 경우, 모든 정보를 프롬프트에 넣으면 지연 시간이 늘어나고 정확도가 떨어지므로 필요한 정보만 선별하여 제공하는 정교한 컨텍스트 구성 전략을 사용합니다. 넷플릭스의 사례는 복잡한 기업용 데이터 검색 시스템에서 LLM을 직접적인 해답 제공자가 아닌, 검증된 기존 DSL을 생성하는 '번역기'로 활용함으로써 데이터의 정확성과 시스템의 신뢰성을 동시에 확보할 수 있음을 보여줍니다. 전문적인 데이터 탐색이 필요한 도메인일수록 이러한 단계적 AI 통합 접근 방식이 효과적입니다.

netflix

Scaling Muse: How Netflix Powers Data-Driven Creative Insights at Trillion-Row Scale | by Netflix Technology Blog | Netflix TechBlog (새 탭에서 열림)

넷플릭스의 내부 데이터 분석 플랫폼인 'Muse'는 수조 건 규모의 데이터를 분석하여 홍보용 미디어(아트웍, 영상 클립)의 효과를 측정하고 창작 전략을 지원합니다. 급증하는 데이터 규모와 복잡한 다대다(Many-to-Many) 필터링 요구사항을 해결하기 위해, 넷플릭스는 HyperLogLog(HLL) 스케치와 인메모리 기술인 Hollow를 도입하여 데이터 서빙 레이어를 혁신했습니다. 이를 통해 데이터 정확도를 유지하면서도 수조 행의 데이터를 실시간에 가깝게 처리할 수 있는 고성능 OLAP 환경을 구축했습니다. ### 효율적인 고유 사용자 집계를 위한 HLL 스케치 도입 * **근사치 계산을 통한 성능 최적화:** 고유 사용자 수(Distinct Count)를 계산할 때 발생하는 막대한 리소스 소모를 줄이기 위해 Apache Datasketches의 HLL 기술을 도입했습니다. 약 0.8%~2%의 미세한 오차를 허용하는 대신 집계 속도를 비약적으로 높였습니다. * **단계별 스케치 생성:** Druid 데이터 수집 단계에서 '롤업(Rollup)' 기능을 사용해 데이터를 사전 요약하고, Spark ETL 과정에서는 매일 생성되는 HLL 스케치를 기존 데이터와 병합(hll_union)하여 전체 기간의 통계를 관리합니다. * **데이터 규모 축소:** 수개월에서 수년 치의 데이터를 전수 비교하는 대신, 미리 생성된 스케치만 결합하면 되므로 데이터 처리량과 저장 공간을 획기적으로 절감했습니다. ### Hollow를 활용한 인메모리 사전 집계 및 서빙 * **초저지연 조회 구현:** 모든 쿼리를 Druid에서 처리하는 대신, 자주 사용되는 '전체 기간(All-time)' 집계 데이터는 넷플릭스의 오픈소스 기술인 'Hollow'를 통해 인메모리 방식으로 서빙합니다. * **Spark와 마이크로서비스의 연계:** Spark 작업에서 미리 계산된 HLL 스케치 집계 데이터를 Hollow 데이터셋으로 발행하면, Spring Boot 기반의 마이크로서비스가 이를 메모리에 로드하여 밀리초(ms) 단위의 응답 속도를 제공합니다. * **조인(Join) 병목 해결:** 복잡한 시청자 성향(Audience Affinity) 필터링과 같은 다대다 관계 연산을 메모리 내에서 처리함으로써 기존 아키텍처의 한계를 극복했습니다. ### 데이터 검증 및 아키텍처 현대화 * **신뢰성 보장:** 아키텍처 변경 전후의 데이터 정합성을 확인하기 위해 내부 디버깅 도구를 활용하여 사전/사후 데이터를 정밀하게 비교 검증했습니다. * **기술 스택 고도화:** React 프런트엔드와 GraphQL 레이어, 그리고 gRPC 기반의 Spring Boot 마이크로서비스 구조를 통해 확장성 있는 시스템을 구축했습니다. * **분석 역량 강화:** 이를 통해 단순한 대시보드를 넘어 이상치 감지(Outlier Detection), 미디어 간 성과 비교, 고급 필터링 등 사용자들의 고도화된 분석 요구를 수용할 수 있게 되었습니다. 대규모 OLAP 시스템을 설계할 때 모든 데이터를 실시간으로 전수 계산하기보다는, HLL과 같은 확률적 자료구조와 Hollow 기반의 인메모리 캐싱을 적절히 조합하는 것이 성능 최적화의 핵심입니다. 특히 수조 건 규모의 데이터에서는 완벽한 정확도와 성능 사이의 트레이드오프를 전략적으로 선택하는 것이 시스템의 유연성을 결정짓습니다.