š
š«šØš¦ šš«šØššØšš²š©š ššØ šš«šØšš®ššš¢šØš§: šššš„-šš¢š¦š šš«šØšš®šš ššššØš¦š¦šš§šššš¢šØš§ š°š¢šš” ššØš§ššš±šš®šš„ ššš§šš¢šš¬
I have just published a two-part deep dive on building an end-to-end online product recommender, from experimental validation to a production-ready event-driven system.
Many contextual bandit resources focus on the algorithm in isolation. Very few walk through the full journey: data generation, offline evaluation, live simulation, and streaming production architecture.
This series aims to close that gap.
ā¾ā¾ā¾
šš«šØššØšš²š©š¢š§š šš§ šš§š„š¢š§š šš«šØšš®šš ššššØš¦š¦šš§ššš« š¢š§ šš²šš”šØš§
Part 1 focuses on developing a contextual bandit based recommender end to end.
It covers:
⢠Synthetic data generation
⢠Feature engineering for user and product interactions
⢠Offline policy evaluation
⢠Live feedback simulation
⢠Prototyping using MABRec and MABWiser
The goal was to design and evaluate a complete contextual bandit workflow and select the algorithm based on offline policy evaluation results. LinUCB was chosen because it performed best under the simulated environment.
While libraries like Vowpal Wabbit and River are powerful, I could not find a fully worked example showing the entire loop in one coherent flow, from dataset design to evaluation to online simulation.
ā¾ā¾ā¾
šš«šØšš®ššš¢šØš§š¢š³š¢š§š šš§ šš§š„š¢š§š šš«šØšš®šš ššššØš¦š¦šš§ššš« šš¬š¢š§š ššÆšš§š šš«š¢šÆšš§ šš«šš”š¢ššššš®š«š
Part 2 moves beyond the prototype and focuses on system architecture.
Key improvements:
⢠Refactored the system into an event-driven architecture built on šššš¤š and š
š„š¢š§š¤
⢠Built the event pipeline on Kafka for real-time ingestion of user feedback
⢠Managed stateful online model training in Flink
⢠Published updated model parameters to Redis for low-latency inference
⢠Removed Python dependency from both model training and recommendation serving paths
The result is a real-time contextual bandit system where:
⢠Model state is managed in the stream processor
⢠Parameters are updated incrementally
⢠Serving remains lightweight and low latency
⢠Training and inference are clearly separated
This project demonstrates how to move from experimentation to a production-grade online machine learning system by designing both the algorithm and the surrounding architecture properly.
If you are interested in contextual bandits, online learning systems, event-driven architecture, or streaming ML engineering, I would appreciate your thoughts and feedback.
Part 1 -
https://jaehyeon.me/blog/2026-01-29-prototype-recommender-with-python/
Part 2 -
https://jaehyeon.me/blog/2026-02-23-productionize-recommender-with-eda/