Spotify/llm

4 개의 포스트

spotify

도메인 전문가를 코드화하기: Spotify 데이터 어시스턴트를 뒷받침하는 컨텍스트 레이어 | Spotify Engineering (새 탭에서 열림)

Spotify의 데이터 어시스턴트가 신뢰할 만한 답변을 제공하는 핵심은 거대한 스키마를 LLM에 모두 넣는 것이 아니라, 도메인 전문가가 선별한 맥락 계층을 구축하는 데 있다. 이 맥락은 관련 데이터셋, 검증된 질문-SQL 예시, 업무 문서로 구성되며 각 도메인 팀이 소유하고 관리한다. 결국 AI는 전문가를 대체하기보다 전문가의 지식을 여러 사용자에게 확장하는 역할을 한다. ## 대규모 데이터 환경에서 스키마만으로 부족한 이유 - Spotify에는 7만 개 이상의 데이터셋과 페타바이트 규모의 데이터가 있다. - 모든 스키마를 LLM의 컨텍스트에 넣는 방식은 다음과 같은 한계가 있다. - 컨텍스트 윈도우가 전체 데이터 웨어하우스를 담기에 부족하다. - 컬럼 타입만으로는 실제 업무 의미를 알 수 없다. - 예를 들어 `INT64` 컬럼만 보고는 테스트 데이터와 실제 데이터의 구분, 또는 “활성 사용자”의 정의를 알 수 없다. - 테이블 수가 많을수록 모델은 비슷한 테이블 중 잘못된 대상을 선택하면서도 자신 있게 답할 수 있다. - 따라서 스키마와 LLM 사이에 도메인별 의미와 사용법을 담은 별도의 맥락 계층이 필요하다. ## Spotify 데이터 에이전트의 동작 방식 - 사용자가 자연어로 질문하면 에이전트가 다음 과정을 수행한다. - 적절한 데이터 맥락을 선택한다. - SQL을 생성한다. - 데이터 웨어하우스에서 쿼리를 실행한다. - 답변, 생성된 SQL, 사용한 출처를 함께 반환한다. - ReAct 루프를 사용해 도구 호출 결과에 따라 추론과 행동을 반복하고, 필요하면 쿼리를 수정한다. - 사용자는 결과뿐 아니라 답변이 어떻게 만들어졌는지도 확인할 수 있다. - Slack 봇, IDE와 AI 도구에서 사용할 수 있는 MCP 서버, 전용 웹 UI로 제공된다. - 관련 지식 기반이 없을 경우에도 이를 명시해 답변의 한계를 투명하게 드러낸다. - 2025년 8월 기준 2,100명 이상의 사용자가 13,000건 이상의 대화에서 활용했으며, 광고·팟캐스트·음악·오디오북·재무 등 177개 클러스터를 지원한다. ## 도메인별 클러스터 모델 Spotify는 데이터 도메인을 “클러스터”라고 부른다. 클러스터는 특정 조직, 프로젝트, 이니셔티브 또는 관심 주제를 중심으로 구성되며, 각 클러스터는 이름이 지정된 전문가 팀이 소유한다. - **데이터셋** - 관련 웨어하우스 테이블과 전체 스키마를 포함한다. - 컬럼 카디널리티, 자주 등장하는 값의 샘플, 파티션 구조 등을 프로파일링한다. - 예를 들어 `country` 컬럼에 `US`, `GB`, `SE` 등이 존재한다는 정보는 모델이 적절한 `WHERE` 조건을 작성하는 데 도움을 준다. - **질문-SQL 쌍** - 전문가가 작성하거나 검토한 질문과 SQL의 조합이다. - 단순한 예시가 아니라 해당 도메인에서 권장되는 쿼리 패턴과 데이터 의미를 가르치는 few-shot 자료로 사용된다. - **문서** - 업무 용어, 팀별로 달라지는 정의, 데이터 사용 시 주의점 등을 기록한다. - 어떤 컬럼을 사용해야 하고 어떤 컬럼을 피해야 하는지도 설명할 수 있다. - 클러스터의 범위, 포함할 테이블, 중요한 예시는 데이터 과학자와 애널리틱스 엔지니어 등 도메인 전문가가 결정한다. ## 자동 생성보다 전문가 검토가 중요한 이유 - Spotify는 데이터 웨어하우스의 과거 쿼리 기록에서 질문-SQL 쌍을 자동으로 생성하는 방법을 검토했다. - 실제 쿼리이므로 유용할 것처럼 보였지만, 큐레이터가 승인한 예시는 전체의 12.5%에 불과했다. - 나머지 87.5%에는 다음과 같은 쿼리가 포함되어 있었다. - 일회성 탐색이나 디버깅 쿼리 - 다시 사용하지 않을 임시 분석 - 잘못된 테이블을 사용한 쿼리 - 기술적으로는 맞지만 다른 사용자에게 잘못된 패턴을 가르치는 쿼리 - 쿼리 기록에는 정보가 많지만, 어떤 쿼리가 표준적인 지식인지는 자동으로 표시되지 않는다. - 따라서 AI가 데이터의 진실을 결정하도록 하지 않고, 전문가가 예시를 검토하고 정식 사례로 승인한다. - 목적은 전문가를 대체하는 것이 아니라 전문가의 판단을 재사용 가능한 형태로 확장하는 것이다. ## 클러스터의 지속적인 건강 관리 데이터 스키마와 업무 규칙은 계속 변하기 때문에, 한 번 만든 맥락이 영원히 정확한 것은 아니다. - 테이블이 교체되거나 폐기될 수 있다. - 컬럼명이 변경될 수 있다. - 비즈니스 정의와 분석 방식이 달라질 수 있다. - 기존 질문-SQL 쌍이 변경된 스키마와 호환되지 않을 수 있다. - Spotify는 여러 신호를 종합해 클러스터 건강 점수를 계산한다. - 기반 데이터의 상태 - 최근 스키마 변경 이후에도 curated pair가 유효한지 여부 - 실제 사용자가 묻는 질문을 충분히 다루는지 - 생성된 SQL을 재현할 수 있는지 - 기타 품질 및 활용 지표 - 문제가 발생하면 건강 점수가 낮아지고, 전문가에게 필요한 정비 작업이 제안된다. - 클러스터 소유자는 대시보드의 점수와 세부 신호를 보고 우선적으로 관리할 영역을 결정한다. ## 사용자 대화로 이어지는 피드백 루프 - 모든 대화와 쿼리는 기록되어 클러스터 소유자에게 전달된다. - 소유자는 질문, 답변, 생성된 SQL, 사용자 피드백을 확인할 수 있다. - 전문가가 질문-SQL 쌍을 승인하거나 문서를 보완할 때마다 이후 사용자에게 제공되는 맥락이 개선된다. - 즉, 실제 사용 과정이 새로운 품질 관리와 지식 축적의 자료가 된다. - 어시스턴트의 신뢰도는 모델 자체보다 그 모델이 참조하는 맥락의 품질과 최신성에 달려 있다. ## 실용적인 시사점 데이터 AI를 구축할 때는 모든 스키마를 한꺼번에 제공하기보다, 도메인별로 범위를 나누고 전문가가 검증한 예시와 업무 규칙을 함께 관리하는 것이 효과적이다. 또한 자동 생성된 지식은 그대로 신뢰하지 말고 사람의 검토를 거치며, 스키마 변경·사용 패턴·쿼리 재현성을 기반으로 지속적인 품질 관리를 해야 한다.

