ניסויים בתוך קמפיין

ניסויים בקמפיין אחד משמשים לבדיקת תכונה ספציפית בתוך קמפיין אחד. בניסויים שמנוהלים על ידי המערכת, התנועה מחולקת בין קמפיינים של קבוצת בקרה וקבוצת ניסוי. לעומת זאת, בניסויים בתוך הקמפיין, התנועה מחולקת בתוך הקמפיין, על סמך השאלה אם התכונה מופעלת או לא.

תהליך העבודה הזה נתמך בערכים הבאים של ExperimentType:

ADOPT_AI_MAX
בודק את ההשפעה של תכונות "AI למיקסום ביצועים" על קמפיינים לרשת החיפוש.
ADOPT_BROAD_MATCH_KEYWORDS
בודקים את ההשפעה של מילות מפתח בהתאמה רחבה על קמפיינים לרשת החיפוש.
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
הוא משמש במיוחד לבדיקת תכונות של קמפיינים למיקסום הביצועים: התאמה אישית של הטקסט והתאמת כתובת URL סופית. התכונה הזו מאפשרת ל-Google AI להפנות תנועה לדפי נחיתה רלוונטיים וליצור נכסי טקסט שמתאימים יותר לשאילתות החיפוש.

הגדרה

  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, צריך לחלק את התנועה באופן שווה (50/50) בתוך הקמפיין, כך ש-50% מהתנועה ייחשפו לתכונה המופעלת (קבוצת הניסוי) ו-50% לא ייחשפו אליה (קבוצת הבקרה). ‫PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION תומך בחלוקת תנועה מותאמת אישית שמסתכמת ב-100.

Java

// 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 הבאה מאחזרת נתונים סטטיסטיים של קליקים בADOPT_AI_MAXניסוי בתוך הקמפיין ב-30 הימים האחרונים:

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): PromoteExperiment לא נתמך ב-PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION. במקום זאת, צריך להשתמש ב-GraduateExperiment כדי להחיל את ההגדרות של ההתאמה האישית של הטקסט והתאמת כתובת ה-URL הסופית של קבוצת הניסוי על הקמפיין הקיים למיקסום הביצועים. מוסיפים רשומת CampaignBudgetMapping ב-campaign_budget_mappings ומציינים את הקמפיין של קבוצת הניסוי (experiment_campaign) ואת התקציב שלו (campaign_budget). זו פעולה סינכרונית. ‫(GraduateExperiment לא נתמך ב-ADOPT_AI_MAX או ב-ADOPT_BROAD_MATCH_KEYWORDS כי אין קמפיין נפרד של קבוצת הניסוי שאפשר להעביר לשלב הבא).