huny.log

기술 포스트 · AI·LLM

광고 크리에이티브 피로도(creative fatigue), 임베딩으로 미리 잡기

같은 광고를 3주째 돌리는데 CTR이 슬슬 빠집니다. 언제 갈아치워야 할까. 이미지·텍스트 임베딩으로 "기존 자산과 다른 새 후보"를 자동 추천하는 운영 워크플로우.

“같은 광고 3주째 돌리니까 CTR이 1.8 → 1.1로 빠졌어요. 갈아치울까요?” — 매주 한 번쯤 받는 질문. 갈아치우는 건 쉽지만 “무엇으로?”가 어려워요. 새 크리에이티브 후보가 기존과 비슷하면 또 같은 함정에 빠집니다. 이 글은 이미지·텍스트 임베딩으로 피로도를 정량화하고, “기존 자산과 가장 다른 신선한 후보”를 자동 추천하는 운영 파이프라인입니다.

누적 노출에 따라 CTR이 감소하는 fatigue 곡선과 임베딩 거리 기반 신선도 지표
누적 노출이 같은 사람에게 7~10번 도달하면 CTR이 절반 가까이 빠진다(피로도). 새 후보의 임베딩이 기존 자산과 멀수록 reset 효과가 크다.

피로도(creative fatigue)는 진짜 있는 현상인가

네, 거의 모든 디지털 광고에서 측정 가능한 패턴이에요. 한 사람한테 같은 광고가 반복 노출되면 CTR/CVR이 떨어집니다. Meta는 “Frequency 7 이상에서 CTR -40%” 같은 자체 리포트를 분기마다 발표하고, Google도 비슷한 패턴을 인정해요.

기본 메커니즘:

  1. 주의 감소 — 본 적 있는 광고는 시각적으로 더 빨리 스킵됨
  2. 매력 감소 — “이미 지나간 카피”로 인식
  3. 광고 회피 학습 — 그 채널에서 광고 자체를 안 봄

대시보드에서는 보통 frequency(평균 노출 횟수)를 같이 보면 진단됩니다. CTR이 빠지는데 frequency가 5 이상으로 올라갔다면 99% 피로도예요.

# 기본 진단 — frequency vs CTR 분포
import pandas as pd
import numpy as np
df = pd.read_csv("ad_performance_daily.csv")
# 컬럼: ad_id, date, impressions, clicks, reach, ctr, frequency
# frequency 구간별 평균 CTR
df["freq_bucket"] = pd.cut(df["frequency"], bins=[0, 1.5, 3, 5, 7, 100])
print(df.groupby("freq_bucket")["ctr"].mean())

피로도 지표의 정의 — fatigue score

단순한 CTR-vs-시간 회귀가 한 변수예요. 더 좋은 정의는 예상 CTR(첫 1주 평균) 대비 현재 CTR의 비율:

실무 임계:

fatigue score상태권장 액션
0.0 ~ 0.1신선유지
0.1 ~ 0.3주의새 변형 1개 준비
0.3 ~ 0.5피로신선한 후보로 교체 시작
0.5 ~강한 피로즉시 교체, 학습 분배 재시작

임베딩으로 “신선함”을 정량화

피로도를 잡는 건 분석이고, 진짜 어려운 건 “무엇으로 갈아치울까”예요. 새 후보가 기존 자산과 너무 비슷하면 또 빨리 피로해집니다. 이걸 잡는 게 임베딩 기반 신선도(novelty) 점수.

광고 자산을 벡터로 만들기

광고 = 이미지 + 카피 텍스트. 둘 다 임베딩 가능.

각 광고 자산은 이미지 벡터(768차원) + 텍스트 벡터(1536차원)로 표현됩니다. 둘을 concat하거나 평균내서 단일 벡터로 만들어요.

Novelty score = 기존 자산과의 평균 거리

신선도 점수의 정의는 단순:

  • = 지난 90일 운영 자산 풀
  • 점수가 1에 가까울수록 기존과 다름, 0에 가까울수록 비슷함

새 후보 5개를 점수로 줄세우면 다음과 같아요.

