Topics API를 통한 관심 기반 광고

의견 보내기

Topics API 정보

모바일 광고에서 광고주는 사용자의 관심분야와 관련된 광고를 게재하려고 합니다. 예를 들어 요리와 관련된 정보에 관심이 있는 사용자는 관심분야와 관련 없는 광고보다 요리 관련 광고가 더 관련성이 높다고 생각할 수 있습니다.

관심 기반 광고(IBA)는 사용자가 이전에 참여한 앱에서 파생된 관심분야를 기반으로 사용자를 위한 광고를 선택하는 개인 맞춤 광고의 한 형태입니다. 이는 현재 조회 중인 콘텐츠에서 파생된 관심분야만 기반으로 하는 문맥 광고와는 다릅니다. 문맥 광고보다 IBA가 좋은 점 중 하나는 IBA를 통해 앱에서 사용자에게 더 관련성 높고 흥미로운 광고를 표시할 수 있다는 것입니다.

Topics API는 사용자의 앱 사용을 기반으로 기기 내에서 대략적인 관심분야 신호를 추론합니다. 주제라고 하는 이러한 신호는 광고주와 공유되므로 전체 앱에서 개별 사용자를 추적하지 않고도 IBA 사용 사례를 지원합니다.

주요 개념

  • 주제는 이 사용자를 위한, 사람이 읽을 수 있는 관심 주제이며 주제 분류의 일부입니다.
  • 호출자가 지난 3 에포크 동안 이 주제와 연결된 앱에서 Topics API 요청을 보낸 경우 주제는 호출자(앱 또는 앱에서 사용된 서드 파티 SDK)가 관찰합니다.
  • 에포크는 주제 계산 기간(예: 1주일)입니다.

작동 방식

이 제안서에서 Topics API의 목적은 사용자의 앱 사용에 따라 관심 있는 대략적인 광고 주제를 호출자에게 제공하는 것입니다. 이러한 주제는 광고를 표시하려는 앱과 관련된 문맥 정보를 보완하는 데 사용할 수 있으며 사용자에게 적합한 광고를 찾는 데 도움이 되도록 결합될 수 있습니다.

관심 기반 광고를 위해 주제를 가져오는 기능을 설정하는 방법을 보여주는 코드 예시는 Topics API 개발자 가이드를 참고하세요. 참고: API는 아직 완료되지 않았습니다.

주제는 사전 정의된 오픈소스 분류에서 선택합니다.

플랫폼에서는 분류 기준 모델을 사용하여 주제를 추론합니다. Topics API 구현과 분류 기준 사용은 Android 오픈소스 프로젝트의 일부이며 시간이 지남에 따라 개선됩니다.

예시로 다음 코드는 주제를 사용하여 관심 기반 광고를 가져오는 방법을 보여줍니다. 여기에 사용된 API는 최종 버전이 아닙니다.

// Initialize the Topics API.
…
topicsFuture = AdvertisingTopicsClient.getTopics();

// Retrieve Topics and use them in Ad request.
Futures.addCallback(
    topicsFuture,
    new FutureCallback<AdvertisingTopicsInfo>() {
        @Override
        public void onSuccess(@Nullable AdvertisingTopicsInfo topicsInfo) {
            // Sanitize Topics result.
            ...
            // Initialize ad request with Topics obtained.
            AdRequest adRequest = AdRequest.initialize(topicsInfo);
        }

        @Override
        public void onFailure(Throwable t) {
            // Handle error.
            ...
        }
});

분류 기준 모델의 작동 방식을 잘 이해하려면 Android Topics Classifier Colab을 사용하여 시스템에서 여러 앱 데이터가 반응하는 방식을 테스트해 보세요.

Topics API에 액세스

광고 기술 플랫폼은 Topics API에 액세스할 수 있도록 등록해야 합니다. 자세한 내용은 개인 정보 보호 샌드박스 계정 등록을 참고하세요.

