Feed experiment for 10-11-2022 (#18566)
This commit is contained in:
parent
47ec373f16
commit
ef63738454
5 changed files with 355 additions and 2 deletions
|
|
@ -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)`
|
||||
|
|
|
|||
157
config/feed-variants/20221011-variant-a.json
Normal file
157
config/feed-variants/20221011-variant-a.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
157
config/feed-variants/20221011-variant-b.json
Normal file
157
config/feed-variants/20221011-variant-b.json
Normal 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue