안녕하세요 주간SaaS 입니다. 오늘은 Spotify가 과거 성과 데이터를 바탕으로, 자연어 상호작용을 통해 최적화된 미디어 광고 플랜을 생성할 수 있도록 지원하는 에이전트를 구축한 이야기를 소개 합니다. 단순한 AI 기능을 출시하는것이 아니라 구조적인 변화를 통하여 복잡한 기존의 비즈니스 프로세스/로직을 에이전틱 기반의 시스템으로 전환한 좋은 사례라고 생각 됩니다.
서론
이 프로젝트를 처음 시작할 때, 우리의 목표는 단순히 하나의 "AI 기능"을 출시하는 것이 아니었습니다. 우리는 소프트웨어 상에서 광고 비즈니스가 실제로 운영되는 방식의 구조적인 문제를 해결하고자 했습니다.
비즈니스 측면에서 보면, 스포티파이에는 다이렉트(Direct), 셀프서비스(Self‑Serve), 프로그래매틱(Programmatic) 등 여러 구매 방식이 존재하며, 이들은 대부분 하나로 통합된 백엔드 위에서 작동합니다. 인프라는 공유되지만, 그 동작 방식은 그렇지 않습니다. 각 구매 채널은 고유한 워크플로우와 의사결정 로직, 그리고 저마다의 "성공적인 기준"을 가지고 있습니다. 엔지니어링 측면에서 이는 "서로 다른 스택"이라기보다는, 하나의 몸체에 "서로 다른 뇌"가 연결되어 있는 형태에 가깝습니다.
- 하나의 서비스 및 데이터 세트가 여러 구매 경험을 지원함
- 약간씩 다른 규칙과 휴리스틱(heuristics)이 인코딩된 채널별 흐름
- 다양한 서피스(surface)별 자동화 도구(스포티파이 광고 관리자, 세일즈포스, 슬랙, 내부 도구 등)가 중복되는 문제를 조금씩 다른 방식으로 해결함
- 동일한 계획/최적화 문제의 변형인 "소규모 워크플로우 수정"이 끊임없이 발생하지만, 이를 여러 곳에서 각각 구현하고 유지 관리해야 함
따라서 서비스를 통합하기 위한 노력을 기울였음에도 불구하고, 워크플로우 레이어에서는 여전히 파편화된 동작이 발생했습니다. 예산 배분 방식, 인벤토리 선택 방식, 도달 범위(reach)와 효율성 및 STR(Sell-Through Rate) 간의 균형 조절 방식 등 핵심적인 의사결정이 채널 및 서피스별로 중복 구현되었습니다. 시간이 지나면서 이 로직들은 서로 어긋나기 시작했습니다.
이런 상황에서 일반적인 해결책은 익숙할 것입니다. 새로운 서비스를 설계하고, 캠페인 계획 및 관리를 위한 "올바른" 상태 머신(state machine)을 정의한 다음, 몇 개의 REST 엔드포인트를 추가하고 이를 UI에 연결하면 끝입니다.
문제는 이러한 방식이 더 이상 우리 업무의 형태와 맞지 않는다는 점입니다.
- 워크플로우가 조합적(Combinatorial)입니다. 계획, 예측, 오디언스 선택, 크리에이티브 가이드라인, 페이싱(pacing), 최적화 등은 모두 사용자, 사용 가능한 인벤토리, 비즈니스 우선순위, 광고주의 목표가 누구냐에 따라 달라집니다. 채널당 몇 개의 하드코딩된 "해피 패스(happy paths)"만으로는 변화하는 환경을 감당할 수 없습니다.
- 동일한 의사결정이 모든 곳에 반영되어야 합니다. 예산을 배분하거나 인벤토리 우선순위를 지정하는 더 나은 방식을 결정했다면, 이는 스포티파이 광고 관리자(Spotify Ads Manager) 추천, 세일즈포스(Salesforce) 계획, 슬랙(Slack) 워크플로우에 일관되게 나타나야 합니다. 동일한 의사결정 로직을 세 번이나 따로 구현하는 것은 기술 부채와 불일치하는 동작을 유발하는 지름길입니다.
- 우리에게는 '의도 레이어(Intent Layer)'가 부족합니다. 현재의 시스템은 '수행'하는 일(라인 아이템 생성, 예측 실행, 인사이트 조회)은 잘합니다. 하지만 "브라질에서의 도달 범위를 극대화하고, 비디오 인벤토리를 보호하면서, 여전히 STR을 달성하라"와 같은 목표를 수락하여, 이를 모든 채널에서 동일하게 작동하는 일련의 도구 호출, 트레이드오프(tradeoff) 조율 및 검증 과정으로 변환하는 일은 잘하지 못합니다.
즉, 핵심 문제는 "새로운 백엔드가 필요하다"가 아니었습니다. 진짜 문제는 다음과 같았습니다:
"구매 채널과 서피스 전반에 걸쳐 일관되게 광고주의 목표를 이해하고, 공유된 신호를 기반으로 추론하며, 사용자를 대신해 기존 광고 API를 오케스트레이션할 수 있는 '통합된 프로그래밍 가능 의사결정 레이어'가 없다."
그렇다고 해서 반대편 극단으로 치달아 거대한 규칙 엔진(rules engine)을 만들고 싶지도 않았습니다. 우리의 광고 로직은 복잡하고 확률적이며 끊임없이 변화합니다. 예측, 최적화, 인사이트는 이미 머신러닝(ML)에 크게 의존하고 있습니다. 이 모든 것을 정적인 의사결정 트리(decision tree)로 고정해 버리면 금방 취약해질 것이고 유지 관리하기도 고통스러울 것입니다.
바로 이러한 공백 때문에 우리는 에이전트 기반(agentic) 접근 방식에 베팅하기로 결정했습니다.
우리는 다음과 같은 기존 방식 대신:
- 채널별로 결정론적인 워크플로우를 더 많이 하드코딩하기
- 각 개별 서비스나 서피스 내부에 오케스트레이션 로직을 파묻어 두기
- 스포티파이 광고 관리자, 세일즈포스, 슬랙 및 향후 도입될 플랫폼에 "스마트한" 동작을 중복 구현하기
캠페인 계획 및 관리를 다음과 같이 작동하는 일련의 모듈형 에이전트 세트로 취급합니다:
- 동일한 기본 신호(인벤토리, 오디언스, STR, 품질/리스크, 성과 이력)를 소비함
- 광고주의 목표와 스포티파이의 비즈니스 제약 조건을 함께 최적화함
- 기능을 처음부터 다시 구현하는 대신 기존 광고 서비스를 *도구(tools)*로 사용함
우리 조직에 있어서 이것은 새로운 영역입니다. 지금까지의 AI 작업은 대부분 "엔드포인트 뒤에 모델을 배치"하거나 "UI에 프롬프트 기반의 헬퍼를 추가"하는 수준이었습니다. 하지만 여기서 다루는 내용은 다음과 같습니다.
- 전문화된 에이전트에게 작업을 위임하는 장기 실행(long-running) 오케스트레이션 레이어
- 콘텍스트와 평가 로직을 공유하는 에이전트들
- 중복되는 워크플로우의 짜깁기 대신, 동일한 의사결정 엔진을 바탕으로 모든 구매 채널과 서피스에 전력을 공급할 수 있는 단일 에이전트 플랫폼
이는 "워크플로우가 포함된 백엔드 서비스 하나 더 추가하기"와는 완전히 다른 멘탈 모델입니다. 이를 통해 우리는 다음과 같은 관점으로 생각할 수밖에 없게 되었습니다.
- 단순한 CRUD가 아닌 에이전트를 위한 도구로 설계된 API
- 단위 및 통합 테스트뿐만 아니라 행동 평가(behavioral evaluation)로서의 테스트
- 단순히 p95 지연 시간이나 에러 버짓(error budgets)이 아닌 "에이전트가 무엇을 왜 결정했는가?"를 확인하는 관측 가능성(Observability)
- 단순한 입력값 검증(input validation)을 넘어 반자율적 의사결정에 대한 가드레일로서의 안전성
우리가 이 모험에 나선 이유는 대안이 너무나 명확하기 때문입니다. 그렇지 않으면 새로운 곳에서 계획이나 최적화를 개선할 때마다 복잡성, 조율 비용, 중복 로직이 계속해서 증가할 것입니다. 에이전트 플랫폼을 사용하면 의사결정을 단 한 번만 중앙화하고, 우리가 이미 보유한 통합 백엔드 위에서 이를 모든 곳으로 투사할 수 있으므로, 제품이 진화하더라도 마침내 워크플로우를 하나로 수렴시킬 수 있습니다.
그다음 질문은 "이것을 어디서 먼저 검증할 것인가?"였습니다.
우리는 첫 번째 유즈케이스로 미디어 플래닝(Media Planning)을 선택했습니다. 이곳은 세일즈, 광고주, 인벤토리, 페이싱, 광고 상품 등 이 모든 복잡성이 한 번에 나타나는 지점이기 때문입니다. 또한 라이프사이클의 초기 단계이므로 여기서 의사결정을 올바르게 내리면 다운스트림의 모든 단계(부킹, 트래픽 처리, 전달, 최적화)가 이점을 누리게 됩니다.
다음 섹션에서는 미디어 플래닝을 에이전트 워크플로우로 전환한 방법, 즉 플래너의 업무를 도구와 기능으로 분해한 방법, 에이전트가 제약 조건을 추론하는 방법, 그리고 기존 시스템을 갈아엎지 않고 이를 어떻게 연동했는지 자세히 살펴보겠습니다.
Ads AI는 구글의 에이전트 개발 키트(ADK)와 Vertex AI를 활용하여 광고주가 스포티파이에서 미디어 플랜을 생성하는 방식을 혁신하는 AI 기반 광고 플랫폼입니다. 복잡한 미디어 플래닝 워크플로우를 병렬로 작동하는 전문 AI 에이전트로 분해함으로써, 자연어로 된 캠페인 요구사항을 이해하고 단 몇 초 만에 최적화된 데이터 기반 미디어 플랜을 생성할 수 있는 시스템을 구축했습니다.
목표: 과거 성과 데이터를 바탕으로, 자연어 상호작용을 통해 광고주가 최적화된 미디어 플랜을 생성할 수 있도록 지원하는 지능형 대화형 인터페이스를 구축합니다.
핵심 요약: 병렬 실행을 지원하는 멀티 에이전트 아키텍처는 개발자 경험과 시스템 성능을 동시에 향상시키면서 복잡한 도메인 문제를 극적으로 단순화할 수 있습니다.
도전 과제
광고 캠페인을 위한 미디어 플래닝에는 다음과 같이 서로 연결된 여러 의사결정이 포함됩니다.
- 목표 정의: 광고주가 달성하고자 하는 것은 무엇인가? (브랜드 인지도, 웹사이트 트래픽, 앱 설치 등)
- 오디언스 타겟팅: 누가 광고를 보아야 하는가? (인구통계학적 특성, 관심사, 지리적 위치)
- 예산 배분: 광고 세트 전반에 걸쳐 예산을 어떻게 분배해야 하는가?
- 일정 계획: 캠페인은 언제 실행되어야 하는가?
- 형식 선택: 어떤 광고 형식(오디오, 비디오, 디스플레이)이 가장 효과적인가?
기존 방식에서는 광고주가 이러한 각 차원을 수동으로 구성해야 했으며, 유사한 캠페인에서 과거에 어떤 구성이 효과적이었는지에 대한 인사이트를 얻지 못하는 경우가 많았습니다.
불편 사항 (Pain points):
- 복잡한 UI 흐름: 작성해야 할 여러 개의 화면과 양식
- 최적화 가이드 부재: 광고주가 최적의 구성을 감으로 짐작해야 했음
- 느린 반복 주기: 다른 접근 방식을 테스트하려면 처음부터 다시 시작해야 했음
- 지식 공백: 과거 성과 데이터에 쉽게 접근할 수 없었음
해결책: 접근 방식 및 구현
설계 및 아키텍처

