Back to case studies
Social / UGCWhat to show

Feed Engine for a Social Polling Product

Phased rollout from recency-first launch to an hourly vector similarity feed engine with configurable interest/exploration mixes.

SIGNALS & CONTENTUGC + polls (text /image / video)Multimodal → textsurrogatesPhase 1: recency +full event logsEngagement on surfaceditemsFEED ENGINEHugging Face embedding stackNormalised, versioned vectorsFeed stores + hourly similarityCandidate pools refreshed oncadenceInterest inference + mixturepolicye.g. 70% interest / 30% exploreOUTPUTPhased personalisationTest-cohort routingPolicy A/B on dwell &pollsScaled production feed

The challenge

Time-to-market required deferring the full ML feed — but the architecture had to capture the right data first, then graduate from pure recency to hourly vector refresh, feed stores, and tunable exploration.

Every surface — comments, posts, poll options — needed a comparable representation for similarity and ranking, including non-text assets. Off-the-shelf feeds would not encode poll semantics or cross-modal content consistently. Building everything before launch would miss the learning window: without structured events and labels from real usage, models would be speculative. The product hypothesis also required experimentation: fixed ratios of personalised versus random (or diverse) injection to find engagement sweet spots, and a way to iterate quickly with a test audience without risking the main user base.

The system

Decision system built

We encoded all user-generated and poll artefacts into a text-aligned embedding space using Hugging Face model families, extended with transformation pipelines so images and video contribute through text surrogates (captions, OCR, frame-derived descriptions, or unified projection layers) — whatever matched latency and quality constraints per phase. Phase one optimised for speed to market: ship with 100% recency while instrumenting collection. Phase two introduced the feed engine: precomputed feed stores built from interest inference, hourly vector-similarity jobs to refresh candidate pools, and weight updates tied to observed engagement on surfaced content. The engine exposed policy knobs (e.g. 70% interest-weighted retrieval, 30% random or diversity slots) and could target a test cohort for faster iteration before promoting a winning strategy.

System components

01

Unified encoding pipeline: comments, posts, and poll options embedded via Hugging Face models with consistent normalisation and versioning

02

Multimodal-to-text transforms: routes for image and video that produce text-compatible representations for the same embedding stack

03

Phase 1 — recency-only feed with full behavioural and content event logging to build training and evaluation datasets

04

Feed engine core: materialised feed stores per user or segment, rebuilt or patched on a defined cadence

05

Hourly vector similarity job: neighbour search over content and behaviour-derived vectors to populate and refresh store candidates

06

Interest inference layer: maps engagement signals to updated per-user or per-session weights that shift what the store emphasises

07

Mixture policies: configurable splits (e.g. 70% inferred interest, 30% random / exploration / cold-start) for product and data science experimentation

08

Test-cohort routing: feed engine instances or policy flags so algorithms run against a bounded audience before production-wide rollout

09

Measurement hooks: compare policies on engagement, dwell, and poll participation without conflating test and control traffic

How we worked

01

Engagement scope

Encoding and multimodal transformation design, phased roadmap (recency → feed engine), feed store architecture, hourly similarity jobs, interest inference and weight updates, experimentation framework including cohort targeting and mixture policies.

02

Timeline

Phase 1: ship with recency and instrumentation. Phase 2: feed engine live with hourly vector passes and initial policies. Phase 3: expand experiment matrix and promote winning mixes from test cohorts to full traffic.

03

Operating model

Product and ML jointly owned policy parameters (mix ratios, cohort flags, refresh cadence); clear separation between data collection quality in phase 1 and serving SLOs in phase 2; winner promotion gated on pre-agreed engagement metrics.

Outcomes

Business impact & measurable results

Phased rollout from recency-first launch to an hourly vector similarity feed engine with configurable interest/exploration mixes.

01

Faster launch: users saw a coherent product immediately while the team captured the data required for serious personalisation

02

Single vector space for text and transformed visual content enabled consistent similarity for polls and posts in one ranking framework

03

Hourly refresh balanced freshness of trends with manageable compute — avoiding naive per-request full-graph search at scale

04

Feed stores made serving predictable and made it practical to A/B mixture strategies (interest vs exploration) with clear winner selection

05

Test-crowd mode reduced risk and cycle time when trying new inference or mix rules before committing the main feed

Governance

Trust, collaboration & governance

01

Model and embedding versions pinned and auditable — Hugging Face artefacts tracked for reproducibility

02

Test-cohort traffic explicitly isolated in configuration and metrics to avoid skewing global reporting

03

Multimodal surrogates for images/video reviewed for failure modes (bad captions, sensitive content) with human review paths where required

04

Exploration slots documented so stakeholders understand why users sometimes see non-personalised items

Reframe

Not a big-bang recommender on launch day — earn the data first, then let the feed engine decide.

Across every engagement, the goal is the same: engineer a system that makes better decisions — faster, more consistently, and at scale — than the process it replaces.

Start a discovery

Most engagements begin with a conversation about context.

We do not send a proposal before we understand the problem. Start by telling us about your decision context — we will identify the highest-leverage intervention areas before any scope is agreed.