skip to content

Why apply a news feed's recency boost after the ranker instead of feeding article age into the ranking model?

level: seniorimportance: nice to knowfreq 30%

answer

  1. the same effect, two very different owners
  2. a retrain is not a response time
  3. the one edit that rewrites the score
  4. double-counted if it is already a feature
  5. bounded, flagged, expiring, logged

basics

~20 s

Because the two change on different timescales. A post-scoring multiplier is an operations lever an editor can turn during a breaking event and reverse in minutes; article age as a model input learns a better-shaped response from data but only moves when the model is retrained.

solid answer

~50 s

Both exist, and the split is about **who can change it and how fast**. Article age as a model feature lets the ranker learn the real age-response from behaviour - which differs by section, by reader, by hour - but that shape is frozen until the next retrain and is entangled with everything else the model learned. A boost applied in the list-editing layer is a knob: bounded, editable during an event, uniform across ranking-model versions, and reversible without a deployment. The cost is real. The boost is applied on top of the ranker's score, so any downstream reading of that number now reads a shifted one; it double-counts if age is already a model input; and an offline replay of the ranker's scores does not see it at all. The usual arrangement is both: age as a feature for the learned shape, plus a small, explicitly bounded multiplier as the lever.

go deeper

for a junior

Recall that freshness can be handled either inside the model as an input or afterwards as an adjustment, and that these are separate places in the system.

for a middle

Explain the trade in terms of cadence and ownership: a feature learns a better shape but only moves at retrain, a boost moves in minutes and applies one curve to everything.

for a senior

Show that you know the cost - a rewritten score, double counting against an existing age feature, invisibility to offline replay - and that you would bound, flag and log the lever.

for a principal

Decide who is allowed to pull the lever during an event and what makes it go away afterwards, because an unexpiring boost is how a rule layer silently acquires a policy nobody chose.

## The same effect, in two different places "Fresher articles should rank higher" can be implemented as an input to the ranking stage or as an edit in the list-editing layer that follows it. They produce similar slates and are not at all the same engineering object. | | article age as a model input | boost in the list-editing layer | |---|---|---| | who changes it | whoever retrains the model | whoever owns the rule layer | | how fast it changes | next retrain - hours to days | minutes, behind a flag | | what it encodes | the age-response learned from behaviour, varying by section and reader | one stated curve applied uniformly | | survives a model swap | no, it is relearned | yes, it sits outside the model | | visible to an offline replay of scores | yes | no | | what it can break | nothing outside the model | the meaning of the score everything downstream reads | ## What the boost buys - **Latency of intervention.** A major event breaks and everything from the last thirty minutes should surface. Retraining is not a response time. A bounded multiplier applied after scoring is. - **Independence from the model.** It keeps working when the ranking model is swapped, rolled back, or serving from a fallback, because it is not part of the model. - **Legibility.** "Articles under an hour old receive a bounded multiplier" is a sentence a non-engineer can read, argue with, and sign off. A learned age-response is a shape inside a model. - **Reversibility.** One flag, one request, back to the previous behaviour - which is exactly what you want during an incident. ## What the boost costs 1. **It changes the score, unlike the rest of this layer.** De-duplication, quotas and suppressions change selection; a boost rewrites the number. Anything downstream reading that number - a cutoff, a display rule, an analysis - now reads a shifted value, and the meaning it had from the scoring stage is no longer the meaning it has here. 2. **It double-counts.** If article age is already an input to the ranker, the model has learned a response to it and the boost applies a second one on top. The combined curve is nobody's design. 3. **It is invisible offline.** An evaluation that replays the ranker's scores measures the unboosted order, so the boost's effect exists only in what was actually served, and only if the layer logs it. 4. **It does not decay by itself.** A multiplier introduced for one event stays until someone removes it. This is the single most common way a rule layer accumulates weight nobody remembers adding. ## The arrangement that usually wins Most production feeds run both, with the responsibilities split: - **The model owns the shape.** Article age goes in as a feature so the ranker can learn that a market report decays in an hour and a long read does not. No hand-written curve reproduces that. - **The layer owns the lever.** A small, bounded, flagged multiplier sits after scoring for the situations the model has not seen - a developing event, an unusual news day, a recovery from a stale index. - **The lever is bounded and expiring.** A stated maximum, so it can never dominate the ranker's judgment, and an expiry date, so it leaves when the event does. - **The lever is logged.** Record the pre-boost and post-boost score for boosted items, or you cannot later separate what the model did from what the rule did. The interviewer's real question is whether you can say which of the two you would reach for during a breaking-news hour, and whether you know what you have given up by reaching for it.

  • Why is a boost the exception among the edits in this layer?
    Because the others change selection and it changes the number. De-duplication, quotas and suppressions decide which scored candidates occupy slots while leaving every score as the ranker produced it; a boost multiplies the score itself, so anything that later reads that value reads a rule's output rather than the model's.
  • What stops a temporary recency boost from becoming permanent?
    An expiry date on the rule record, enforced by the layer rather than by memory. Without it the multiplier introduced for one event outlives the event, and nobody can tell later whether the slate's freshness comes from the model or from a lever somebody pulled months ago and never returned.

saying these in an interview costs you the question

  • Claims the boost and the feature are interchangeable implementations
  • Applies an unbounded multiplier that can dominate the ranker's score
  • Adds a boost when age is already an input and expects one effect
  • Assumes an offline replay of the ranker's scores shows the boost
  • Leaves an event-driven boost in place with no expiry