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.
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
Unified encoding pipeline: comments, posts, and poll options embedded via Hugging Face models with consistent normalisation and versioning
Multimodal-to-text transforms: routes for image and video that produce text-compatible representations for the same embedding stack
Phase 1 — recency-only feed with full behavioural and content event logging to build training and evaluation datasets
Feed engine core: materialised feed stores per user or segment, rebuilt or patched on a defined cadence
Hourly vector similarity job: neighbour search over content and behaviour-derived vectors to populate and refresh store candidates
Interest inference layer: maps engagement signals to updated per-user or per-session weights that shift what the store emphasises
Mixture policies: configurable splits (e.g. 70% inferred interest, 30% random / exploration / cold-start) for product and data science experimentation
Test-cohort routing: feed engine instances or policy flags so algorithms run against a bounded audience before production-wide rollout
Measurement hooks: compare policies on engagement, dwell, and poll participation without conflating test and control traffic
How we worked
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.
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.
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.
Faster launch: users saw a coherent product immediately while the team captured the data required for serious personalisation
Single vector space for text and transformed visual content enabled consistent similarity for polls and posts in one ranking framework
Hourly refresh balanced freshness of trends with manageable compute — avoiding naive per-request full-graph search at scale
Feed stores made serving predictable and made it practical to A/B mixture strategies (interest vs exploration) with clear winner selection
Test-crowd mode reduced risk and cycle time when trying new inference or mix rules before committing the main feed
Governance
Trust, collaboration & governance
Model and embedding versions pinned and auditable — Hugging Face artefacts tracked for reproducibility
Test-cohort traffic explicitly isolated in configuration and metrics to avoid skewing global reporting
Multimodal surrogates for images/video reviewed for failure modes (bad captions, sensitive content) with human review paths where required
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.