세부정보

  • 각 에포크에 한 번(예: 일주일에 한 번) 사용자의 상위 5개 주제가 기기 내 정보를 사용하여 계산됩니다.

    • Topics API가 호출되면 플랫폼은 API를 호출하는 앱에 주제가 할당되었는지 확인합니다. 할당된 주제가 없으면 한 주제가 다음과 같이 선택되고 선택된 주제는 이 에포크의 나머지 기간 동안 이 앱에 할당됩니다.
      • 95%의 확률로 주제는 이 에포크 동안 계산된 상위 5개 주제 목록에서 무작위로 선택됩니다.
      • 5%의 확률로 주제는 분류에서 무작위로 선택됩니다.
      • 호출자는 매개변수(shouldRecordObservation = false)를 사용하여 getTopics를 호출하는 방식으로 상태를 수정하지 않고 주제를 가져오도록 지정할 수 있습니다. 즉, 주제는 반환될 수 있지만 호출은 주간 에포크 계산에 포함되지 않으며 호출자에 관해 관찰된 주제 목록도 업데이트하지 않습니다.
    • 각 앱이 여러 주제 중 하나를 얻는 이유는 앱마다 서로 다른 주제를 보유하도록 하여 앱이 같은 사용자를 서로 연관시키기 어렵게 하기 위함입니다.
      • 예를 들어 앱 A에는 사용자를 위해 주제 T1이 표시되지만 앱 B에는 주제 T2가 표시될 수 있습니다. 이렇게 하면 두 앱에서 이 정보가 동일한 사용자와 연결되어 있는지 확인하기가 더 어려워집니다.
  • Topics API는 지난 3 에포크 각각에 하나씩, 주제가 최대 3개인 목록을 반환합니다.

    • 최대 3개 주제를 제공함으로써 자주 사용하지 않는 앱은 관련성 있는 광고를 찾는 데 충분한 주제를 보유하지만 자주 사용하는 앱은 매주 새로운 주제를 많아야 1개 학습합니다.
    • 반환된 주제 정보에는 분류 항목에 해당하는 주제 ID(int), 분류 버전, 분류 기준 모델 버전이 포함됩니다.
    • 사용자가 지난 3 에포크 이내에 해당 주제와 연결된 앱을 사용하는 것을 관찰한 호출자만 주제를 수신할 수 있습니다.
    • 반환된 모든 주제는 사용자의 관심분야를 나타내며, 광고 요청의 광고 개인 최적화를 위해 이러한 주제 중 일부 또는 전체를 선택할 수 있습니다.
  • 주제가 Topics API를 호출하는 앱에 할당되면 플랫폼은 호출자가 이 주제를 수신할 수 있는지 결정합니다.

    • 지난 3 에포크 이내에 해당 주제와 연결된 앱의 사용자 참여를 관찰한 호출자만 주제를 수신할 수 있습니다.
    • 호출자가 이전에 이 주제에 관한 앱에서 해당 사용자를 위해 API를 호출하지 않았다면 API가 반환하는 목록에 주제가 포함되지 않습니다.
    • 호출자가 지난 3 에포크 동안 주제를 받지 못한 경우 Topics API는 빈 목록을 반환합니다.

    예를 들어 사용자가 기기에 앱을 7개(A, B, C, D, E, F, G) 설치했다고 가정해 보겠습니다. 앱 및 이러한 앱의 광고 기술 SDK의 주제 분류는 다음과 같다고 가정해 보겠습니다.

    주제 분류 광고 기술 SDK
    A T1, T5 ad-sdk1, ad-sdk2
    B T2 ad-sdk2
    C T3, T6 ad-sdk3, ad-sdk4
    케이스가 T1, T4 ad-sdk1
    E T5 ad-sdk4, ad-sdk5
    F T6 ad-sdk2, ad-sdk3, ad-sdk4
    G T7 ad-sdk2
    • 1주 차: Topics API가 이 에포크 동안 사용자의 상위 5개 주제를 생성합니다.
    상위 주제 주제에 관해 알아볼 수 있는 호출자
    T1 ad-sdk1, ad-sdk2
    T2 ad-sdk2
    T3 ad-sdk3, ad-sdk4
    T4 ad-sdk1
    T5 ad-sdk1, ad-sdk2, ad-sdk4, ad-sdk5
    • 2주 차에 앱의 호출자가 API를 호출하면 반환되는 주제 목록에는 이 에포크 동안 이 앱에 관한 이 주제의 '주제에 관해 알아볼 수 있는 호출자' 열에 호출자가 있는 주제만 포함됩니다.
    • 각 호출자가 사용할 수 있는 주제 계산에 포함된 기록 기간은 3 에포크(또는 3주)입니다.
    • 직접 또는 광고 SDK를 통해 Topics API를 호출하는 앱과 연결된 주제만 사용됩니다. 즉, 앱이 Topics API를 호출하는 광고 SDK를 포함하지 않고 API 자체를 호출하지 않으면 앱과 연결된 주제는 다른 앱이나 광고 SDK와 공유된 주제에 영향을 미치지 않습니다.
    • 앱은 광고 SDK가 앱에 API를 사용하지 못하도록 새로운 매니페스트 및 XML 요소를 통해 Topics API를 선언적으로 선택 해제할 수도 있습니다. 선택 해제된 앱과 연결된 주제는 주간 주제 계산에 영향을 주지 않습니다. 이 문서는 관련 구현 세부정보를 포함하도록 업데이트될 예정입니다.
  • 플랫폼에서 5개 주제를 추론하기에 충분한 앱 사용이 없으면 플랫폼은 나머지 주제를 무작위로 생성하는 등의 옵션을 고려할 수 있습니다.

