التجارب داخل الحملة

تُستخدَم التجارب ضمن الحملة لاختبار ميزة معيّنة داخل حملة واحدة. على عكس التجارب التي يديرها النظام ويتم فيها تقسيم الزيارات بين الحملات الضابطة والتجريبية، تقسّم التجارب ضمن الحملة الزيارات داخل الحملة، استنادًا إلى ما إذا كانت الميزة مفعَّلة أم لا.

يتوافق سير العمل هذا مع قيم ExperimentType التالية:

ADOPT_AI_MAX
تختبر هذه التجربة تأثير ميزات AI Max في "الحملات على شبكة البحث".
ADOPT_BROAD_MATCH_KEYWORDS
تختبر تأثير الكلمات الرئيسية التي تستخدم المطابقة التقريبية في "الحملات على شبكة البحث".
PMAX_TEXT_CUSTOMIZATION_FINAL_URL_EXPANSION
تُستخدَم هذه الميزة تحديدًا لاختبار ميزات "حملات الأداء الأفضل": تخصيص النص وتوسيع عنوان URL النهائي. تتيح هذه الميزة لذكاء 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"، يجب تقسيم عدد الزيارات بالتساوي (‎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 إحصاءات النقرات 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. يؤدي ذلك إلى تطبيق التغيير التجريبي كحالة دائمة جديدة للحملة. هذه عملية غير متزامنة، لذا يُرجى الاطّلاع على الأخطاء غير المتزامنة لمزيد من التفاصيل.
  • التطبيق (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" لعدم توفّر حملة معالجة منفصلة يمكن ترقيتها).