우리는 전문화된 AI 에이전트들이 미디어 플래닝의 각기 다른 측면을 처리하는 멀티 에이전트 아키텍처를 선택했습니다. 이 접근 방식은 다음과 같은 몇 가지 장점을 제공합니다.
- 관심사 분리: 각 에이전트는 집중해야 할 고유의 책임과 최적화된 프롬프트를 가집니다.
- 병렬 실행: 독립적인 에이전트들이 동시에 실행될 수 있습니다.
- 테스트 가능성: 개별 에이전트를 격리된 환경에서 테스트하고 개선할 수 있습니다.
- 유연성: 새로운 기능이 필요할 때 새로운 에이전트로 추가할 수 있습니다.
| 컴포넌트 (Component) | 기술 (Technology) | 목적 (Purpose) |
| 에이전트 프레임워크 | Google ADK 0.2.0 | 에이전트 오케스트레이션, 세션 관리 및 도구 통합 제공 |
| LLM 백엔드 | Vertex AI (Gemini 2.5 Pro) | 자연어 이해 및 생성 지원 |
| API 레이어 | gRPC | 고성능의 강력한 타입 지정을 지원하는 서비스 간 통신 |
| 세션 스토리지 | Google Cloud | 대화 전반에 걸친 지속적인 세션 상태 유지 |
| 성과 데이터 | PostgreSQL + 인메모리 캐시 | 최적화를 위한 과거 캠페인 성과 데이터 |
| 서비스 프레임워크 | Apollo (Spotify) | 서비스 라이프사이클, 구성 및 관측 가능성(observability) 관리 |
구현 세부 사항 및 에이전트 구성 요소 분석
Agent 구조
1. RouterAgent - 트래픽 컨트롤러
RouterAgent는 사용자가 입력한 메시지를 분석하여 어떤 정보가 포함되어 있는지 판단합니다.