후보Novelty해석
후보 10.412신선
후보 20.388신선
후보 30.291기존과 비슷 ⚠️ — fatigue reset 효과 약함
후보 40.367적당
후보 50.435가장 신선 ✅

이 점수만 보면 후보 5번이 가장 신선해서 fatigue reset 효과가 클 거예요. 단, novelty가 너무 높으면 “브랜드 톤 이탈”일 수도 있으니 다음 항목과 함께 봅니다.

종합 점수 — Novelty × Brand-fit × 예상 CTR

세 점수의 가중합이 최종 후보 선정 기준이에요.

기본 가중치는 정도. 도메인에 따라 튜닝.

후보NoveltyBrand-fit예상 CTR종합 score순위
50.4350.662.100.6601
10.4120.781.800.6242
40.3670.851.700.6093
20.3880.821.600.5824
30.2910.911.400.5085

후보 5번이 가장 점수 높아 다음 캠페인 후보 1순위로 추천됩니다. 단, brand_fit이 0.66으로 다른 후보보다 낮으니 마지막에 사람 검수 한 번 거치는 룰. 자동 추천 + 사람 마지막 검수가 운영 안전성의 핵심.

실무 워크플로우 — 매주 한 번 돌리는 잡

1) 매주 월요일 새벽

  • 운영 중인 광고들의 fatigue score 계산
  • fatigue ≥ 0.3인 광고를 “교체 대상 리스트”에 적재

2) 후보 풀 임베딩 갱신

  • 디자인팀이 만든 새 자산 + LLM이 생성한 카피 후보를 모두 임베딩
  • 기존 90일 운영 자산 임베딩 캐시 갱신

3) 추천 알고리즘 실행

  • 교체 대상별로 최적 후보 3~5개 추천 (novelty × brand_fit × pred_ctr)
  • 슬랙 봇으로 운영자에게 알림

4) 운영자 검수 + 광고 매니저 업로드

  • 사람이 마지막 검수 (정책·브랜드 톤 확인)
  • 광고 매니저에 새 자산 활성화 + 기존 자산 비활성화

이 4단계를 자동화하면 운영자가 “이 광고 갈아치울 때 됐는데 뭘로?”를 매주 직접 고민할 필요가 없어져요.

운영 팁 — 자주 부딪히는 것들

1) Frequency cap이 우선

피로도의 1차 원인은 “같은 사람에게 너무 자주 노출”. fatigue score를 보기 전에 frequency cap(예: 주당 5회 이하)을 먼저 거는 게 더 큰 효과.

2) 브랜드 자산 임베딩 캐시

브랜드 가이드라인 평균 벡터는 분기에 한 번만 갱신해도 충분. 매주 다시 계산할 필요 없음.

3) 일찍 피로해지는 자산 패턴

도메인별로 다르지만 자주 보이는 패턴:

  • 단순한 “세일 / 할인” 메시지”는 평균 fatigue 가속도가 빠름
  • 스토리형 카피는 fatigue가 느리지만 첫 주 CTR이 낮은 편 (slow burner)
  • 사람 얼굴이 들어간 광고가 일러스트보다 fatigue 빠름 (시각적 특이성 부족 시)

4) Cross-platform 피로도

같은 사용자가 인스타·페이스북·메신저에서 같은 광고를 본다면 frequency가 합산돼야 합니다. Meta Ads는 “Account-level frequency”로 통합 측정 가능. 안 켜져 있으면 켜세요.

마치며

크리에이티브의 신선함은 직관의 영역이었지만, 임베딩 시대에는 벡터 공간의 거리로 정량화됩니다. fatigue score + novelty score 두 개를 운영 대시보드에 넣고, 매주 자동 추천을 돌리면 운영자의 일이 “피로한 광고 찾기”가 아니라 “추천된 후보 검수하기”로 바뀝니다. 같은 인력으로 더 많은 캠페인을 돌릴 수 있는 가장 큰 레버 중 하나예요.

다음 글에서는 마케터 보고서에 자주 숨는 통계적 함정 — Simpson’s Paradox를 다뤄볼게요.

참고

AI·LLM 카테고리의 다른 글

전체 보기 →