분류

  • 현재 제안서의 경우 초기 분류에는 주제가 수백 개에서 수천 개 포함됩니다. 초기 분류 제안서는 이 문서의 향후 업데이트에서 공유됩니다.
  • 이 분류는 민감한 주제가 분류에 포함되지 않도록 사람이 선별합니다.
  • 이 분류는 Android의 모바일 앱에 표시될 수 있는 광고 카테고리에 맞게 조정됩니다.
  • 분류는 오픈소스이며 변경될 수 있습니다. 이 페이지 상단의 의견 보내기 버튼을 사용하여 의견을 제출해 주세요.

주제 분류 기준

관심 주제는 공개적으로 사용 가능한 앱 정보(예: 앱 이름, 설명, 패키지 이름)에 관해 학습된 분류 기준 모델에서 파생됩니다.

  • 주어진 에포크 동안 주제를 계산하는 추론에 사용되는 분류 기준 모델을 사용하면 사용된 신호 집합이 기기에 유지됩니다. 이러한 신호 집합에는 설치되었거나 최근에 사용된 앱이 포함될 수 있으며 나중에 다른 신호가 포함되도록 확장될 수 있습니다.
  • 초기 모델은 Google에서 학습시키며 이 학습 데이터에는 공개적으로 사용 가능한 앱 정보에 관한, 사람이 선별한 라벨이 포함됩니다. 이 모델은 앱이 어떤 주제로 분류되는지 테스트하기 위해 앱에서 무료로 사용할 수 있습니다.
  • 초기 모델은 Google Play 스토어와 같은 일부 앱 스토어에서 공개적으로 사용 가능한 앱 정보에 관해 학습됩니다.
  • 앱이 두 개 이상의 주제에 매핑되거나, 주제에 매핑되지 않거나, 사용자의 주제 기록에 추가되지 않을 수 있습니다. 앱이 분류에서 2개 이상의 주제에 매핑되는 경우 이 앱에 선택된 주제 수는 상위 3개로 제한됩니다.

사용자 제어

  • 설계의 목적은 사용자가 앱 사용과 연결된 주제를 보고 삭제할 수 있도록 하는 것입니다. 이 사용자 제어 기능 구현은 진행 중인 작업이며 향후 업데이트에 포함될 예정입니다.
  • 사용자가 지난 3 에포크 동안 추론된 주제 선택에 기여한 앱을 제거해도 주제는 제거 관련 정보가 공개되지 않도록 지난 3 에포크 동안 반환된 주제 목록에서 삭제되지 않습니다.

최종 사용자 환경을 간단하게 테스트할 수 있도록 인앱 인텐트를 실행하여 최종 사용자에게 표시되는 것과 비슷하게 주제의 설정 UI를 볼 수도 있습니다. 이 호출의 예는 다음과 같습니다.

//Button that launches settings UI
private Button mSettingsAppButton;
private static final String RB_SETTING_APP_INTENT = "android.adservices.ui.SETTINGS";


//Does setup for button on screen that will launch settings UI to observe Topics
private void registerLauchSettingsAppButton() {
    mSettingsAppButton.setOnClickListener(
        new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                Context context = getApplicationContext();
                Intent activity2Intent = new Intent(RB_SETTING_APP_INTENT);
                activity2Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(activity2Intent);
            }
        });
}