آزمایش‌های درون‌پویشی

آزمایش‌های درون‌پویشی برای آزمایش ویژگی خاصی درون یک پویش استفاده می‌شوند. برخلاف آزمایش‌های تحت مدیریت سیستم که در آن‌ها ترافیک بین پویش‌های کنترل و آزمایش تقسیم می‌شود، آزمایش‌های درون‌پویشی ترافیک را درون پویش تقسیم می‌کنند، براساس اینکه ویژگی فعال است یا نه.

این گردش کار برای مقادیر ExperimentType زیر پشتیبانی می‌شود:

ADOPT_AI_MAX
تأثیر ویژگی‌های «بیشینه‌سازی هوشواره‌ای» را بر پویش‌های «جستجو» آزمایش می‌کند.
ADOPT_BROAD_MATCH_KEYWORDS
تأثیر کلیدواژه‌های مطابقت گسترده را بر پویش‌های «شبکه جستجو» آزمایش می‌کند.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
به‌طور خاص برای آزمایش ویژگی‌های «بیشینه‌سازی عملکرد» استفاده می‌شود: سفارشی‌سازی نوشتار و ازهم باز کردن نشانی وب نهایی. به «هوش مصنوعی Google» امکان می‌دهد ترافیک را به صفحه‌های مقصد مربوط ارسال کند و دارایی‌های نوشتاری تولید کند تا با پُرسمان‌های جستجو مطابقت بهتری داشته باشد.

راه‌اندازی

  1. Experiment را (با تنظیم status روی ENABLED) تعریف کنید و نوع آزمایش، ExperimentArm کنترل، و ExperimentArm درمان را ارائه دهید:
    • برای ADOPT_AI_MAX و ADOPT_BROAD_MATCH_KEYWORDS، هم بازوی کنترل و هم بازوی درمان باید به همان پویش در campaigns ارجاع دهند.
    • برای PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION، فقط شاخه درمان کمپین «عملکرد بیشینه» را در campaigns مشخص می‌کند (campaigns را در شاخه کنترل تنظیم‌نشده رها کنید).
  2. برای ADOPT_AI_MAX، به‌روزرسانی CampaignOperation را با پوشش فیلد ایجاد کنید تا ai_max_setting.enable_ai_max را فعال کنید و asset_automation_settings را پیکربندی کنید.

  3. درخواست GoogleAdsService.Mutate ارسال کنید که شامل عملیات جهش برای ایجاد آزمایش و بازوهای آزمایش باشد، و (برای ADOPT_AI_MAX) ویژگی آزمایش را در پویش فعال کند.

برای ADOPT_AI_MAX و ADOPT_BROAD_MATCH_KEYWORDS، ترافیک باید به‌طور مساوی (۵۰/۵۰) در پویش تقسیم شود تا ۵۰٪ ترافیک درمعرض ویژگی فعال‌شده (گروه تحت آزمایش) قرار گیرد و ۵۰٪ دیگر درمعرض آن قرار نگیرد (گروه شاهد). ‫PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION از توزیع ترافیک سفارشی که مجموع آن ۱۰۰ باشد پشتیبانی می‌کند.

جاوا

// 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,
)
      

پرل

This example is not yet available in Perl; you can take a look at the other languages.
    

curl

گزارش آزمایش

چون ترافیک کنترل و آزمایش در یک پویش واحد ترکیب شده‌اند، باید از گزارش‌دهی آزمایش مستقیم برای مقایسه سنجه‌ها بین گروه‌های کنترل و آزمایش استفاده کنید. گزارش‌دهی استاندارد در سطح پویش فقط سنجه‌های تجمیعی را برای کل پویش نشان می‌دهد و نمی‌تواند بین دو گروه تمایز قائل شود.

پرس‌وجوی GAQL زیر آمار کلیک را برای یک 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 استفاده کنید. ویژگی غیرفعال می‌شود و پویش به ارائه همه ترافیک بدون ویژگی آزمایشی برمی‌گردد. این یک عملیات همگام است.
  • Promote (ADOPT_AI_MAX و ADOPT_BROAD_MATCH_KEYWORDS): اگر از نتایج آزمایش درون‌پویشی «جستجو» راضی هستید، از PromoteExperiment استفاده کنید. این کار تغییر آزمایشی را به‌عنوان وضعیت دائمی جدید کمپین اعمال می‌کند. این یک عملیات ناهمگام است؛ برای جزئیات، به خطاهای ناهمگام مراجعه کنید.
  • فارغ‌التحصیل (PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION): PromoteExperiment برای PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION پشتیبانی نمی‌شود؛ به‌جای آن، از GraduateExperiment برای اعمال تنظیمات سفارشی‌سازی نوشتار و گسترش نشانی وب نهایی شاخه درمان در محل به پویش «بیشینه‌سازی عملکرد» موجود استفاده کنید. ورودی CampaignBudgetMapping را در campaign_budget_mappings اضافه کنید و پویش بازوی درمان (experiment_campaign) و بودجه آن (campaign_budget) را مشخص کنید. این یک عملیات همگام است. (GraduateExperiment برای ADOPT_AI_MAX یا ADOPT_BROAD_MATCH_KEYWORDS پشتیبانی نمی‌شود چون پویش درمان جداگانه‌ای برای فارغ‌التحصیلی وجود ندارد.)