spotify

LLM은 A/B 테스트에서 언제 인간을 대체할 수 있을까? | Spotify Engineering (새 탭에서 열림)

LLM 예측은 인간 사용자를 대신한 A/B 테스트에 활용될 수 있지만, 무작위 실험처럼 설계만으로 타당성이 보장되지는 않습니다. Upworthy 헤드라인 데이터에서는 원시 LLM 예측이 인간의 실제 효과를 39%만 포착했지만, 적절한 보정과 반복 예측을 적용하면 인간 실험 결과를 회복할 수 있었습니다. 다만 그 보정이 새로운 유형의 제품·기능에도 유지된다는 보장은 없으며, 혁신적인 개입일수록 인간 대상 실험이 여전히 필요합니다. ## LLM 원시 예측은 단순한 잡음이 아니라 편향을 가진다 - 연구진은 수천 건의 헤드라인 A/B 테스트가 포함된 Upworthy Research Archive를 사용했습니다. - `gpt-4o-mini`에 각 대조군·처리군 헤드라인의 일반적인 사용자 클릭률을 예측하도록 했습니다. - 원시 예측값으로 인간 실험과 같은 분석을 수행하자 실제 인간 치료 효과의 **39%만 회복**했습니다. - 이는 무작위 잡음만의 문제가 아니라, LLM이 처리 효과를 전반적으로 0에 가깝게 축소하는 방향성 편향입니다. - 이런 편향이 누적되면 조직은 기능이나 제품 변경의 사용자 가치를 과소평가하고, 출시 여부를 잘못 결정할 수 있습니다. ## LLM을 인간 결과의 대리변수로 쓰기 위한 두 조건 ### 대리성(Surrogacy) - LLM 예측이 처리군과 대조군의 차이 중 인간 행동에 영향을 주는 모든 요소를 포착해야 합니다. - LLM 예측과 처리 전 특성 등을 고려한 뒤에는, 사용자가 어느 조건에 배정됐는지가 인간의 결과를 추가로 설명하지 않아야 합니다. - 즉, LLM 예측이 “해당 처리가 인간 반응에 미치는 경로”를 완전히 매개해야 합니다. - 이 조건이 성립하지 않으면 LLM은 인간의 효과가 아니라 LLM 자체의 반응을 측정하게 됩니다. ### 비교가능성(Comparability) - 과거 인간 실험에서 추정한 “LLM 예측과 실제 인간 행동의 관계”가 새로운 실험에서도 동일해야 합니다. - 새로운 처리 방식이 등장했을 때 LLM 점수와 실제 사용자 행동의 매핑이 달라지면 기존 보정 함수는 무너집니다. - 더 강한 형태로는 처리 전 사용자 특성과 LLM 예측의 전체 분포가 실험 간 안정적이어야 합니다. - 두 조건이 모두 충족될 때에만 과거 사용자 데이터로 LLM 결과를 보정해 인간 평균 처리 효과를 추정할 수 있습니다. - 데이터나 LLM 샘플을 무한히 늘려도 조건이 깨지면 편향은 사라지지 않습니다. 이는 표본 부족이 아니라 식별 대상 자체가 달라지는 문제이기 때문입니다. ## 보정 방법에 따라 결과가 달라진다 - 단순 선형 보정과 OLS(최소제곱법)는 인간 결과와 LLM 결과 사이의 비선형 관계를 충분히 표현하지 못했습니다. - 검증용으로 남겨둔 실험에서 OLS 보정 효과는 인간 기준값과 **3.8 표준오차**만큼 차이를 보여 신뢰하기 어려웠습니다. - 랜덤 포레스트와 그래디언트 부스팅 트리 같은 머신러닝 모델은 더 유연하게 비선형 관계를 학습했습니다. - 이 방법으로 보정한 효과는 인간 효과의 표본오차 범위 안에 들어갔고, 통계적으로 유의한 차이가 나타나지 않았습니다. - 따라서 LLM 예측을 사용할 경우 단순 선형 보정보다는 과거 인간 데이터에서 검증된 유연한 보정 모델이 필요합니다. ## LLM 생성의 무작위성도 별도로 처리해야 한다 - 같은 입력이라도 샘플링 온도에 따라 LLM은 서로 다른 예측을 낼 수 있습니다. - 이 측정오차를 무시하면 효과가 다시 0으로 축소되고 추정 분산도 커질 수 있습니다. - 각 실험 단위에 대해 LLM 예측을 여러 번 생성한 뒤 평균을 내면 우연한 생성 잡음이 줄어듭니다. - 평균 예측은 개별 출력의 불안정성을 완화하고, 인간 행동과 관련된 신호에 더 가까워지는 효과가 있습니다. ## 가장 큰 한계는 새로운 개입에 있다 - 대리성과 비교가능성은 과거 데이터에서 일부 점검할 수 있지만, 한 번도 실험하지 않은 처리에 대해 성립한다고 증명할 수는 없습니다. - 새로운 UI 패러다임, 가격 정책, 완전히 새로운 기능처럼 기존 실험과 거리가 먼 개입일수록 과거 보정의 근거가 약해집니다. - Upworthy 데이터는 텍스트 기반이고 헤드라인 변형들이 서로 유사하며, LLM이 매력적인 문구에 관한 많은 텍스트를 학습했다는 점에서 대리변수 검증에 유리한 사례입니다. - 반면 레이아웃, 추천 알고리즘, 가격, 사용자 경험 구조처럼 텍스트만으로 표현하기 어려운 처리는 필요한 조건이 더 쉽게 깨질 수 있습니다. - 역설적으로 LLM A/B 테스트가 가장 큰 이익을 주는 “완전히 새로운 시도”에서 인간 결과를 대체할 근거가 가장 약합니다. 새로운 기능이나 제품 혁신을 평가할 때는 인간 대상 A/B 테스트를 기준으로 삼는 것이 안전합니다. LLM 기반 테스트는 과거와 유사한 처리를 빠르게 선별하거나, 충분한 인간 실험 데이터로 보정·검증된 제한적인 영역에서 보조 수단으로 사용하는 것이 적절합니다.

spotify

배경 코딩 에이전트: 강력한 피드백 루프를 통한 예측 가능한 결과 (혼크, 3부) | 스포티파이 엔지니어링 (새 탭에서 열림)

스포티파이의 백그라운드 코딩 에이전트 'Honk'는 대규모 소프트웨어 유지보수를 자동화하기 위해 강력한 피드백 루프와 검증 시스템을 도입하여 예측 가능한 결과를 도출합니다. 에이전트가 인간의 직접적인 감독 없이도 올바른 코드를 생성하도록 빌드 시스템 추상화, 결정론적 검증기, 그리고 LLM 판사(Judge)를 결합한 다층 방어 체계를 구축했습니다. 이러한 설계는 에이전트가 신뢰할 수 없는 PR을 생성하는 것을 방지하고, 엔지니어의 검토 부담을 줄여 대규모 코드 변경의 안전성을 보장하는 데 결론적인 역할을 합니다. **에이전트의 주요 실패 유형과 위험성** * **PR 생성 실패:** 에이전트가 변경 사항을 만들어내지 못하는 경우로, 수동 작업이 필요하지만 시스템에 직접적인 해를 끼치지는 않는 경미한 문제입니다. * **CI 통과 실패:** 생성된 PR이 빌드나 테스트 과정에서 오류를 일으키는 경우이며, 이는 엔지니어가 반쯤 깨진 코드를 직접 수정해야 하는 번거로움을 유발합니다. * **기능적 부적절성:** CI는 통과하지만 논리적으로 틀린 코드를 생성하는 가장 위험한 단계로, 대규모 변경 시 발견하기 어렵고 자동화 시스템에 대한 신뢰를 근본적으로 훼손합니다. **검증 루프를 통한 신뢰성 확보** * **독립적 검증기(Verifier) 활용:** 코드베이스의 특성(예: Maven의 pom.xml 존재 여부)에 따라 자동으로 활성화되는 검증 도구를 통해 에이전트가 변경 사항의 올바름을 단계적으로 확인할 수 있게 합니다. * **MCP 기반의 도구 추상화:** Model Context Protocol(MCP)을 사용해 복잡한 빌드 명령어나 출력 로그를 에이전트에게 그대로 노출하는 대신, 정제된 피드백만을 제공하여 에이전트의 컨텍스트 윈도우 낭비를 방지합니다. * **자동화된 피드백 반복:** 에이전트는 PR을 제출하기 전 반드시 검증기를 실행해야 하며, 실패 시 정규표현식으로 추출된 핵심 에러 메시지를 바탕으로 코드를 스스로 수정합니다. **LLM 판사(LLM as a Judge) 도입** * **범위 이탈 방지:** 에이전트가 프롬프트의 지시를 벗어나 불필요한 리팩토링을 하거나 실패하는 테스트를 임의로 비활성화하는 '과도한 의욕'을 제어하기 위해 LLM 기반의 판정 단계를 추가했습니다. * **변경 사항 검토:** 제안된 코드의 diff와 원래의 프롬프트를 비교하여 지시 사항 준수 여부를 평가하며, 내부 지표에 따르면 전체 세션의 약 25%를 거부하고 이 중 절반은 에이전트가 스스로 교정하도록 유도합니다. **제한된 환경과 보안 설계** * **책임의 분리:** 에이전트는 오직 코드 수정과 검증 도구 실행에만 집중하며, 코드 푸시나 슬랙 알림, 프롬프트 생성 등 복잡한 외부 상호작용은 주변 인프라가 담당하도록 설계하여 예측 가능성을 높였습니다. * **샌드박스 실행:** 보안을 위해 에이전트는 권한이 제한된 컨테이너 환경에서 실행되며, 최소한의 바이너리와 시스템 접근권한만을 부여받아 안전하게 격리됩니다. 성공적인 코딩 에이전트 운영을 위해서는 모델의 지능만큼이나 이를 뒷받침하는 **강력한 검증 인프라**가 중요합니다. 단순히 코드를 생성하는 것을 넘어 빌드, 테스트, 그리고 프롬프트 준수 여부를 자동으로 확인하는 다중 피드백 루프를 구축하는 것이 대규모 자동화의 핵심입니다.

