캠페인 내 실험은 단일 캠페인 내에서 특정 기능을 테스트하는 데 사용됩니다. 트래픽이 통제 캠페인과 실험 캠페인 간에 분할되는 시스템 관리 실험과 달리 캠페인 내 실험은 기능의 사용 설정 여부에 따라 캠페인 내에서 트래픽을 분할합니다.
이 워크플로는 다음 ExperimentType 값에 지원됩니다.
ADOPT_AI_MAX- AI Max 기능이 검색 캠페인에 미치는 영향을 테스트합니다.
ADOPT_BROAD_MATCH_KEYWORDS- 확장검색 키워드가 검색 캠페인에 미치는 영향을 테스트합니다.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION- 실적 최대화 캠페인 기능(텍스트 맞춤설정 및 최종 URL 확장)을 테스트하는 데 특별히 사용됩니다. Google AI가 관련성 높은 방문 페이지로 트래픽을 전송하고 검색어와 더 일치하는 텍스트 애셋을 생성할 수 있습니다.
설정
Experiment(status가ENABLED로 설정됨)를 정의하여 실험 유형, 대조군ExperimentArm, 실험군ExperimentArm를 제공합니다.ADOPT_AI_MAX및ADOPT_BROAD_MATCH_KEYWORDS의 경우 대조 부문과 실험 부문 모두campaigns의 동일한 캠페인을 참조해야 합니다.PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION의 경우 실험 부문만campaigns에서 실적 최대화 캠페인을 지정합니다 (대조 부문에서campaigns를 설정하지 않은 상태로 둠).
ADOPT_AI_MAX의 경우 필드 마스크를 사용하여CampaignOperation업데이트를 만들어ai_max_setting.enable_ai_max를 사용 설정하고asset_automation_settings를 구성합니다.실험 및 실험 부문을 만들고 (
ADOPT_AI_MAX의 경우) 캠페인에서 테스트 기능을 사용 설정하는 변형 작업이 포함된GoogleAdsService.Mutate요청을 보냅니다.
ADOPT_AI_MAX 및 ADOPT_BROAD_MATCH_KEYWORDS의 경우 트래픽의 50% 가 사용 설정된 기능 (실험 그룹)에 노출되고 50% 는 노출되지 않도록 (대조 그룹) 캠페인 내에서 트래픽을 균등하게 (50/50) 분할해야 합니다.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION은 합계가 100인 커스텀 트래픽 분할을 지원합니다.
자바
// Create the experiment resource name using a temporary ID. String experimentResourceName = ResourceNames.experiment(customerId, -1L); // Create the experiment. Experiment experiment = Experiment.newBuilder() .setResourceName(experimentResourceName) .setName("ADOPT_AI_MAX Experiment #" + UUID.randomUUID()) .setType(ExperimentType.ADOPT_AI_MAX) .build(); MutateOperation experimentOperation = MutateOperation.newBuilder() .setExperimentOperation(ExperimentOperation.newBuilder().setCreate(experiment).build()) .build(); // Create the control arm. Both arms in an intra-campaign experiment reference the same base // campaign. ExperimentArm controlArm = ExperimentArm.newBuilder() .setExperiment(experimentResourceName) .setName("Control Arm") .setControl(true) .setTrafficSplit(50) .addCampaigns(ResourceNames.campaign(customerId, campaignId)) .build(); MutateOperation controlArmOperation = MutateOperation.newBuilder() .setExperimentArmOperation( ExperimentArmOperation.newBuilder().setCreate(controlArm).build()) .build(); // Create the treatment arm. ExperimentArm treatmentArm = ExperimentArm.newBuilder() .setExperiment(experimentResourceName) .setName("Treatment Arm") .setControl(false) .setTrafficSplit(50) .addCampaigns(ResourceNames.campaign(customerId, campaignId)) .build(); MutateOperation treatmentArmOperation = MutateOperation.newBuilder() .setExperimentArmOperation( ExperimentArmOperation.newBuilder().setCreate(treatmentArm).build()) .build(); // Create a campaign operation with an update mask to enable AI Max and configure asset // automation settings. // Note: For intra-campaign experiments, these settings are applied to the base campaign but are // only active for the treatment traffic split. Campaign campaign = Campaign.newBuilder() .setResourceName(ResourceNames.campaign(customerId, campaignId)) .setAiMaxSetting(AiMaxSetting.newBuilder().setEnableAiMax(true).build()) .addAssetAutomationSettings( AssetAutomationSetting.newBuilder() .setAssetAutomationType(AssetAutomationType.TEXT_ASSET_AUTOMATION) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN) .build()) .addAssetAutomationSettings( AssetAutomationSetting.newBuilder() .setAssetAutomationType( AssetAutomationType.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION) .setAssetAutomationStatus(AssetAutomationStatus.OPTED_IN) .build()) .build(); CampaignOperation campaignOp = CampaignOperation.newBuilder() .setUpdate(campaign) .setUpdateMask(FieldMasks.allSetFieldsOf(campaign)) .build(); MutateOperation campaignMutateOperation = MutateOperation.newBuilder().setCampaignOperation(campaignOp).build(); // Send all mutate operations in a single Mutate request. List<MutateOperation> mutateOperations = ImmutableList.of( experimentOperation, controlArmOperation, treatmentArmOperation, campaignMutateOperation); try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { MutateGoogleAdsRequest request = MutateGoogleAdsRequest.newBuilder() .setCustomerId(Long.toString(customerId)) .addAllMutateOperations(mutateOperations) .build(); MutateGoogleAdsResponse response = googleAdsServiceClient.mutate(request);
C#
// Create the experiment resource name using a temporary ID. string experimentResourceName = ResourceNames.Experiment(customerId, -1); // Create the experiment. MutateOperation experimentOperation = new MutateOperation() { ExperimentOperation = new ExperimentOperation() { Create = new Experiment() { ResourceName = experimentResourceName, Name = $"ADOPT_AI_MAX Experiment #{ExampleUtilities.GetRandomString()}", Type = ExperimentType.AdoptAiMax } } }; // Create the control arm. Both arms in an intra-campaign experiment // reference the same base campaign. MutateOperation controlArmOperation = new MutateOperation() { ExperimentArmOperation = new ExperimentArmOperation() { Create = new ExperimentArm() { Experiment = experimentResourceName, Name = "Control Arm", Control = true, TrafficSplit = 50, Campaigns = { ResourceNames.Campaign(customerId, campaignId) } } } }; // Create the treatment arm. MutateOperation treatmentArmOperation = new MutateOperation() { ExperimentArmOperation = new ExperimentArmOperation() { Create = new ExperimentArm() { Experiment = experimentResourceName, Name = "Treatment Arm", Control = false, TrafficSplit = 50, Campaigns = { ResourceNames.Campaign(customerId, campaignId) } } } }; // Create a campaign operation with an update mask to enable AI Max and // configure asset automation settings. // Note: For intra-campaign experiments, these settings are applied to the // base campaign but are only active for the treatment traffic split. Campaign campaign = new Campaign() { ResourceName = ResourceNames.Campaign(customerId, campaignId), AiMaxSetting = new Campaign.Types.AiMaxSetting { EnableAiMax = true } }; campaign.AssetAutomationSettings.Add(new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.TextAssetAutomation, AssetAutomationStatus = AssetAutomationStatus.OptedIn }); campaign.AssetAutomationSettings.Add(new Campaign.Types.AssetAutomationSetting { AssetAutomationType = AssetAutomationType.FinalUrlExpansionTextAssetAutomation, AssetAutomationStatus = AssetAutomationStatus.OptedIn }); MutateOperation campaignOperation = new MutateOperation() { CampaignOperation = new CampaignOperation() { Update = campaign, UpdateMask = FieldMasks.AllSetFieldsOf(campaign) } }; // Send all mutate operations in a single Mutate request. List<MutateOperation> mutateOperations = new List<MutateOperation> { experimentOperation, controlArmOperation, treatmentArmOperation, campaignOperation }; MutateGoogleAdsResponse response = googleAdsService.Mutate( customerId.ToString(), mutateOperations);
PHP
This example is not yet available in PHP; you can take a look at the other languages.
Python
# Create the experiment resource name using a temporary ID. experiment_resource_name = googleads_service.experiment_path( customer_id, "-1" ) # Create the experiment. experiment_operation = client.get_type("MutateOperation") experiment = experiment_operation.experiment_operation.create experiment.resource_name = experiment_resource_name experiment.name = f"ADOPT_AI_MAX Experiment #{uuid4()}" experiment.type_ = client.enums.ExperimentTypeEnum.ADOPT_AI_MAX # Create the control arm. Both arms in an intra-campaign experiment # reference the same base campaign. control_arm_operation = client.get_type("MutateOperation") control_arm = control_arm_operation.experiment_arm_operation.create control_arm.experiment = experiment_resource_name control_arm.name = "Control Arm" control_arm.control = True control_arm.traffic_split = 50 control_arm.campaigns.append( googleads_service.campaign_path(customer_id, campaign_id) ) # Create the treatment arm. treatment_arm_operation = client.get_type("MutateOperation") treatment_arm = treatment_arm_operation.experiment_arm_operation.create treatment_arm.experiment = experiment_resource_name treatment_arm.name = "Treatment Arm" treatment_arm.control = False treatment_arm.traffic_split = 50 treatment_arm.campaigns.append( googleads_service.campaign_path(customer_id, campaign_id) ) # Create a campaign operation with an update mask to enable AI Max and # configure asset automation settings. # Note: For intra-campaign experiments, these settings are applied to the # base campaign but are only active for the treatment traffic split. campaign_operation = client.get_type("MutateOperation") campaign = campaign_operation.campaign_operation.update campaign.resource_name = googleads_service.campaign_path( customer_id, campaign_id ) campaign.ai_max_setting.enable_ai_max = True for asset_automation_type_enum in [ client.enums.AssetAutomationTypeEnum.TEXT_ASSET_AUTOMATION, client.enums.AssetAutomationTypeEnum.FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION, ]: asset_automation_setting = client.get_type( "Campaign" ).AssetAutomationSetting() asset_automation_setting.asset_automation_type = ( asset_automation_type_enum ) asset_automation_setting.asset_automation_status = ( client.enums.AssetAutomationStatusEnum.OPTED_IN ) campaign.asset_automation_settings.append(asset_automation_setting) client.copy_from( campaign_operation.campaign_operation.update_mask, protobuf_helpers.field_mask(None, campaign._pb), ) # Send all mutate operations in a single Mutate request. mutate_operations = [ experiment_operation, control_arm_operation, treatment_arm_operation, campaign_operation, ] response = googleads_service.mutate( customer_id=customer_id, mutate_operations=mutate_operations, )
Ruby
# Create the experiment resource name using a temporary ID. experiment_resource_name = client.path.experiment(customer_id, "-1") # Create the experiment. experiment_operation = client.operation.mutate do |m| m.experiment_operation = client.operation.create_resource.experiment do |e| e.resource_name = experiment_resource_name e.name = "ADOPT_AI_MAX Experiment #{(Time.new.to_f * 1000).to_i}" e.type = :ADOPT_AI_MAX end end # Create the control arm. Both arms in an intra-campaign experiment # reference the same base campaign. campaign_resource_name = client.path.campaign(customer_id, campaign_id) control_arm_operation = client.operation.mutate do |m| m.experiment_arm_operation = client.operation.create_resource.experiment_arm do |arm| arm.experiment = experiment_resource_name arm.name = "Control Arm" arm.control = true arm.traffic_split = 50 arm.campaigns << campaign_resource_name end end # Create the treatment arm. treatment_arm_operation = client.operation.mutate do |m| m.experiment_arm_operation = client.operation.create_resource.experiment_arm do |arm| arm.experiment = experiment_resource_name arm.name = "Treatment Arm" arm.control = false arm.traffic_split = 50 arm.campaigns << campaign_resource_name end end # Create a campaign operation with an update mask to enable AI Max and # configure asset automation settings. # Note: For intra-campaign experiments, these settings are applied to the # base campaign but are only active for the treatment traffic split. campaign_operation = client.operation.mutate do |m| m.campaign_operation = client.operation.update_resource.campaign(campaign_resource_name) do |c| c.ai_max_setting = client.resource.ai_max_setting do |aims| aims.enable_ai_max = true end [:TEXT_ASSET_AUTOMATION, :FINAL_URL_EXPANSION_TEXT_ASSET_AUTOMATION].each do |type| c.asset_automation_settings << client.resource.asset_automation_setting do |setting| setting.asset_automation_type = type setting.asset_automation_status = :OPTED_IN end end end end # Send all mutate operations in a single Mutate request. mutate_operations = [ experiment_operation, control_arm_operation, treatment_arm_operation, campaign_operation, ] response = client.service.google_ads.mutate( customer_id: customer_id, mutate_operations: mutate_operations, )
Perl
This example is not yet available in Perl; you can take a look at the other languages.
curl
실험 보고서
통제 그룹과 실험 그룹 트래픽이 단일 캠페인 내에서 혼합되므로 직접 실험 보고를 사용하여 통제 그룹과 실험 그룹 간의 측정항목을 비교해야 합니다. 표준 캠페인 수준 보고서에는 전체 캠페인의 집계된 측정항목만 표시되며 두 그룹을 구분할 수 없습니다.
다음 GAQL 쿼리는 지난 30일 동안의 ADOPT_AI_MAX 캠페인 내 실험에 대한 클릭 통계를 검색합니다.
SELECT
experiment.resource_name,
experiment.name,
metrics.clicks,
metrics.control_clicks,
metrics.clicks_point_estimate,
metrics.clicks_p_value
FROM experiment
WHERE segments.date DURING LAST_30_DAYS
AND experiment.type = 'ADOPT_AI_MAX'
실험 승격, 종료 또는 완료
결과를 평가한 후 ExperimentService를 사용하여 실험을 완료할 수 있습니다.
- 종료: 결과에 만족하지 않으면
EndExperiment를 사용합니다. 기능이 사용 중지되고 캠페인이 실험 기능 없이 모든 트래픽을 게재하는 상태로 되돌아갑니다. 이는 동기식 작업입니다. - 승격 (
ADOPT_AI_MAX및ADOPT_BROAD_MATCH_KEYWORDS): 검색 캠페인 내 실험 결과에 만족하는 경우PromoteExperiment를 사용합니다. 이렇게 하면 실험 변경사항이 캠페인의 새로운 영구 상태로 적용됩니다. 이는 비동기식 작업입니다. 자세한 내용은 비동기 오류를 참조하세요. - Graduate (
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION):PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION에는PromoteExperiment가 지원되지 않습니다. 대신GraduateExperiment를 사용하여 실험 부문의 텍스트 맞춤설정 및 최종 URL 확장 설정을 기존 실적 최대화 캠페인에 바로 적용합니다.campaign_budget_mappings에 실험 부문의 캠페인(experiment_campaign)과 예산 (campaign_budget)을 지정하는CampaignBudgetMapping항목을 포함합니다. 이는 동기식 작업입니다. (ADOPT_AI_MAX또는ADOPT_BROAD_MATCH_KEYWORDS에는GraduateExperiment가 지원되지 않습니다. 종료할 별도의 실험 캠페인이 없기 때문입니다.)