š…š«šØš¦ šš«šØš­šØš­š²š©šž š­šØ šš«šØšš®šœš­š¢ļæ½...
# show-and-tell
j
š…š«šØš¦ šš«šØš­šØš­š²š©šž š­šØ šš«šØšš®šœš­š¢šØš§: š‘šžššš„-š“š¢š¦šž šš«šØšš®šœš­ š‘šžšœšØš¦š¦šžš§šššš­š¢šØš§ š°š¢š­š” š‚šØš§š­šžš±š­š®ššš„ šššš§šš¢š­š¬ 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/
šŸ‘ 3
šŸ‘šŸ» 1