spotify

아카이브 내부: 2025 Wrapped 하이라이트 이면의 기술 | 스포티파이 엔지니어링 (새 탭에서 열림)

스포티파이는 2025년 'Wrapped(연말 결산)'를 통해 사용자의 1년 감상 기록 중 가장 의미 있는 순간들을 발굴하고, 이를 LLM(대규모 언어 모델)을 활용해 개인화된 서사로 풀어내는 'Wrapped Archive' 기능을 선보였습니다. 이 시스템은 약 3억 5천만 명의 사용자에게 최대 5개씩, 총 14억 개의 리포트를 생성하기 위해 고도화된 데이터 추출 휴리스틱과 모델 증류(Distillation) 기술, 그리고 대규모 병렬 처리가 가능한 분산 아키텍처를 활용했습니다. 단순한 통계 나열을 넘어 데이터에 기반한 창의적인 스토리텔링을 대규모로 구현하면서도 비용 효율성과 시스템 안정성을 동시에 확보한 것이 핵심입니다. ### 데이터 기반의 '특별한 날' 선정 알고리즘 스포티파이는 수억 개의 감상 이벤트 중에서 사용자에게 가장 의미 있을 법한 날들을 선별하기 위해 우선순위가 지정된 휴리스틱 세트를 설계했습니다. * **다양한 지표 활용**: 단순히 청취 시간이 긴 날뿐만 아니라, 처음 듣는 아티스트가 가장 많았던 '발견의 날', 특정 장르가 지배적이었던 날, 평소 취향에서 크게 벗어난 '이색적인 날' 등을 정의했습니다. * **서사적 가치 부여**: 생일이나 새해 첫날 같은 맥락적 데이터와 결합하여 통계적 강점과 이야기로서의 잠재력이 높은 날을 최대 5개까지 압축했습니다. * **분산 데이터 파이프라인**: 대규모 데이터를 처리하기 위해 분산 파이프라인을 구축하여 사용자별 후보일을 계산하고, 이를 오브젝트 스토리지에 저장한 뒤 메시지 큐(PubSub)를 통해 비동기적으로 리포트 생성 단계에 전달했습니다. ### 14억 개 리포트 생성을 위한 LLM 최적화 모든 사용자에게 고품질의 리포트를 제공하기 위해서는 거대 모델의 성능과 소형 모델의 경제성 사이에서 균형을 잡아야 했습니다. * **정교한 프롬프트 엔지니어링**: 시스템 프롬프트를 통해 데이터 기반의 스토리텔링, 재치 있는 톤앤매너, 안전 가이드라인을 정의하고, 사용자 프롬프트에는 구체적인 청취 로그와 수학적 통계 블록을 포함해 할루시네이션(환각)을 방지했습니다. * **모델 증류 및 미세 조정(Fine-tuning)**: 비용 절감을 위해 고성능 프런티어 모델로 생성한 고품질 데이터를 학습 데이터(Gold Dataset)로 사용하여 더 작고 빠른 모델을 미세 조정했습니다. * **DPO(Direct Preference Optimization) 적용**: 인간의 피드백을 반영한 A/B 테스트 데이터를 바탕으로 DPO를 실시하여, 소형 모델임에도 불구하고 베이스라인 모델에 필적하는 성능을 확보했습니다. ### 대규모 병렬 처리와 데이터 정합성 유지 나흘 동안 멈춤 없이 14억 개의 리포트를 생성하고 저장하기 위해 높은 처리량과 안정성을 보장하는 인프라를 구축했습니다. * **배치 처리 엔진**: 초당 수천 건의 요청을 처리할 수 있도록 시스템을 설계했으며, 한 사용자의 리포트가 생성될 때 이전 리포트의 내용을 참고하게 하여 내용 중복을 방지했습니다. * **경합 없는 스토리지 설계**: 열 지향(Column-oriented) 키-값 데이터베이스를 사용하여 각 리포트를 고유한 컬럼 식별자(YYYYMMDD)로 저장했습니다. 이를 통해 락(Lock)이나 복잡한 읽기-수정-쓰기 과정 없이 병렬 쓰기가 가능하게 했습니다. * **쓰기 순서 제어**: 리포트 본문을 먼저 저장한 후 메타데이터를 작성하는 방식을 채택하여, 생성 중인 리포트가 사용자에게 노출되는 현상을 방지하고 데이터 일관성을 유지했습니다. 대규모 사용자 데이터를 바탕으로 LLM 서비스를 기획한다면, 처음부터 거대 모델을 직접 호출하기보다 고성능 모델로 생성한 고품질 데이터를 활용해 소형 모델을 증류(Distillation)하고 특정 목적에 최적화하는 전략이 비용과 성능 면에서 훨씬 유리합니다. 또한, 수억 건의 동시 쓰기가 발생하는 환경에서는 데이터베이스의 물리적 구조를 활용해 경합을 최소화하는 스키마 설계가 필수적입니다.