이 빠른 라우팅 단계 덕분에 불불요한 LLM 호출을 방지하고 조건별 에이전트 실행이 가능해집니다.
2. 전문 레졸루션 에이전트
각 레졸루션 에이전트는 집중된 책임을 집니다.
- GoalResolverAgent: 각 에이전트는 집중해야 할 고유의 책임과 최적화된 프롬프트를 가집니다.
- AudienceResolverAgent: 독립적인 에이전트들이 동시에 실행될 수 있습니다.
- BudgetAgent: 개별 에이전트를 격리된 환경에서 테스트하고 개선할 수 있습니다.
- ScheduleAgent: 새로운 기능이 필요할 때 새로운 에이전트로 추가할 수 있습니다.
3. MediaPlannerAgent - 최적화 엔진
MediaPlannerAgent는 마법이 일어나는 곳입니다. 해결된 모든 정보를 가져와 과거 성과 데이터가 지원하는 휴리스틱 기반 엔진을 통해 최적화된 광고 세트 추천안을 생성합니다.
주요 최적화 규칙:
- 비용 최적화: 과거 중앙값 대비 비용 지표(CPM, CPC, CPI)를 최소화합니다.
- 전달률 최적화: 전달률(delivery rate)이 100%에 가까운 캠페인을 타겟팅합니다.
- 예산 매칭: 유사한 예산 범위를 가진 과거 성공적인 캠페인을 찾습니다.
- 기간 매칭: 캠페인 기간을 성과가 입증된 기존 사례와 매칭합니다.
- 타겟팅 매칭: 인구통계학 및 관심사 중첩도를 기반으로 점수를 매깁니다.
- 고유한 형식/목표 조합: 추천안의 다양성을 확보합니다.
- 예산 기반 스케일링: 예산 규모에 따라 추천 수량을 자동으로 조정합니다:
- €0 - 1,000: 추천 1개
- €1,000 - 5,000: 추천 2개
- €5,000 - 15,000: 추천 3개
- €15,000 이상: 추천 4~5개
함수 호출(Function Calling)을 통한 도구 통합
우리는 구글 ADK의 FunctionTool을 활용하여 에이전트가 실제 데이터에 접근할 수 있도록 합니다.

