Feed experiment for 10-11-2022 (#18566)

This commit is contained in:
Ben Halpern 2022-10-11 10:56:49 -04:00 committed by GitHub
parent 47ec373f16
commit ef63738454
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 355 additions and 2 deletions

View file

@ -25,7 +25,6 @@ module Articles
new(config: config, **kwargs)
end
Config = Struct.new(
:variant,
:description,
@ -259,6 +258,7 @@ module Articles
where_clauses = "articles.published = true AND articles.published_at > :oldest_published_at"
# See Articles.published scope discussion regarding the query planner
where_clauses += " AND articles.published_at < :now"
where_clauses += " AND articles.score >= 0" # We only want positive values here.
# Without the compact, if we have `omit_article_ids: [nil]` we
# have the following SQL clause: `articles.id NOT IN (NULL)`

View file

@ -0,0 +1,157 @@
{
"max_days_since_published": 15,
"description": "An overall simplification based on some varied experimentation. Mostly based on 20221004-variant-b but several changes. Notably more weight on tags, and added 'experience' back in.",
"order_by": "final_order_by_random_weighted_to_score",
"reseed_randomizer_on_each_request": false,
"levers": {
"daily_decay": {
"cases": [
[0, 1],
[1, 0.99],
[2, 0.905],
[3, 0.9],
[4, 0.89],
[5, 0.85],
[6, 0.84],
[7, 0.8],
[8, 0.69],
[9, 0.68],
[10, 0.67],
[11, 0.66],
[12, 0.65],
[13, 0.6],
[14, 0.55]
],
"fallback": 0.25
},
"comments_count": {
"cases": [
[0, 0.5],
[1, 0.5],
[2, 0.66],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.88],
[8, 0.9],
[9, 0.92],
[12, 1.0],
[18, 1.0],
[22, 1.0],
[25, 1.0],
[30, 1.0],
[35, 1.0],
[40, 1.0],
[45, 1.0]
],
"fallback": 0.99
},
"featured_article": { "cases": [[1, 1]], "fallback": 0.78 },
"matching_negative_tags_intersection_count": {
"cases": [
[0, 1],
[1, 0.3],
[2, 0.25],
[3, 0.2],
[4, 0.1]
],
"fallback": 0
},
"experience": {
"cases": [
[0, 1],
[1, 0.98],
[2, 0.96],
[3, 0.95],
[4, 0.93],
[5, 0.88],
[6, 0.5],
[7, 0.4]
],
"default_user_experience_level": 5,
"fallback": 0.3
},
"matching_positive_tags_intersection_count": {
"cases": [
[0, 0.35],
[1, 0.97]
],
"fallback": 1
},
"matching_positive_tags_intersection_points": {
"cases": [
[0, 0.3],
[1, 0.45],
[2, 0.5],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.9],
[8, 0.93],
[9, 0.95]
],
"fallback": 1
},
"privileged_user_reaction": {
"cases": [
[-1, 0.2],
[1, 1]
],
"fallback": 0.95,
"negative_reaction_threshold": -9,
"positive_reaction_threshold": 4
},
"public_reactions_score": {
"cases": [
[0, 0.3],
[1, 0.4],
[2, 0.45],
[3, 0.5],
[4, 0.55],
[5, 0.6],
[6, 0.61],
[7, 0.62],
[8, 0.63],
[9, 0.64],
[10, 0.65],
[11, 0.66],
[12, 0.67],
[13, 0.68],
[14, 0.69],
[15, 0.7],
[16, 0.71],
[17, 0.72],
[18, 0.73],
[19, 0.74],
[20, 0.75],
[21, 0.76],
[22, 0.77],
[23, 0.78],
[24, 0.79],
[25, 0.8],
[26, 0.81],
[27, 0.82],
[28, 0.83],
[29, 0.84],
[30, 0.85],
[31, 0.86],
[32, 0.87],
[33, 0.88],
[34, 0.89],
[35, 0.9],
[36, 0.91],
[37, 0.92],
[38, 0.93],
[39, 0.94],
[40, 0.95],
[41, 0.96],
[42, 0.97],
[43, 0.98],
[44, 0.99]
],
"fallback": 1.0
}
}
}

View file