@Schema 어노테이션은 LLM에게 도구 파라미터에 대한 구조화된 정보를 제공합니다.

일관된 출력을 위한 프롬프트 엔지니어링
LLM이 일관되고 파싱 가능한 출력을 생성하도록 만드는 것은 어려운 과제입니다. 우리는 엄격한 프롬프트 가드레일을 개발했습니다.

고려된 트레이드오프(Trade-offs):
- 단일 에이전트 vs 멀티 에이전트: 단일 에이전트가 모든 것을 처리할 수도 있지만, 프롬프트가 거대해지고 병렬 처리가 불가능해집니다. 멀티 에이전트는 복잡성을 더하지만 지연 시간(latency)과 유지 보수성을 개선합니다.
- 인메모리 캐시 vs 데이터베이스 캐시: 지연 시간을 최소화하기 위해 과거 데이터에 대해 인메모리 캐시를 선택했습니다. 메모리 사용량이라는 트레이드오프가 있지만, 캠페인 성과 데이터는 크기가 제한되어 있으며 주기적으로 리프레시됩니다.
- 동기식 vs 스트리밍: 초기에는 단순성을 위해 동기식 응답 방식을 선택했습니다. 스트리밍 방식은 더 긴 작업에서 더 나은 사용자 경험(UX)을 제공할 수 있습니다.
결과 및 임팩트
성능 지표 (Performance Metrics)
| 지표 (Metric) | 기존 수동 방식 (Manual) | 에이전트 기반 방식 (Agentic) |
| 미디어 플랜 생성 시간 | 15~30분 (수동 작업) | 5~10초 |
| 필요한 사용자 입력 | 20개 이상의 양식 필드 | 1~3개의 자연어 메시지 |
| 사용된 최적화 데이터 | 없음 (인간의 직관에 의존) | 수천 개 캠페인의 과거 성과 데이터 |
| 에이전트 응답 지연 시간 | 해당 없음 (N/A) | 병렬 실행 시 약 3~5초 |
전반적인 임팩트 (Overall Impact)
- 인지 부하 감소: 광고주가 자연어로 캠페인을 설명할 수 있음
- 데이터 기반 의사결정: 모든 추천안이 과거 성과 데이터를 기반으로 뒷받침됨
- 더 빠른 반복 프로세스: 광고주가 대화를 이어가며 계획을 정교하게 다듬을 수 있음
- 전문 지식의 민주화: 최적화 지식이 시스템 내부에 내재화됨
교훈 및 향후 과제
주요 교훈 (Key Learnings)
- 주요 교훈 1: 프롬프트 엔지니어링은 소프트웨어 엔지니어링입니다. 프롬프트를 버전 관리, 테스트, 반복 주기를 거치는 '코드'로 취급하는 것이 필수적이었습니다. 프롬프트 문구의 아주 작은 변화도 출력의 일관성에 극적인 영향을 미칠 수 있습니다. 우리는 출력 형식 요구사항을 명시적으로 작성하고, 구체적인 예시를 제공하며, 프롬프트와 파싱 레이어 모두에 가드레일을 구축하는 법을 배웠습니다.
- 주요 교훈 2: 에이전트 간의 경계 설정이 중요합니다. 에이전트 간의 명확한 경계를 설정하는 것이 핵심입니다. 에이전트가 너무 많으면 지연 시간과 조율 오버헤드가 증가합니다. 반면 너무 적으면 모놀리식하고 유지 관리하기 어려운 프롬프트가 만들어집니다. 우리의 기본 원칙은 '하나의 고유한 기술 또는 데이터 소스당 하나의 에이전트'를 배정하는 것이었습니다.
- 주요 교훈 3: 도구는 그라운딩(grounding)을 가능하게 합니다. LLM은 강력하지만 할루시네이션(환각 현상)을 일으킬 수 있습니다. 에이전트에게 실제 데이터(지리적 타겟, 광고 카테고리, 과거 성과)에 접근할 수 있는 도구를 제공함으로써, 출력을 현실에 기반하도록 만들 수 있습니다. LLM은 '무엇을 할지' 추론하고, 도구는 작업에 필요한 '정확한 데이터'를 제공합니다.
향후 과제 (Future Work)
- 스트리밍 응답: 에이전트가 처리하는 동안 실시간 피드백을 제공하기 위해 서버 전송 이벤트(SSE, Server-Sent Events)를 구현합니다.
- 멀티 턴 정교화: 반복적인 계획 수정("빈번한 데이터 평가 주기")을 더 잘 지원합니다.
- A/B 테스트 통합: AI가 추천한 계획을 베이스라인(기준점)과 자동으로 비교 테스트합니다.
- 에이전트 기능 확장: 크리에이티브 제안, 경쟁사 분석, 크로스 캠페인 최적화 등을 포함합니다.
- 파인 튜닝된 모델: 광고 전문 용어에 특화된 도메인별 모델 파인 튜닝을 진행합니다.
결론
Ads AI를 구축하면서 우리는 복잡하고 여러 단계로 이루어진 워크플로우가 멀티 에이전트 아키텍처에 매우 잘 맞는다는 것을 배웠습니다. 미디어 플래닝 문제를 집중된 프롬프트, 관련 도구, 명확한 책임을 가진 전문 에이전트들로 분해함으로써 강력하면서도 유지 관리가 용이한 시스템을 만들 수 있었습니다.
에이전트 오케스트레이션을 위한 구글의 ADK, LLM 기능을 위한 Vertex AI, 그리고 우리의 과거 성과 데이터의 결합은 광고주가 원하는 것을 이해할 뿐만 아니라, '실제로 무엇이 효과가 있는지'까지 아는 시스템을 탄생시켰습니다.
우리는 앞으로도 Ads AI를 계속 발전시키고 스포티파이의 더 많은 광고 워크플로우에 AI 기반 최적화 기술을 도입할 수 있게 되어 매우 기쁩니다.
의견을 남겨주세요