@ -0,0 +1,157 @@
{
"max_days_since_published": 15,
"description": "An overall simplification based on some varied experimentation. Mostly based on 20221004-variant-b but several changes. Notably more weight on tags, and added 'experience' back in, and ordered by relevancy_score_and_publication_date.",
"order_by": "relevancy_score_and_publication_date",
"reseed_randomizer_on_each_request": false,
"levers": {
"daily_decay": {
"cases": [
[0, 1],
[1, 0.99],
[2, 0.905],
[3, 0.9],
[4, 0.89],
[5, 0.85],
[6, 0.84],
[7, 0.8],
[8, 0.69],
[9, 0.68],
[10, 0.67],
[11, 0.66],
[12, 0.65],
[13, 0.6],
[14, 0.55]
],
"fallback": 0.25
},
"comments_count": {
"cases": [
[0, 0.5],
[1, 0.5],
[2, 0.66],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.88],
[8, 0.9],
[9, 0.92],
[12, 1.0],
[18, 1.0],
[22, 1.0],
[25, 1.0],
[30, 1.0],
[35, 1.0],
[40, 1.0],
[45, 1.0]
],
"fallback": 0.99
},
"featured_article": { "cases": [[1, 1]], "fallback": 0.78 },
"matching_negative_tags_intersection_count": {
"cases": [
[0, 1],
[1, 0.3],
[2, 0.25],
[3, 0.2],
[4, 0.1]
],
"fallback": 0
},
"experience": {
"cases": [
[0, 1],
[1, 0.98],
[2, 0.96],
[3, 0.95],
[4, 0.93],
[5, 0.88],
[6, 0.5],
[7, 0.4]
],
"default_user_experience_level": 5,
"fallback": 0.3
},
"matching_positive_tags_intersection_count": {
"cases": [
[0, 0.35],
[1, 0.97]
],
"fallback": 1
},
"matching_positive_tags_intersection_points": {
"cases": [
[0, 0.3],
[1, 0.45],
[2, 0.5],
[3, 0.7],
[4, 0.75],
[5, 0.8],
[6, 0.85],
[7, 0.9],
[8, 0.93],
[9, 0.95]
],
"fallback": 1
},
"privileged_user_reaction": {
"cases": [
[-1, 0.2],
[1, 1]
],
"fallback": 0.95,
"negative_reaction_threshold": -9,
"positive_reaction_threshold": 4
},
"public_reactions_score": {
"cases": [
[0, 0.3],
[1, 0.4],
[2, 0.45],
[3, 0.5],
[4, 0.55],
[5, 0.6],
[6, 0.61],
[7, 0.62],
[8, 0.63],
[9, 0.64],
[10, 0.65],
[11, 0.66],
[12, 0.67],
[13, 0.68],
[14, 0.69],
[15, 0.7],
[16, 0.71],
[17, 0.72],
[18, 0.73],
[19, 0.74],
[20, 0.75],
[21, 0.76],
[22, 0.77],
[23, 0.78],
[24, 0.79],
[25, 0.8],
[26, 0.81],
[27, 0.82],
[28, 0.83],
[29, 0.84],
[30, 0.85],
[31, 0.86],
[32, 0.87],
[33, 0.88],
[34, 0.89],
[35, 0.9],
[36, 0.91],
[37, 0.92],
[38, 0.93],
[39, 0.94],
[40, 0.95],
[41, 0.96],
[42, 0.97],
[43, 0.98],
[44, 0.99]
],
"fallback": 1.0
}
}
}

View file

@ -28,10 +28,44 @@
################################################################################
experiments:
# NOTE: Our feed strategy testing experiment must begin with "feed_strategy"
feed_strategy_starting_20221011:
# NOTE: Required as we want only want to consider for conversion events that
# occurred on or after the given start_date.
started_at: 2022-10-11
variants:
- 20221004-variant-b
- 20220926-variant-b
- 20221011-variant-a
- 20221011-variant-b
- 20220823-variant # Back to this test from a while ago
weights:
- 30
- 25
- 15
- 15
- 15
goals:
- user_creates_pageview
- user_creates_article_reaction
- user_creates_comment
- user_publishes_post
- user_views_pages_on_at_least_two_different_days_within_a_week
- user_views_pages_on_at_least_four_different_days_within_a_week
- user_creates_article_reaction_on_four_different_days_within_a_week
- user_creates_comment_on_at_least_four_different_days_within_a_week
- user_publishes_post_on_four_different_days_within_a_week
- user_views_pages_on_at_least_three_different_hours_within_a_day
- user_views_pages_on_at_least_four_different_hours_within_a_day
- user_views_pages_on_at_least_twelve_different_hours_within_five_days
- user_views_pages_on_at_least_nine_different_days_within_two_weeks
- user_publishes_post_at_least_two_times_within_week
- user_publishes_post_at_least_two_times_within_two_weeks
feed_strategy_starting_20221004:
# NOTE: Required as we want only want to consider for conversion events that
# occurred on or after the given start_date.
started_at: 2022-10-04
ended_at: 2022-10-04
winner: 20221004-variant-b
variants:
- 20220926-variant-b
- 20221004-variant-a
@ -58,7 +92,6 @@ experiments:
- user_views_pages_on_at_least_nine_different_days_within_two_weeks
- user_publishes_post_at_least_two_times_within_week
- user_publishes_post_at_least_two_times_within_two_weeks
# NOTE: Our feed strategy testing experiment must begin with "feed_strategy"
feed_strategy_starting_20220926:
# NOTE: Required as we want only want to consider for conversion events that
# occurred on or after the given start_date.

View file

@ -28,6 +28,12 @@ RSpec.describe Articles::Feeds::VariantQuery, type: :service do
expect(query_call).to be_a(ActiveRecord::Relation)
expect(query_call.to_a).to match_array(article)
end
it "does not return negative scored articles", :aggregate_failures do
article = create(:article, score: -1)
expect(query_call).to be_a(ActiveRecord::Relation)
expect(query_call.to_a).not_to match_array(article)
end
end
describe "#featured_story_and_default_home_feed" do